|
@@ -335,7 +335,7 @@
Sales total(Revenue)
|
- [[ formatLang(getsalestotal2(data['form'],user), dp='Sale Price') ]] [[ company.currency_id.symbol ]]
+ [[ formatLang(getsalestotal2(data['form']), dp='Sale Price') ]] [[ company.currency_id.symbol ]]
|
@@ -343,7 +343,7 @@
Qty of product
|
- [[ formatLang(getqtytotal2(data['form'],user)) ]]
+ [[ formatLang(getqtytotal2(data['form'])) ]]
|
@@ -351,7 +351,7 @@
Total invoiced
|
- [[ formatLang(getsuminvoice2(data['form'],user), dp='Sale Price') ]] [[ company.currency_id.symbol ]]
+ [[ formatLang(getsuminvoice2(data['form']), dp='Sale Price') ]] [[ company.currency_id.symbol ]]
|
@@ -359,7 +359,7 @@
Total discount
|
- [[ formatLang(getsumdisc(data['form'],user), dp='Sale Price') ]] [[ company.currency_id.symbol ]]
+ [[ formatLang(getsumdisc(data['form']), dp='Sale Price') ]] [[ company.currency_id.symbol ]]
|
@@ -367,7 +367,7 @@
Total paid
|
- [[ formatLang(getpaidtotal2(data['form'],user), dp='Sale Price') ]] [[ company.currency_id.symbol ]]
+ [[ formatLang(getpaidtotal2(data['form']), dp='Sale Price') ]] [[ company.currency_id.symbol ]]
|
diff --git a/addons/point_of_sale/test/point_of_sale_report.yml b/addons/point_of_sale/test/point_of_sale_report.yml
index b821dc899df..5ff8a143384 100644
--- a/addons/point_of_sale/test/point_of_sale_report.yml
+++ b/addons/point_of_sale/test/point_of_sale_report.yml
@@ -70,7 +70,7 @@
import time
ctx={}
ctx.update({'model': 'ir.ui.menu','active_ids': []})
- data_dict = {'date_start': time.strftime('%Y-%m-%d'), 'date_end': time.strftime('%Y-%m-%d')}
+ data_dict = {'date_start': time.strftime('%Y-%m-%d'), 'date_end': time.strftime('%Y-%m-%d'), 'user_ids': [(6,0,[ref('base.user_root')])]}
from tools import test_reports
test_reports.try_report_action(cr, uid, 'action_report_pos_details',wiz_data=data_dict, context=ctx, our_module='point_of_sale')
@@ -93,7 +93,7 @@
journal_id: account_journal_cash0
line_ids:
- name: statement
- date: !eval "(datetime.now() + timedelta(5*31)).strftime('%Y-%m-%d')"
+ date: !eval "(datetime.now() + timedelta(5*31)).strftime('%Y-%m-%d')"
type: customer
account_id: account_pos_account_sales
amount: 100
diff --git a/addons/point_of_sale/wizard/pos_details.py b/addons/point_of_sale/wizard/pos_details.py
index c6793b7b437..acf7738dbfe 100644
--- a/addons/point_of_sale/wizard/pos_details.py
+++ b/addons/point_of_sale/wizard/pos_details.py
@@ -29,7 +29,8 @@ class pos_details(osv.osv_memory):
_columns = {
'date_start': fields.date('Date Start', required=True),
- 'date_end': fields.date('Date End', required=True)
+ 'date_end': fields.date('Date End', required=True),
+ 'user_ids': fields.many2many('res.users', 'sale_user_rel', 'user_id', 'uid', 'Salesman'),
}
_defaults = {
'date_start': lambda *a: time.strftime('%Y-%m-%d'),
@@ -48,7 +49,7 @@ class pos_details(osv.osv_memory):
if context is None:
context = {}
datas = {'ids': context.get('active_ids', [])}
- res = self.read(cr, uid, ids, ['date_start', 'date_end'], context=context)
+ res = self.read(cr, uid, ids, ['date_start', 'date_end', 'user_ids'], context=context)
res = res and res[0] or {}
datas['form'] = res
if res.get('id',False):
diff --git a/addons/point_of_sale/wizard/pos_details.xml b/addons/point_of_sale/wizard/pos_details.xml
index f283139b058..0b70b3ae2eb 100644
--- a/addons/point_of_sale/wizard/pos_details.xml
+++ b/addons/point_of_sale/wizard/pos_details.xml
@@ -1,23 +1,29 @@
-
+
-
+
POS Details
pos.details
form
-
@@ -32,6 +38,6 @@
new
-
+
-
\ No newline at end of file
+
\ No newline at end of file
From 6337070b9a0f68a61c22aafb6de6af429ecf2aa2 Mon Sep 17 00:00:00 2001
From: "Ujjvala Collins (OpenERP)"
Date: Tue, 1 Nov 2011 11:09:30 +0530
Subject: [PATCH 013/224] [FIX] point_of_sale: Fixed report error and yaml.
bzr revid: uco@tinyerp.com-20111101053930-58z2xraetj25i9e0
---
.../test/point_of_sale_report.yml | 50 -------------------
addons/point_of_sale/wizard/pos_details.py | 2 +-
2 files changed, 1 insertion(+), 51 deletions(-)
diff --git a/addons/point_of_sale/test/point_of_sale_report.yml b/addons/point_of_sale/test/point_of_sale_report.yml
index 1b38f6fbff8..e7a3026c66d 100644
--- a/addons/point_of_sale/test/point_of_sale_report.yml
+++ b/addons/point_of_sale/test/point_of_sale_report.yml
@@ -61,56 +61,6 @@
from tools import test_reports
test_reports.try_report_action(cr, uid, 'action_report_pos_details',wiz_data=data_dict, context=ctx, our_module='point_of_sale')
--
- I create a cash journal.
--
- !record {model: account.journal, id: account_journal_cash0}:
- name: 'Cash Journal'
- code: 'CSJ'
- type: 'cash'
- view_id: account.account_journal_bank_view
- sequence_id: account.sequence_journal
--
- I create a record for Bank Statement.
--
- !record {model: account.bank.statement, id: account_bank_statement_st0}:
- name: St.05/19
- balance_end_real: 0.0
- date: !eval time.strftime('%Y-%m-%d')
- journal_id: account_journal_cash0
- line_ids:
- - name: statement
- date: !eval "(datetime.now() + timedelta(5*31)).strftime('%Y-%m-%d')"
- type: customer
- account_id: account_pos_account_sales
- amount: 100
- partner_id: base.res_partner_agrolait
- period_id: account.period_5
- state: 'draft'
--
- In order to test the PDF reports defined on a Point Of Sale, we will print a Account Statement Report
--
- !python {model: account.bank.statement}: |
- import netsvc, tools, os, time
- (data, format) = netsvc.LocalService('report.account.statement').create(cr, uid, [ref('point_of_sale.account_bank_statement_st0')], {}, {})
- if tools.config['test_report_directory']:
- file(os.path.join(tools.config['test_report_directory'], 'point_of_sale-account_statement_report'+format), 'wb+').write(data)
--
- In order to test the PDF reports defined on a Point Of Sale, we will print a POS User Product Report
--
- !python {model: account.bank.statement}: |
- import netsvc, tools, os, time
- (data, format) = netsvc.LocalService('report.pos.user.product').create(cr, uid, [ref('point_of_sale.account_bank_statement_st0')], {}, {})
- if tools.config['test_report_directory']:
- file(os.path.join(tools.config['test_report_directory'], 'point_of_sale-user_product_report'+format), 'wb+').write(data)
--
- In order to test the PDF reports defined on a Point Of Sale, we will print a POS All Close Cashbox Of the Day Report
--
- !python {model: account.bank.statement}: |
- import netsvc, tools, os, time
- (data, format) = netsvc.LocalService('report.all.closed.cashbox.of.the.day').create(cr, uid, [ref('point_of_sale.account_bank_statement_st0')], {}, {})
- if tools.config['test_report_directory']:
- file(os.path.join(tools.config['test_report_directory'], 'point_of_sale-all_closed_cash_box_of_the_day_report'+format), 'wb+').write(data)
-
In order to test the PDF reports defined on a Point of Sale, we will print a POS Sales User Report
-
diff --git a/addons/point_of_sale/wizard/pos_details.py b/addons/point_of_sale/wizard/pos_details.py
index acf7738dbfe..7283ee5fa6c 100644
--- a/addons/point_of_sale/wizard/pos_details.py
+++ b/addons/point_of_sale/wizard/pos_details.py
@@ -30,7 +30,7 @@ class pos_details(osv.osv_memory):
_columns = {
'date_start': fields.date('Date Start', required=True),
'date_end': fields.date('Date End', required=True),
- 'user_ids': fields.many2many('res.users', 'sale_user_rel', 'user_id', 'uid', 'Salesman'),
+ 'user_ids': fields.many2many('res.users', 'sale_user_rel_details', 'user_id', 'uid', 'Salesman'),
}
_defaults = {
'date_start': lambda *a: time.strftime('%Y-%m-%d'),
From 97a1b3700fe4ee54b28f331bb9c607dc47bbbc9d Mon Sep 17 00:00:00 2001
From: "Ujjvala Collins (OpenERP)"
Date: Thu, 3 Nov 2011 18:57:46 +0530
Subject: [PATCH 014/224] [IMP] point_of_sale: Improved Sale Details report.
bzr revid: uco@tinyerp.com-20111103132746-btmzuqwwyihloubn
---
addons/point_of_sale/report/pos_details.py | 23 ++++++++++++++-------
addons/point_of_sale/report/pos_details.rml | 18 ++++++++++++++--
2 files changed, 32 insertions(+), 9 deletions(-)
diff --git a/addons/point_of_sale/report/pos_details.py b/addons/point_of_sale/report/pos_details.py
index 15bd5df5f2d..39989a7e45b 100644
--- a/addons/point_of_sale/report/pos_details.py
+++ b/addons/point_of_sale/report/pos_details.py
@@ -33,9 +33,13 @@ class pos_details(report_sxw.rml_parse):
else:
return ''
+ def _get_all_users(self):
+ user_obj = self.pool.get('res.users')
+ return user_obj.search(self.cr, self.uid, [])
+
def _pos_sales_details(self,form):
data = {}
- user_ids = form['user_ids'] or [self.uid]
+ user_ids = form['user_ids'] or self._get_all_users()
self.cr.execute ("select po.name as pos_name,po.date_order,pt.name, pp.default_code as code,pol.qty,pu.name as uom,pol.price_unit,pol.discount,po.invoice_id,sum((pol.price_unit * pol.qty * (1 - (pol.discount) / 100.0))) as Total " \
"from pos_order as po,pos_order_line as pol,product_product as pp,product_template as pt,product_uom as pu,res_users as ru,res_company as rc " \
"where pt.id=pp.product_tmpl_id and pu.id=pt.uom_id and pp.id=pol.product_id and po.id = pol.order_id and po.state IN ('done','paid','invoiced') " \
@@ -54,7 +58,7 @@ class pos_details(report_sxw.rml_parse):
def _get_qty_total_2(self, form):
qty=[]
- user_ids = form['user_ids'] or [self.uid]
+ user_ids = form['user_ids'] or self._get_all_users()
self.cr.execute("select sum(pol.qty) as qty " \
"from pos_order as po,pos_order_line as pol,product_product as pp,product_template as pt,res_users as ru,res_company as rc " \
"where pt.id=pp.product_tmpl_id and pp.id=pol.product_id and po.id = pol.order_id and po.state IN ('done','paid','invoiced') " \
@@ -75,7 +79,7 @@ class pos_details(report_sxw.rml_parse):
def _get_sum_invoice_2(self,form):
res2=[]
- user_ids = form['user_ids'] or [self.uid]
+ user_ids = form['user_ids'] or self._get_all_users()
self.cr.execute ("select sum(pol.price_unit * pol.qty * (1 - (pol.discount) / 100.0))" \
"from pos_order as po,pos_order_line as pol,product_product as pp,product_template as pt, res_users as ru,res_company as rc,account_invoice as ai " \
"where pt.id=pp.product_tmpl_id and pp.id=pol.product_id and po.id = pol.order_id and ai.id=po.invoice_id " \
@@ -88,7 +92,7 @@ class pos_details(report_sxw.rml_parse):
def _paid_total_2(self,form):
res3=[]
- user_ids = form['user_ids'] or [self.uid]
+ user_ids = form['user_ids'] or self._get_all_users()
self.cr.execute ("select sum(pol.price_unit * pol.qty * (1 - (pol.discount) / 100.0))" \
"from pos_order as po,pos_order_line as pol,product_product as pp,product_template as pt, res_users as ru,res_company as rc " \
"where pt.id=pp.product_tmpl_id and pp.id=pol.product_id and po.id = pol.order_id and po.state IN ('paid','invoiced','done') " \
@@ -101,7 +105,7 @@ class pos_details(report_sxw.rml_parse):
def _get_sum_dis_2(self,form):
res4=[]
- user_ids = form['user_ids'] or [self.uid]
+ user_ids = form['user_ids'] or self._get_all_users()
self.cr.execute ("select sum(pol.qty)" \
"from pos_order as po,pos_order_line as pol,product_product as pp,product_template as pt, res_users as ru,res_company as rc " \
"where pt.id=pp.product_tmpl_id and pp.id=pol.product_id and po.id = pol.order_id and po.state IN ('paid') " \
@@ -126,7 +130,7 @@ class pos_details(report_sxw.rml_parse):
def _get_payments(self, form):
statement_line_obj = self.pool.get("account.bank.statement.line")
pos_order_obj = self.pool.get("pos.order")
- user_ids = form['user_ids'] or [self.uid]
+ user_ids = form['user_ids'] or self._get_all_users()
pos_ids=pos_order_obj.search(self.cr, self.uid, [('date_order','>=',form['date_start'] + ' 00:00:00'),('date_order','<=',form['date_end'] + ' 23:59:59'),('state','in',['paid','invoiced','done']),('user_id','in',user_ids)])
data={}
if pos_ids:
@@ -175,7 +179,7 @@ class pos_details(report_sxw.rml_parse):
temp={}
list_ids = []
temp2 = 0.0
- user_ids = form['user_ids'] or [self.uid]
+ user_ids = form['user_ids'] or self._get_all_users()
pos_order_obj = self.pool.get("pos.order")
pos_ids = pos_order_obj.search(self.cr, self.uid, [('date_order','>=',form['date_start'] + ' 00:00:00'),('date_order','<=',form['date_end'] + ' 23:59:59'),('state','in',['paid','invoiced','done']),('user_id','in',user_ids)])
temp.update({'name':''})
@@ -196,6 +200,10 @@ class pos_details(report_sxw.rml_parse):
def _get_period2(self,form):
return form['date_end']
+ def _get_user_names(self, user_ids):
+ user_obj = self.pool.get('res.users')
+ return ', '.join(map(lambda x: x.name, user_obj.browse(self.cr, self.uid, user_ids)))
+
def __init__(self, cr, uid, name, context):
super(pos_details, self).__init__(cr, uid, name, context=context)
self.total = 0.0
@@ -218,6 +226,7 @@ class pos_details(report_sxw.rml_parse):
'getsuminvoice2':self._get_sum_invoice_2,
'getpaidtotal2': self._paid_total_2,
'getinvoice':self._get_invoice,
+ 'get_user_names': self._get_user_names,
})
report_sxw.report_sxw('report.pos.details', 'pos.order', 'addons/point_of_sale_singer/report/pos_details.rml', parser=pos_details, header='internal')
diff --git a/addons/point_of_sale/report/pos_details.rml b/addons/point_of_sale/report/pos_details.rml
index fa97bea108c..1a7e1271d53 100644
--- a/addons/point_of_sale/report/pos_details.rml
+++ b/addons/point_of_sale/report/pos_details.rml
@@ -26,6 +26,10 @@
+
+
+
+
@@ -43,6 +47,10 @@
+
+
+
+
@@ -164,11 +172,14 @@
-
+
|
Company
|
+
+ Users
+ |
Print Date
|
@@ -180,11 +191,14 @@
-
+
|
[[ company.name ]]
|
+
+ [[ get_user_names(data['form']['user_ids']) or 'All' ]]
+ |
[[ formatLang(time.strftime('%Y-%m-%d'),date=True) ]]
|
From 225506f49c1aa25b5106f03fa827dec70863ea02 Mon Sep 17 00:00:00 2001
From: "Ujjvala Collins (OpenERP)"
Date: Wed, 9 Nov 2011 11:05:00 +0530
Subject: [PATCH 015/224] [IMP] point_of_sale: Improved summary of report to
print for selected users only.
bzr revid: uco@tinyerp.com-20111109053500-dhtse9r4k0zw6k5u
---
addons/point_of_sale/report/pos_details.py | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/addons/point_of_sale/report/pos_details.py b/addons/point_of_sale/report/pos_details.py
index 39989a7e45b..2ed70062f97 100644
--- a/addons/point_of_sale/report/pos_details.py
+++ b/addons/point_of_sale/report/pos_details.py
@@ -69,11 +69,13 @@ class pos_details(report_sxw.rml_parse):
return qty[0] or 0.00
def _get_sales_total_2(self, form):
+ user_ids = form['user_ids'] or self._get_all_users()
self.cr.execute("select sum((pol.price_unit * pol.qty * (1 - (pol.discount) / 100.0))) as Total " \
"from pos_order_line as pol, pos_order po, product_product as pp,product_template as pt " \
- " where po.id=pol.order_id and to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::date >= '%s' " \
- " and to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::date <= '%s' and po.state IN ('paid','invoiced','done') " \
- " and pt.id=pp.product_tmpl_id and pol.product_id=pp.id"% (form['date_start'],form['date_end']))
+ " where po.id=pol.order_id and to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::date >= %s " \
+ " and to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::date <= %s and po.state IN ('paid','invoiced','done') " \
+ " and pt.id=pp.product_tmpl_id and pol.product_id=pp.id and po.user_id in %s"\
+ , (form['date_start'], form['date_end'], tuple(user_ids)))
res2=self.cr.fetchone()
return res2 and res2[0] or 0.0
From 61ab55484140be89875874e8e05926a700bd0e74 Mon Sep 17 00:00:00 2001
From: "Ujjvala Collins (OpenERP)"
Date: Wed, 9 Nov 2011 12:23:13 +0530
Subject: [PATCH 016/224] [FIX] point_of_sale: Fixed sale details report.
bzr revid: uco@tinyerp.com-20111109065313-a427exhw53y0500c
---
addons/point_of_sale/report/pos_details.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/addons/point_of_sale/report/pos_details.py b/addons/point_of_sale/report/pos_details.py
index 2ed70062f97..c0289c11ff8 100644
--- a/addons/point_of_sale/report/pos_details.py
+++ b/addons/point_of_sale/report/pos_details.py
@@ -108,9 +108,9 @@ class pos_details(report_sxw.rml_parse):
def _get_sum_dis_2(self,form):
res4=[]
user_ids = form['user_ids'] or self._get_all_users()
- self.cr.execute ("select sum(pol.qty)" \
+ self.cr.execute ("select sum(pol.discount)" \
"from pos_order as po,pos_order_line as pol,product_product as pp,product_template as pt, res_users as ru,res_company as rc " \
- "where pt.id=pp.product_tmpl_id and pp.id=pol.product_id and po.id = pol.order_id and po.state IN ('paid') " \
+ "where pt.id=pp.product_tmpl_id and pp.id=pol.product_id and po.id = pol.order_id and po.state IN ('paid','done','invoiced') " \
"and to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::date >= %s and to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::date <= %s " \
"and po.user_id = ru.id and rc.id = po.company_id and ru.id IN %s " \
,(form['date_start'],form['date_end'],tuple(user_ids)))
From 4e26a9025d7f380eb4cddccf927703e6572f5395 Mon Sep 17 00:00:00 2001
From: "ron@tinyerp.com" <>
Date: Thu, 10 Nov 2011 11:46:39 +0530
Subject: [PATCH 017/224] [IMP] stock: Refectoring whole code after merged with
addons
bzr revid: ron@tinyerp.com-20111110061639-urd36emcw2gl6ne2
---
addons/stock/stock.py | 11 +++----
addons/stock/wizard/stock_partial_picking.py | 32 ++++++++++++++++++-
.../wizard/stock_partial_picking_view.xml | 6 ++--
3 files changed, 39 insertions(+), 10 deletions(-)
diff --git a/addons/stock/stock.py b/addons/stock/stock.py
index 576c23366fa..0f1e47ec17a 100644
--- a/addons/stock/stock.py
+++ b/addons/stock/stock.py
@@ -1168,7 +1168,7 @@ class stock_picking(osv.osv):
for pick in self.browse(cr, uid, ids, context=context):
new_picking = None
complete, too_few = [], []
- move_product_qty,prodlot_ids, product_uoms, product_avail, partial_qty = {}, {}, {}, {}, {}
+ move_product_qty, prodlot_ids, product_avail, partial_qty, product_uoms = {},{}, {},{},{}
for move in pick.move_lines:
if move.state in ('done', 'cancel'):
continue
@@ -1221,8 +1221,6 @@ class stock_picking(osv.osv):
for move in too_few:
- if move.product_qty < partial_qty[move.id]:
- raise osv.except_osv(_('Error !'), _('You cannot select Quantity %s more then Picking Quantity %s.') % (partial_qty[move.id],move.product_qty,))
product_qty = move_product_qty[move.id]
if not new_picking:
new_picking = self.copy(cr, uid, pick.id,
@@ -1239,7 +1237,7 @@ class stock_picking(osv.osv):
'state': 'assigned',
'move_dest_id': False,
'price_unit': move.price_unit,
- 'product_uom':product_uoms[move.id],
+ 'product_uom':product_uoms[move.id]
}
prodlot_id = prodlot_ids[move.id]
if prodlot_id:
@@ -1254,11 +1252,10 @@ class stock_picking(osv.osv):
if new_picking:
move_obj.write(cr, uid, [c.id for c in complete], {'picking_id': new_picking})
for move in complete:
- product_qty = move_product_qty[move.id]
- defaults = {'product_uom': product_uoms[move.id],'product_qty': product_qty}
+ defaults = {'product_uom': product_uoms[move.id],'product_qty': move_product_qty[move.id]}
if prodlot_ids.get(move.id):
defaults.update({'prodlot_id': prodlot_ids[move.id]})
- move_obj.write(cr, uid, move.id, defaults)
+ move_obj.write(cr, uid, [move.id], defaults)
# At first we confirm the new picking (if necessary)
if new_picking:
diff --git a/addons/stock/wizard/stock_partial_picking.py b/addons/stock/wizard/stock_partial_picking.py
index d617ea2b5da..8b71e6502eb 100644
--- a/addons/stock/wizard/stock_partial_picking.py
+++ b/addons/stock/wizard/stock_partial_picking.py
@@ -22,12 +22,25 @@
import time
from osv import fields, osv
from tools.misc import DEFAULT_SERVER_DATETIME_FORMAT
+from tools.translate import _
class stock_partial_picking_line(osv.TransientModel):
+
+ def _tracking(self, cursor, user, ids, name, arg, context=None):
+ res = {}
+ for tracklot in self.browse(cursor, user, ids, context=context):
+ tracking = False
+ if (tracklot.move_id.picking_id.type == 'in' and tracklot.product_id.track_incoming == True) or \
+ (tracklot.move_id.picking_id.type == 'out' and tracklot.product_id.track_outgoing == True):
+ tracking = True
+ res[tracklot.id] = tracking
+ return res
+
+
_name = "stock.partial.picking.line"
_rec_name = 'product_id'
_columns = {
- 'product_id' : fields.many2one('product.product', string="Product", required=True, ondelete='CASCADE'),
+ 'product_id' : fields.many2one('product.product', string="Product", required=True, readonly=True, ondelete='CASCADE'),
'quantity' : fields.float("Quantity", required=True),
'product_uom': fields.many2one('product.uom', 'Unit of Measure', required=True, ondelete='CASCADE'),
'prodlot_id' : fields.many2one('stock.production.lot', 'Production Lot', ondelete='CASCADE'),
@@ -38,6 +51,7 @@ class stock_partial_picking_line(osv.TransientModel):
'update_cost': fields.boolean('Need cost update'),
'cost' : fields.float("Cost", help="Unit Cost for this product line"),
'currency' : fields.many2one('res.currency', string="Currency", help="Currency in which Unit cost is expressed", ondelete='CASCADE'),
+ 'tracking': fields.function(_tracking, method=True, string='Tracking', type='boolean'),
}
class stock_partial_picking(osv.osv_memory):
@@ -103,13 +117,29 @@ class stock_partial_picking(osv.osv_memory):
assert len(ids) == 1, 'Partial picking processing may only be done one at a time'
stock_picking = self.pool.get('stock.picking')
stock_move = self.pool.get('stock.move')
+ uom_obj = self.pool.get('product.uom')
partial = self.browse(cr, uid, ids[0], context=context)
partial_data = {
'delivery_date' : partial.date
}
picking_type = partial.picking_id.type
for move in partial.move_ids:
+ move_uom = move.move_id.product_uom
+ process_uom = move.product_uom
move_id = move.move_id.id
+
+ #Quantiny must be Positive
+ if move.quantity <= 0:
+ raise osv.except_osv(_('Warning!'), _('Please provide Proper Quantity !'))
+ #Pikcing move product UOM factor must be bigger with respective wizard move product uom factor
+ if move_uom.factor < process_uom.factor:
+ raise osv.except_osv(_('Warning'), _('You can not process in UOM "%s" which is smaller than UOM "%s" of the current move.') % (process_uom.name, move_uom.name))
+ #Compute the wizard Quantity for respective move.
+ toprocess = uom_obj._compute_qty(cr, uid, process_uom.id, move.quantity, move_uom.id)
+ #Compare wizard Quantity with respective picking move quantity if wizard move quantity bigger then it's giving warning.
+ if toprocess > move.move_id.product_qty:
+ raise osv.except_osv(_('Warning'), _('You can not process "%s %s" as the qty is more than "%s %s" of respective move.') % (move.quantity, process_uom.name, move.move_id.product_qty, move_uom.name))
+
if not move_id:
seq_obj_name = 'stock.picking.' + picking_type
move_id = stock_move.create(cr,uid,{'name' : self.pool.get('ir.sequence').get(cr, uid, seq_obj_name),
diff --git a/addons/stock/wizard/stock_partial_picking_view.xml b/addons/stock/wizard/stock_partial_picking_view.xml
index be85d266673..396c53694e3 100644
--- a/addons/stock/wizard/stock_partial_picking_view.xml
+++ b/addons/stock/wizard/stock_partial_picking_view.xml
@@ -38,7 +38,8 @@
-
+
+
@@ -56,7 +57,8 @@
-
+
+
From cf97a4e213113dc9b69da3d14307c55380a1b05b Mon Sep 17 00:00:00 2001
From: "ron@tinyerp.com" <>
Date: Thu, 10 Nov 2011 12:04:50 +0530
Subject: [PATCH 018/224] [IMP] stock: Removed tracking field from
stock_partial_move_view.xml
bzr revid: ron@tinyerp.com-20111110063450-fq105wmuxd65b1iq
---
addons/stock/wizard/stock_partial_move_view.xml | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/addons/stock/wizard/stock_partial_move_view.xml b/addons/stock/wizard/stock_partial_move_view.xml
index 5e8e33e69fd..2df6adcc9e7 100644
--- a/addons/stock/wizard/stock_partial_move_view.xml
+++ b/addons/stock/wizard/stock_partial_move_view.xml
@@ -45,9 +45,8 @@
-
+
-
From 59a9f469dac55fa9ce9febc72f4f1632875e815e Mon Sep 17 00:00:00 2001
From: "ron@tinyerp.com" <>
Date: Thu, 10 Nov 2011 12:17:23 +0530
Subject: [PATCH 019/224] [IMP] Improved PEP standard
bzr revid: ron@tinyerp.com-20111110064723-phv553e5si9meyfb
---
addons/stock/stock.py | 8 ++++----
addons/stock/wizard/stock_partial_move.py | 1 -
2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/addons/stock/stock.py b/addons/stock/stock.py
index 0f1e47ec17a..e049fb5a84f 100644
--- a/addons/stock/stock.py
+++ b/addons/stock/stock.py
@@ -1168,7 +1168,7 @@ class stock_picking(osv.osv):
for pick in self.browse(cr, uid, ids, context=context):
new_picking = None
complete, too_few = [], []
- move_product_qty, prodlot_ids, product_avail, partial_qty, product_uoms = {},{}, {},{},{}
+ move_product_qty, prodlot_ids, product_avail, partial_qty, product_uoms = {}, {}, {}, {}, {}
for move in pick.move_lines:
if move.state in ('done', 'cancel'):
continue
@@ -1237,7 +1237,7 @@ class stock_picking(osv.osv):
'state': 'assigned',
'move_dest_id': False,
'price_unit': move.price_unit,
- 'product_uom':product_uoms[move.id]
+ 'product_uom': product_uoms[move.id]
}
prodlot_id = prodlot_ids[move.id]
if prodlot_id:
@@ -1246,13 +1246,13 @@ class stock_picking(osv.osv):
move_obj.write(cr, uid, [move.id],
{
'product_qty' : move.product_qty - partial_qty[move.id],
- 'product_uos_qty':move.product_qty - partial_qty[move.id], #TODO: put correct uos_qty
+ 'product_uos_qty': move.product_qty - partial_qty[move.id], #TODO: put correct uos_qty
})
if new_picking:
move_obj.write(cr, uid, [c.id for c in complete], {'picking_id': new_picking})
for move in complete:
- defaults = {'product_uom': product_uoms[move.id],'product_qty': move_product_qty[move.id]}
+ defaults = {'product_uom': product_uoms[move.id], 'product_qty': move_product_qty[move.id]}
if prodlot_ids.get(move.id):
defaults.update({'prodlot_id': prodlot_ids[move.id]})
move_obj.write(cr, uid, [move.id], defaults)
diff --git a/addons/stock/wizard/stock_partial_move.py b/addons/stock/wizard/stock_partial_move.py
index 453964a4895..ec348656ce0 100644
--- a/addons/stock/wizard/stock_partial_move.py
+++ b/addons/stock/wizard/stock_partial_move.py
@@ -23,7 +23,6 @@ from osv import fields, osv
from tools.misc import DEFAULT_SERVER_DATETIME_FORMAT
import time
-
class stock_partial_move_line(osv.osv_memory):
_inherit = "stock.partial.picking.line"
_name = "stock.partial.move.line"
From 372f610cc5841b744222c6a4b27b16317147d62d Mon Sep 17 00:00:00 2001
From: "Naresh (OpenERP)"
Date: Mon, 14 Nov 2011 17:05:35 +0530
Subject: [PATCH 020/224] [FIX]:increase the size of function field 64-->128
for long function names
lp bug: https://launchpad.net/bugs/885582 fixed
bzr revid: nch@tinyerp.com-20111114113535-heb33fyrsct2g1dv
---
openerp/addons/base/res/res_partner.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/openerp/addons/base/res/res_partner.py b/openerp/addons/base/res/res_partner.py
index b250269cb0e..3f1fc427aa8 100644
--- a/openerp/addons/base/res/res_partner.py
+++ b/openerp/addons/base/res/res_partner.py
@@ -282,7 +282,7 @@ class res_partner_address(osv.osv):
_columns = {
'partner_id': fields.many2one('res.partner', 'Partner Name', ondelete='set null', select=True, help="Keep empty for a private address, not related to partner."),
'type': fields.selection( [ ('default','Default'),('invoice','Invoice'), ('delivery','Delivery'), ('contact','Contact'), ('other','Other') ],'Address Type', help="Used to select automatically the right address according to the context in sales and purchases documents."),
- 'function': fields.char('Function', size=64),
+ 'function': fields.char('Function', size=128),
'title': fields.many2one('res.partner.title','Title'),
'name': fields.char('Contact Name', size=64, select=1),
'street': fields.char('Street', size=128),
From f3aa929bb0e7f26b86a5d4565c4caf173f8cf4ef Mon Sep 17 00:00:00 2001
From: "ron@tinyerp.com" <>
Date: Wed, 16 Nov 2011 18:02:51 +0530
Subject: [PATCH 021/224] [IMP, REF] stock: Removed constrain of uom factor
comparision and add warning on rounding uom quantity
bzr revid: ron@tinyerp.com-20111116123251-7b63br1570yapt0b
---
addons/stock/stock.py | 21 ++++++++++++++++++--
addons/stock/wizard/stock_partial_picking.py | 18 ++++++++++-------
2 files changed, 30 insertions(+), 9 deletions(-)
diff --git a/addons/stock/stock.py b/addons/stock/stock.py
index e049fb5a84f..90ed24cd362 100644
--- a/addons/stock/stock.py
+++ b/addons/stock/stock.py
@@ -1167,7 +1167,7 @@ class stock_picking(osv.osv):
wf_service = netsvc.LocalService("workflow")
for pick in self.browse(cr, uid, ids, context=context):
new_picking = None
- complete, too_few = [], []
+ complete, too_many, too_few = [], [], []
move_product_qty, prodlot_ids, product_avail, partial_qty, product_uoms = {}, {}, {}, {}, {}
for move in pick.move_lines:
if move.state in ('done', 'cancel'):
@@ -1184,8 +1184,11 @@ class stock_picking(osv.osv):
partial_qty[move.id] = uom_obj._compute_qty(cr, uid, product_uoms[move.id], product_qty, move.product_uom.id)
if move.product_qty == partial_qty[move.id]:
complete.append(move)
- else:
+ elif move.product_qty > partial_qty[move.id]:
too_few.append(move)
+ else:
+ too_many.append(move)
+
# Average price computation
if (pick.type == 'in') and (move.product_id.cost_method == 'average'):
product = product_obj.browse(cr, uid, move.product_id.id)
@@ -1247,6 +1250,7 @@ class stock_picking(osv.osv):
{
'product_qty' : move.product_qty - partial_qty[move.id],
'product_uos_qty': move.product_qty - partial_qty[move.id], #TODO: put correct uos_qty
+
})
if new_picking:
@@ -1256,6 +1260,19 @@ class stock_picking(osv.osv):
if prodlot_ids.get(move.id):
defaults.update({'prodlot_id': prodlot_ids[move.id]})
move_obj.write(cr, uid, [move.id], defaults)
+ for move in too_many:
+ product_qty = move_product_qty[move.id]
+ defaults = {
+ 'product_qty' : product_qty,
+ 'product_uos_qty': product_qty, #TODO: put correct uos_qty
+ 'product_uom': product_uoms[move.id]
+ }
+ prodlot_id = prodlot_ids.get(move.id)
+ if prodlot_ids.get(move.id):
+ defaults.update(prodlot_id=prodlot_id)
+ if new_picking:
+ defaults.update(picking_id=new_picking)
+ move_obj.write(cr, uid, [move.id], defaults)
# At first we confirm the new picking (if necessary)
if new_picking:
diff --git a/addons/stock/wizard/stock_partial_picking.py b/addons/stock/wizard/stock_partial_picking.py
index ef592282088..d72f582d6cc 100644
--- a/addons/stock/wizard/stock_partial_picking.py
+++ b/addons/stock/wizard/stock_partial_picking.py
@@ -129,16 +129,20 @@ class stock_partial_picking(osv.osv_memory):
move_id = move.move_id.id
#Quantiny must be Positive
- if move.quantity <= 0:
+ if move.quantity < 0:
raise osv.except_osv(_('Warning!'), _('Please provide Proper Quantity !'))
- #Pikcing move product UOM factor must be bigger with respective wizard move product uom factor
- if move_uom.factor < process_uom.factor:
- raise osv.except_osv(_('Warning'), _('You can not process in UOM "%s" which is smaller than UOM "%s" of the current move.') % (process_uom.name, move_uom.name))
+
#Compute the wizard Quantity for respective move.
toprocess = uom_obj._compute_qty(cr, uid, process_uom.id, move.quantity, move_uom.id)
- #Compare wizard Quantity with respective picking move quantity if wizard move quantity bigger then it's giving warning.
- if toprocess > move.move_id.product_qty:
- raise osv.except_osv(_('Warning'), _('You can not process "%s %s" as the qty is more than "%s %s" of respective move.') % (move.quantity, process_uom.name, move.move_id.product_qty, move_uom.name))
+
+ #Check rounding Quantity.ex.
+ #picking: 1kg, uom kg rounding = 0.01 (rounding to 10g),
+ #partial delivery: 253g
+ #=> result= refused, as the qty left on picking would be 0.747kg and only 0.75 is accepted by the uom.
+ if process_uom.factor and process_uom.factor <> 0 and move_uom.factor:
+ without_rounding_qty = (move.quantity / process_uom.factor) * move_uom.factor
+ if toprocess <> without_rounding_qty:
+ raise osv.except_osv(_('Warning'), _('Quantity left on picking would be "%s %s" but "%s %s" is accepted by the uom.') % (without_rounding_qty, process_uom.name, toprocess, process_uom.name))
if not move_id:
seq_obj_name = 'stock.picking.' + picking_type
From a757dfe57c1e1482cad38192e57595f754461863 Mon Sep 17 00:00:00 2001
From: "Ujjvala Collins (OpenERP)"
Date: Mon, 21 Nov 2011 16:25:13 +0530
Subject: [PATCH 022/224] [IMP] point_of_sale: Improved code for pos details
report. Removed unnecessary sql queries.
bzr revid: uco@tinyerp.com-20111121105513-2sqki5dzilvp7jao
---
addons/point_of_sale/report/pos_details.py | 142 ++++++++------------
addons/point_of_sale/report/pos_details.rml | 10 +-
2 files changed, 58 insertions(+), 94 deletions(-)
diff --git a/addons/point_of_sale/report/pos_details.py b/addons/point_of_sale/report/pos_details.py
index c0289c11ff8..48f43a78d99 100644
--- a/addons/point_of_sale/report/pos_details.py
+++ b/addons/point_of_sale/report/pos_details.py
@@ -38,85 +38,58 @@ class pos_details(report_sxw.rml_parse):
return user_obj.search(self.cr, self.uid, [])
def _pos_sales_details(self,form):
- data = {}
+ pos_obj = self.pool.get('pos.order')
+ user_obj = self.pool.get('res.users')
+ data = []
+ result = {}
user_ids = form['user_ids'] or self._get_all_users()
- self.cr.execute ("select po.name as pos_name,po.date_order,pt.name, pp.default_code as code,pol.qty,pu.name as uom,pol.price_unit,pol.discount,po.invoice_id,sum((pol.price_unit * pol.qty * (1 - (pol.discount) / 100.0))) as Total " \
- "from pos_order as po,pos_order_line as pol,product_product as pp,product_template as pt,product_uom as pu,res_users as ru,res_company as rc " \
- "where pt.id=pp.product_tmpl_id and pu.id=pt.uom_id and pp.id=pol.product_id and po.id = pol.order_id and po.state IN ('done','paid','invoiced') " \
- "and to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::date >= %s and to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::date <= %s " \
- "and po.user_id = ru.id and rc.id = po.company_id and ru.id IN %s " \
- "group by po.name,pol.qty,po.date_order,pt.name,pp.default_code,pu.name,pol.price_unit,pol.discount,po.invoice_id " \
- ,(form['date_start'],form['date_end'],tuple(user_ids)))
- data=self.cr.dictfetchall()
+ company_id = user_obj.browse(self.cr, self.uid, self.uid).company_id.id
+ pos_ids = pos_obj.search(self.cr, self.uid, [('date_order','>=',form['date_start'] + ' 00:00:00'),('date_order','<=',form['date_end'] + ' 23:59:59'),('user_id','in',user_ids),('state','in',['done','paid','invoiced']),('company_id','=',company_id)])
+ for pos in pos_obj.browse(self.cr, self.uid, pos_ids):
+ for pol in pos.lines:
+ result = {
+ 'code': pol.product_id.default_code,
+ 'name': pol.product_id.name,
+ 'invoice_id': pos.invoice_id.id,
+ 'price_unit': pol.price_unit,
+ 'qty': pol.qty,
+ 'discount': pol.discount,
+ 'total': (pol.price_unit * pol.qty * (1 - (pol.discount) / 100.0)),
+ 'date_order': pos.date_order,
+ 'pos_name': pos.name,
+ 'uom': pol.product_id.uom_id.name
+ }
+ data.append(result)
+ self.total += result['total']
+ self.qty += result['qty']
+ self.discount += result['discount']
if data:
- for d in data:
- self.total += d['total']
- self.qty += d['qty']
- return data
+ return data
else:
return {}
- def _get_qty_total_2(self, form):
- qty=[]
- user_ids = form['user_ids'] or self._get_all_users()
- self.cr.execute("select sum(pol.qty) as qty " \
- "from pos_order as po,pos_order_line as pol,product_product as pp,product_template as pt,res_users as ru,res_company as rc " \
- "where pt.id=pp.product_tmpl_id and pp.id=pol.product_id and po.id = pol.order_id and po.state IN ('done','paid','invoiced') " \
- " and to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::date >= %s and to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::date <= %s " \
- "and po.user_id = ru.id and rc.id = po.company_id and ru.id IN %s " \
- ,(form['date_start'],form['date_end'],tuple(user_ids)))
- qty = self.cr.fetchone()
- return qty[0] or 0.00
+ def _get_qty_total_2(self):
+ return self.qty
- def _get_sales_total_2(self, form):
- user_ids = form['user_ids'] or self._get_all_users()
- self.cr.execute("select sum((pol.price_unit * pol.qty * (1 - (pol.discount) / 100.0))) as Total " \
- "from pos_order_line as pol, pos_order po, product_product as pp,product_template as pt " \
- " where po.id=pol.order_id and to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::date >= %s " \
- " and to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::date <= %s and po.state IN ('paid','invoiced','done') " \
- " and pt.id=pp.product_tmpl_id and pol.product_id=pp.id and po.user_id in %s"\
- , (form['date_start'], form['date_end'], tuple(user_ids)))
- res2=self.cr.fetchone()
- return res2 and res2[0] or 0.0
+ def _get_sales_total_2(self):
+ return self.total
def _get_sum_invoice_2(self,form):
- res2=[]
+ pos_obj = self.pool.get('pos.order')
+ user_obj = self.pool.get('res.users')
user_ids = form['user_ids'] or self._get_all_users()
- self.cr.execute ("select sum(pol.price_unit * pol.qty * (1 - (pol.discount) / 100.0))" \
- "from pos_order as po,pos_order_line as pol,product_product as pp,product_template as pt, res_users as ru,res_company as rc,account_invoice as ai " \
- "where pt.id=pp.product_tmpl_id and pp.id=pol.product_id and po.id = pol.order_id and ai.id=po.invoice_id " \
- "and to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::date >= %s and to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::date <= %s " \
- "and po.user_id = ru.id and rc.id = po.company_id and ru.id IN %s " \
- ,(form['date_start'],form['date_end'],tuple(user_ids)))
- res2=self.cr.fetchone()
- self.total_invoiced=res2[0]
- return res2[0] or False
+ company_id = user_obj.browse(self.cr, self.uid, self.uid).company_id.id
+ pos_ids = pos_obj.search(self.cr, self.uid, [('date_order','>=',form['date_start'] + ' 00:00:00'),('date_order','<=',form['date_end'] + ' 23:59:59'),('user_id','in',user_ids),('company_id','=',company_id),('invoice_id','<>',False)])
+ for pos in pos_obj.browse(self.cr, self.uid, pos_ids):
+ for pol in pos.lines:
+ self.total_invoiced += (pol.price_unit * pol.qty * (1 - (pol.discount) / 100.0))
+ return self.total_invoiced or False
- def _paid_total_2(self,form):
- res3=[]
- user_ids = form['user_ids'] or self._get_all_users()
- self.cr.execute ("select sum(pol.price_unit * pol.qty * (1 - (pol.discount) / 100.0))" \
- "from pos_order as po,pos_order_line as pol,product_product as pp,product_template as pt, res_users as ru,res_company as rc " \
- "where pt.id=pp.product_tmpl_id and pp.id=pol.product_id and po.id = pol.order_id and po.state IN ('paid','invoiced','done') " \
- "and to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::date >= %s and to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::date <= %s " \
- "and po.user_id = ru.id and rc.id = po.company_id and ru.id IN %s " \
- ,(form['date_start'],form['date_end'],tuple(user_ids)))
- res3=self.cr.fetchone()
- self.total_paid=res3[0]
- return res3[0] or False
+ def _paid_total_2(self):
+ return self.total or 0.0
def _get_sum_dis_2(self,form):
- res4=[]
- user_ids = form['user_ids'] or self._get_all_users()
- self.cr.execute ("select sum(pol.discount)" \
- "from pos_order as po,pos_order_line as pol,product_product as pp,product_template as pt, res_users as ru,res_company as rc " \
- "where pt.id=pp.product_tmpl_id and pp.id=pol.product_id and po.id = pol.order_id and po.state IN ('paid','done','invoiced') " \
- "and to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::date >= %s and to_char(date_trunc('day',po.date_order),'YYYY-MM-DD')::date <= %s " \
- "and po.user_id = ru.id and rc.id = po.company_id and ru.id IN %s " \
- ,(form['date_start'],form['date_end'],tuple(user_ids)))
- res4=self.cr.fetchone()
- self.total_invoiced=res4[0]
- return res4[0] or False
+ return self.discount or 0.0
def _get_sum_discount(self, objects):
#code for the sum of discount value
@@ -133,7 +106,7 @@ class pos_details(report_sxw.rml_parse):
statement_line_obj = self.pool.get("account.bank.statement.line")
pos_order_obj = self.pool.get("pos.order")
user_ids = form['user_ids'] or self._get_all_users()
- pos_ids=pos_order_obj.search(self.cr, self.uid, [('date_order','>=',form['date_start'] + ' 00:00:00'),('date_order','<=',form['date_end'] + ' 23:59:59'),('state','in',['paid','invoiced','done']),('user_id','in',user_ids)])
+ pos_ids = pos_order_obj.search(self.cr, self.uid, [('date_order','>=',form['date_start'] + ' 00:00:00'),('date_order','<=',form['date_end'] + ' 23:59:59'),('state','in',['paid','invoiced','done']),('user_id','in',user_ids)])
data={}
if pos_ids:
st_line_ids = statement_line_obj.search(self.cr, self.uid, [('pos_statement_id', 'in', pos_ids)])
@@ -146,17 +119,17 @@ class pos_details(report_sxw.rml_parse):
"where absl.statement_id = abs.id and abs.journal_id = aj.id and absl.id IN %s " \
"group by aj.name ",(tuple(a_l),))
- data=self.cr.dictfetchall()
+ data = self.cr.dictfetchall()
return data
else:
return {}
def _total_of_the_day(self, objects):
- if self.total_paid:
- if self.total_paid == self.total_invoiced:
- return self.total_paid
+ if self.total:
+ if self.total == self.total_invoiced:
+ return self.total
else:
- return ((self.total_paid or 0.00) - (self.total_invoiced or 0.00))
+ return ((self.total or 0.00) - (self.total_invoiced or 0.00))
else:
return False
@@ -178,30 +151,24 @@ class pos_details(report_sxw.rml_parse):
def _get_tax_amount(self, form):
res = {}
- temp={}
+ temp = {}
list_ids = []
temp2 = 0.0
user_ids = form['user_ids'] or self._get_all_users()
- pos_order_obj = self.pool.get("pos.order")
+ pos_order_obj = self.pool.get('pos.order')
pos_ids = pos_order_obj.search(self.cr, self.uid, [('date_order','>=',form['date_start'] + ' 00:00:00'),('date_order','<=',form['date_end'] + ' 23:59:59'),('state','in',['paid','invoiced','done']),('user_id','in',user_ids)])
- temp.update({'name':''})
+ temp.update({'name': ''})
for order in pos_order_obj.browse(self.cr, self.uid, pos_ids):
- temp2 +=order.amount_tax
+ temp2 += order.amount_tax
for line in order.lines:
if len(line.product_id.taxes_id):
tax = line.product_id.taxes_id[0]
res[tax.name] = (line.price_unit * line.qty * (1-(line.discount or 0.0) / 100.0)) + (tax.id in list_ids and res[tax.name] or 0)
list_ids.append(tax.id)
- temp.update({'name':tax.name})
- temp.update({'amount':temp2})
+ temp.update({'name': tax.name})
+ temp.update({'amount': temp2})
return [temp] or False
- def _get_period(self, form):
- return form['date_start']
-
- def _get_period2(self,form):
- return form['date_end']
-
def _get_user_names(self, user_ids):
user_obj = self.pool.get('res.users')
return ', '.join(map(lambda x: x.name, user_obj.browse(self.cr, self.uid, user_ids)))
@@ -210,9 +177,8 @@ class pos_details(report_sxw.rml_parse):
super(pos_details, self).__init__(cr, uid, name, context=context)
self.total = 0.0
self.qty = 0.0
- self.invoice_id = ''
- self.total_paid = 0.0
self.total_invoiced = 0.0
+ self.discount = 0.0
self.localcontext.update({
'time': time,
'strip_name': self._strip_name,
@@ -220,8 +186,6 @@ class pos_details(report_sxw.rml_parse):
'getsumdisc': self._get_sum_dis_2,
'gettotalofthaday': self._total_of_the_day,
'gettaxamount': self._get_tax_amount,
- 'getperiod': self._get_period,
- 'getperiod2':self._get_period2,
'pos_sales_details':self._pos_sales_details,
'getqtytotal2': self._get_qty_total_2,
'getsalestotal2': self._get_sales_total_2,
diff --git a/addons/point_of_sale/report/pos_details.rml b/addons/point_of_sale/report/pos_details.rml
index 1a7e1271d53..3402c7b6a91 100644
--- a/addons/point_of_sale/report/pos_details.rml
+++ b/addons/point_of_sale/report/pos_details.rml
@@ -203,10 +203,10 @@
[[ formatLang(time.strftime('%Y-%m-%d'),date=True) ]]
- [[ formatLang(getperiod(data['form']),date = True) ]]
+ [[ formatLang(data['form']['date_start'],date=True) ]]
|
- [[ formatLang(getperiod2(data['form']),date = True) ]]
+ [[ formatLang(data['form']['date_end'],date=True) ]]
|
@@ -349,7 +349,7 @@
Sales total(Revenue)
- [[ formatLang(getsalestotal2(data['form']), dp='Sale Price') ]] [[ company.currency_id.symbol ]]
+ [[ formatLang(getsalestotal2(), dp='Sale Price') ]] [[ company.currency_id.symbol ]]
|
@@ -357,7 +357,7 @@
Qty of product
|
- [[ formatLang(getqtytotal2(data['form'])) ]]
+ [[ formatLang(getqtytotal2()) ]]
|
@@ -381,7 +381,7 @@
Total paid
|
- [[ formatLang(getpaidtotal2(data['form']), dp='Sale Price') ]] [[ company.currency_id.symbol ]]
+ [[ formatLang(getpaidtotal2(), dp='Sale Price') ]] [[ company.currency_id.symbol ]]
|
From df961503e475aafbff3cb17be6b5117ea96e5851 Mon Sep 17 00:00:00 2001
From: eLBati
Date: Fri, 25 Nov 2011 08:54:08 +0100
Subject: [PATCH 023/224] [FIX] 2605 user_type
bzr revid: lorenzo.battistini@agilebg.com-20111125075408-as0izjpyept8rrve
---
.../l10n_it/data/account.account.template.csv | 470 +++++++++---------
1 file changed, 235 insertions(+), 235 deletions(-)
diff --git a/addons/l10n_it/data/account.account.template.csv b/addons/l10n_it/data/account.account.template.csv
index bc05351a898..ffa09039c56 100644
--- a/addons/l10n_it/data/account.account.template.csv
+++ b/addons/l10n_it/data/account.account.template.csv
@@ -1,235 +1,235 @@
-"id","code","name","parent_id:id","user_type:id","type","reconcile"
-"0","0","Azienda",,"account_type_view","view","FALSE"
-"1","1","ATTIVO ","0","account_type_view","view","TRUE"
-"11","11","IMMOBILIZZAZIONI IMMATERIALI ","1","account_type_view","view","TRUE"
-"1101","1101","costi di impianto ","11","account_type_asset","other","TRUE"
-"1106","1106","software ","11","account_type_asset","other","TRUE"
-"1108","1108","avviamento ","11","account_type_asset","other","TRUE"
-"1111","1111","fondo ammortamento costi di impianto ","11","account_type_asset","other","TRUE"
-"1116","1116","fondo ammortamento software ","11","account_type_asset","other","TRUE"
-"1118","1118","fondo ammortamento avviamento ","11","account_type_asset","other","TRUE"
-"12","12","IMMOBILIZZAZIONI MATERIALI ","1","account_type_view","view","TRUE"
-"1201","1201","fabbricati ","12","account_type_asset","other","TRUE"
-"1202","1202","impianti e macchinari ","12","account_type_asset","other","TRUE"
-"1204","1204","attrezzature commerciali ","12","account_type_asset","other","TRUE"
-"1205","1205","macchine d'ufficio ","12","account_type_asset","other","TRUE"
-"1206","1206","arredamento ","12","account_type_asset","other","TRUE"
-"1207","1207","automezzi ","12","account_type_asset","other","TRUE"
-"1208","1208","imballaggi durevoli ","12","account_type_asset","other","TRUE"
-"1211","1211","fondo ammortamento fabbricati ","12","account_type_asset","other","TRUE"
-"1212","1212","fondo ammortamento impianti e macchinari ","12","account_type_asset","other","TRUE"
-"1214","1214","fondo ammortamento attrezzature commerciali ","12","account_type_asset","other","TRUE"
-"1215","1215","fondo ammortamento macchine d'ufficio ","12","account_type_asset","other","TRUE"
-"1216","1216","fondo ammortamento arredamento ","12","account_type_asset","other","TRUE"
-"1217","1217","fondo ammortamento automezzi ","12","account_type_asset","other","TRUE"
-"1218","1218","fondo ammortamento imballaggi durevoli ","12","account_type_asset","other","TRUE"
-"1220","1220","fornitori immobilizzazioni c/acconti ","12","account_type_asset","other","TRUE"
-"13","13","IMMOBILIZZAZIONI FINANZIARIE ","1","account_type_view","view","TRUE"
-"1301","1301","mutui attivi ","13","account_type_asset","other","TRUE"
-"14","14","RIMANENZE ","1","account_type_view","view","TRUE"
-"1401","1401","materie di consumo ","14","account_type_asset","other","TRUE"
-"1404","1404","merci ","14","account_type_asset","other","TRUE"
-"1410","1410","fornitori c/acconti ","14","account_type_asset","other","TRUE"
-"15","15","CREDITI COMMERCIALI ","1","account_type_view","view","TRUE"
-"1501","1501","crediti v/clienti ","15","account_type_receivable","receivable","TRUE"
-"1502","1502","crediti commerciali diversi ","15","account_type_receivable","other","TRUE"
-"1503","1503","clienti c/spese anticipate ","15","account_type_receivable","receivable","TRUE"
-"1505","1505","cambiali attive ","15","account_type_receivable","other","TRUE"
-"1506","1506","cambiali allo sconto ","15","account_type_receivable","other","TRUE"
-"1507","1507","cambiali all'incasso ","15","account_type_receivable","other","TRUE"
-"1509","1509","fatture da emettere ","15","account_type_receivable","other","TRUE"
-"1510","1510","crediti insoluti ","15","account_type_receivable","other","TRUE"
-"1511","1511","cambiali insolute ","15","account_type_receivable","other","TRUE"
-"1531","1531","crediti da liquidare ","15","account_type_receivable","other","TRUE"
-"1540","1540","fondo svalutazione crediti ","15","account_type_receivable","other","TRUE"
-"1541","1541","fondo rischi su crediti ","15","account_type_receivable","other","TRUE"
-"16","16","CREDITI DIVERSI ","1","account_type_view","view","TRUE"
-"1601","1601","IVA n/credito ","16","account_type_tax","other","TRUE"
-"1602","1602","IVA c/acconto ","16","account_type_tax","other","TRUE"
-"1605","1605","crediti per IVA ","16","account_type_tax","other","TRUE"
-"1607","1607","imposte c/acconto ","16","account_type_tax","other","TRUE"
-"1608","1608","crediti per imposte ","16","account_type_tax","other","TRUE"
-"1609","1609","crediti per ritenute subite ","16","account_type_asset","other","TRUE"
-"1610","1610","crediti per cauzioni ","16","account_type_asset","other","TRUE"
-"1620","1620","personale c/acconti ","16","account_type_asset","other","TRUE"
-"1630","1630","crediti v/istituti previdenziali ","16","account_type_asset","other","TRUE"
-"1640","1640","debitori diversi ","16","account_type_receivable","receivable","TRUE"
-"18","18","DISPONIBILITÀ LIQUIDE ","1","account_type_view","view","TRUE"
-"1801","1801","banche c/c ","18","account_type_bank","liquidity","TRUE"
-"1810","1810","c/c postali ","18","account_type_cash","liquidity","TRUE"
-"1820","1820","denaro in cassa ","18","account_type_cash","liquidity","TRUE"
-"1821","1821","assegni ","18","account_type_cash","liquidity","TRUE"
-"1822","1822","valori bollati ","18","account_type_cash","liquidity","TRUE"
-"19","19","RATEI E RISCONTI ATTIVI ","1","account_type_view","view","TRUE"
-"1901","1901","ratei attivi ","19","account_type_asset","other","TRUE"
-"1902","1902","risconti attivi ","19","account_type_asset","other","TRUE"
-"2","2","PASSIVO ","0","account_type_view","view","TRUE"
-"20","20","PATRIMONIO NETTO ","2","account_type_view","view","TRUE"
-"2101","2101","patrimonio netto ","20","account_type_asset","other","TRUE"
-"2102","2102","utile d'esercizio ","20","account_type_asset","other","TRUE"
-"2103","2103","perdita d'esercizio ","20","account_type_asset","other","TRUE"
-"2104","2104","prelevamenti extra gestione ","20","account_type_asset","other","TRUE"
-"2105","2105","titolare c/ritenute subite ","20","account_type_asset","other","TRUE"
-"22","22","FONDI PER RISCHI E ONERI ","2","account_type_view","view","TRUE"
-"2201","2201","fondo per imposte ","22","account_type_asset","other","TRUE"
-"2204","2204","fondo responsabilità civile ","22","account_type_asset","other","TRUE"
-"2205","2205","fondo spese future ","22","account_type_asset","other","TRUE"
-"2211","2211","fondo manutenzioni programmate ","22","account_type_asset","other","TRUE"
-"23","23","TRATTAMENTO FINE RAPPORTO DI LAVORO ","2","account_type_view","view","TRUE"
-"2301","2301","debiti per TFRL ","23","account_type_asset","other","TRUE"
-"24","24","DEBITI FINANZIARI ","2","account_type_view","view","TRUE"
-"2410","2410","mutui passivi ","24","account_type_asset","other","TRUE"
-"2411","2411","banche c/sovvenzioni ","24","account_type_asset","other","TRUE"
-"2420","2420","banche c/c passivi ","24","account_type_asset","other","TRUE"
-"2421","2421","banche c/RIBA all'incasso ","24","account_type_asset","other","TRUE"
-"2422","2422","banche c/cambiali all'incasso ","24","account_type_asset","other","TRUE"
-"2423","2423","banche c/anticipi su fatture ","24","account_type_asset","other","TRUE"
-"2440","2440","debiti v/altri finanziatori ","24","account_type_asset","other","TRUE"
-"25","25","DEBITI COMMERCIALI ","2","account_type_view","view","TRUE"
-"2501","2501","debiti v/fornitori ","25","account_type_payable","payable","TRUE"
-"2503","2503","cambiali passive ","25","account_type_asset","other","TRUE"
-"2520","2520","fatture da ricevere ","25","account_type_asset","other","TRUE"
-"2521","2521","debiti da liquidare ","25","account_type_asset","other","TRUE"
-"2530","2530","clienti c/acconti ","25","account_type_payable","payable","TRUE"
-"26","26","DEBITI DIVERSI ","2","account_type_view","view","TRUE"
-"2601","2601","IVA n/debito ","26","account_type_tax","other","TRUE"
-"2602","2602","debiti per ritenute da versare ","26","account_type_tax","other","TRUE"
-"2605","2605","erario c/IVA ","26","account_type_tax","payable","TRUE"
-"2606","2606","debiti per imposte ","26","account_type_tax","other","TRUE"
-"2619","2619","debiti per cauzioni ","26","account_type_asset","other","TRUE"
-"2620","2620","personale c/retribuzioni ","26","account_type_asset","other","TRUE"
-"2621","2621","personale c/liquidazioni ","26","account_type_asset","other","TRUE"
-"2622","2622","clienti c/cessione ","26","account_type_asset","other","TRUE"
-"2630","2630","debiti v/istituti previdenziali ","26","account_type_asset","other","TRUE"
-"2640","2640","creditori diversi ","26","account_type_payable","payable","TRUE"
-"27","27","RATEI E RISCONTI PASSIVI ","2","account_type_view","view","TRUE"
-"2701","2701","ratei passivi ","27","account_type_asset","other","TRUE"
-"2702","2702","risconti passivi ","27","account_type_asset","other","TRUE"
-"28","28","CONTI TRANSITORI E DIVERSI ","2","account_type_view","view","TRUE"
-"2801","2801","bilancio di apertura ","28","account_type_asset","other","TRUE"
-"2802","2802","bilancio di chiusura ","28","account_type_asset","other","TRUE"
-"2810","2810","IVA c/liquidazioni ","28","account_type_asset","other","TRUE"
-"2811","2811","istituti previdenziali ","28","account_type_asset","other","TRUE"
-"2820","2820","banca ... c/c ","28","account_type_asset","other","TRUE"
-"2821","2821","banca ... c/c ","28","account_type_asset","other","TRUE"
-"2822","2822","banca ... c/c ","28","account_type_asset","other","TRUE"
-"29","29","CONTI DEI SISTEMI SUPPLEMENTARI ","2","account_type_view","view","TRUE"
-"2901","2901","beni di terzi ","29","account_type_asset","other","TRUE"
-"2902","2902","depositanti beni ","29","account_type_asset","other","TRUE"
-"2911","2911","merci da ricevere ","29","account_type_asset","other","TRUE"
-"2912","2912","fornitori c/impegni ","29","account_type_asset","other","TRUE"
-"2913","2913","impegni per beni in leasing ","29","account_type_asset","other","TRUE"
-"2914","2914","creditori c/leasing ","29","account_type_asset","other","TRUE"
-"2916","2916","clienti c/impegni ","29","account_type_asset","other","TRUE"
-"2917","2917","merci da consegnare ","29","account_type_asset","other","TRUE"
-"2921","2921","rischi per effetti scontati ","29","account_type_asset","other","TRUE"
-"2922","2922","banche c/effetti scontati ","29","account_type_asset","other","TRUE"
-"2926","2926","rischi per fideiussioni ","29","account_type_asset","other","TRUE"
-"2927","2927","creditori per fideiussioni ","29","account_type_asset","other","TRUE"
-"2931","2931","rischi per avalli ","29","account_type_asset","other","TRUE"
-"2932","2932","creditori per avalli ","29","account_type_asset","other","TRUE"
-"3","3","VALORE DELLA PRODUZIONE ","0","account_type_view","view","TRUE"
-"31","31","VENDITE E PRESTAZIONI ","3","account_type_view","view","TRUE"
-"3101","3101","merci c/vendite ","31","account_type_income","other","TRUE"
-"3103","3103","rimborsi spese di vendita ","31","account_type_income","other","TRUE"
-"3110","3110","resi su vendite ","31","account_type_income","other","TRUE"
-"3111","3111","ribassi e abbuoni passivi ","31","account_type_income","other","TRUE"
-"3112","3112","premi su vendite ","31","account_type_income","other","TRUE"
-"32","32","RICAVI E PROVENTI DIVERSI ","3","account_type_view","view","TRUE"
-"3201","3201","fitti attivi ","32","account_type_income","other","TRUE"
-"3202","3202","proventi vari ","32","account_type_income","other","TRUE"
-"3210","3210","arrotondamenti attivi ","32","account_type_income","other","TRUE"
-"3220","3220","plusvalenze ordinarie diverse ","32","account_type_income","other","TRUE"
-"3230","3230","sopravvenienze attive ordinarie diverse ","32","account_type_income","other","TRUE"
-"3240","3240","insussistenze attive ordinarie diverse ","32","account_type_income","other","TRUE"
-"4","4","COSTI DELLA PRODUZIONE ","0","account_type_view","view","TRUE"
-"41","41","COSTO DEL VENDUTO ","4","account_type_view","view","TRUE"
-"4101","4101","merci c/acquisti ","41","account_type_expense","other","TRUE"
-"4102","4102","materie di consumo c/acquisti ","41","account_type_expense","other","TRUE"
-"4105","4105","merci c/apporti ","41","account_type_expense","other","TRUE"
-"4110","4110","resi su acquisti ","41","account_type_expense","other","TRUE"
-"4111","4111","ribassi e abbuoni attivi ","41","account_type_expense","other","TRUE"
-"4112","4112","premi su acquisti ","41","account_type_expense","other","TRUE"
-"4121","4121","merci c/esistenze iniziali ","41","account_type_expense","other","TRUE"
-"4122","4122","materie di consumo c/esistenze iniziali ","41","account_type_expense","other","TRUE"
-"4131","4131","merci c/rimanenze finali ","41","account_type_expense","other","TRUE"
-"4132","4132","materie di consumo c/rimanenze finali ","41","account_type_expense","other","TRUE"
-"42","42","COSTI PER SERVIZI ","4","account_type_view","view","TRUE"
-"4201","4201","costi di trasporto ","42","account_type_expense","other","TRUE"
-"4202","4202","costi per energia ","42","account_type_expense","other","TRUE"
-"4203","4203","costi di pubblicità ","42","account_type_expense","other","TRUE"
-"4204","4204","costi di consulenze ","42","account_type_expense","other","TRUE"
-"4205","4205","costi postali ","42","account_type_expense","other","TRUE"
-"4206","4206","costi telefonici ","42","account_type_expense","other","TRUE"
-"4207","4207","costi di assicurazione ","42","account_type_expense","other","TRUE"
-"4208","4208","costi di vigilanza ","42","account_type_expense","other","TRUE"
-"4209","4209","costi per i locali ","42","account_type_expense","other","TRUE"
-"4210","4210","costi di esercizio automezzi ","42","account_type_expense","other","TRUE"
-"4211","4211","costi di manutenzione e riparazione ","42","account_type_expense","other","TRUE"
-"4212","4212","provvigioni passive ","42","account_type_expense","other","TRUE"
-"4213","4213","spese di incasso ","42","account_type_expense","other","TRUE"
-"43","43","COSTI PER GODIMENTO BENI DI TERZI ","4","account_type_view","view","TRUE"
-"4301","4301","fitti passivi ","43","account_type_expense","other","TRUE"
-"4302","4302","canoni di leasing ","43","account_type_expense","other","TRUE"
-"44","44","COSTI PER IL PERSONALE ","4","account_type_view","view","TRUE"
-"4401","4401","salari e stipendi ","44","account_type_expense","other","TRUE"
-"4402","4402","oneri sociali ","44","account_type_expense","other","TRUE"
-"4403","4403","TFRL ","44","account_type_expense","other","TRUE"
-"4404","4404","altri costi per il personale ","44","account_type_expense","other","TRUE"
-"45","45","AMMORTAMENTI IMMOBILIZZAZIONI IMMATERIALI ","4","account_type_view","view","TRUE"
-"4501","4501","ammortamento costi di impianto ","45","account_type_p_l","other","TRUE"
-"4506","4506","ammortamento software ","45","account_type_p_l","other","TRUE"
-"4508","4508","ammortamento avviamento ","45","account_type_p_l","other","TRUE"
-"46","46","AMMORTAMENTI IMMOBILIZZAZIONI MATERIALI ","4","account_type_view","view","TRUE"
-"4601","4601","ammortamento fabbricati ","46","account_type_p_l","other","TRUE"
-"4602","4602","ammortamento impianti e macchinari ","46","account_type_p_l","other","TRUE"
-"4604","4604","ammortamento attrezzature commerciali ","46","account_type_p_l","other","TRUE"
-"4605","4605","ammortamento macchine d'ufficio ","46","account_type_p_l","other","TRUE"
-"4606","4606","ammortamento arredamento ","46","account_type_p_l","other","TRUE"
-"4607","4607","ammortamento automezzi ","46","account_type_p_l","other","TRUE"
-"4608","4608","ammortamento imballaggi durevoli ","46","account_type_p_l","other","TRUE"
-"47","47","SVALUTAZIONI ","4","account_type_view","view","TRUE"
-"4701","4701","svalutazioni immobilizzazioni immateriali ","47","account_type_p_l","other","TRUE"
-"4702","4702","svalutazioni immobilizzazioni materiali ","47","account_type_p_l","other","TRUE"
-"4706","4706","svalutazione crediti ","47","account_type_p_l","other","TRUE"
-"48","48","ACCANTONAMENTI ","4","account_type_view","view","TRUE"
-"481","481","ACCANTONAMENTI PER RISCHI ","48","account_type_view","view","TRUE"
-"4814","4814","accantonamento per responsabilità civile ","481","account_type_p_l","other","TRUE"
-"482","482","ALTRI ACCANTONAMENTI ","48","account_type_view","view","TRUE"
-"4821","4821","accantonamento per spese future ","482","account_type_p_l","other","TRUE"
-"4823","4823","accantonamento per manutenzioni programmate ","482","account_type_p_l","other","TRUE"
-"49","49","ONERI DIVERSI ","4","account_type_view","view","TRUE"
-"4901","4901","oneri fiscali diversi ","49","account_type_p_l","other","TRUE"
-"4903","4903","oneri vari ","49","account_type_p_l","other","TRUE"
-"4905","4905","perdite su crediti ","49","account_type_p_l","other","TRUE"
-"4910","4910","arrotondamenti passivi ","49","account_type_p_l","other","TRUE"
-"4920","4920","minusvalenze ordinarie diverse ","49","account_type_p_l","other","TRUE"
-"4930","4930","sopravvenienze passive ordinarie diverse ","49","account_type_p_l","other","TRUE"
-"4940","4940","insussistenze passive ordinarie diverse ","49","account_type_p_l","other","TRUE"
-"5","5","PROVENTI E ONERI FINANZIARI ","0","account_type_view","view","TRUE"
-"51","51","PROVENTI FINANZIARI ","5","account_type_view","view","TRUE"
-"5110","5110","interessi attivi v/clienti ","51","account_type_p_l","other","TRUE"
-"5115","5115","interessi attivi bancari ","51","account_type_p_l","other","TRUE"
-"5116","5116","interessi attivi postali ","51","account_type_p_l","other","TRUE"
-"5140","5140","proventi finanziari diversi ","51","account_type_p_l","other","TRUE"
-"52","52","ONERI FINANZIARI ","5","account_type_view","view","TRUE"
-"5201","5201","interessi passivi v/fornitori ","52","account_type_p_l","other","TRUE"
-"5202","5202","interessi passivi bancari ","52","account_type_p_l","other","TRUE"
-"5203","5203","sconti passivi bancari ","52","account_type_p_l","other","TRUE"
-"5210","5210","interessi passivi su mutui ","52","account_type_p_l","other","TRUE"
-"5240","5240","oneri finanziari diversi ","52","account_type_p_l","other","TRUE"
-"7","7","PROVENTI E ONERI STRAORDINARI ","0","account_type_view","view","TRUE"
-"71","71","PROVENTI STRAORDINARI ","7","account_type_view","view","TRUE"
-"7101","7101","plusvalenze straordinarie ","71","account_type_p_l","other","TRUE"
-"7102","7102","sopravvenienze attive straordinarie ","71","account_type_p_l","other","TRUE"
-"7103","7103","insussistenze attive straordinarie ","71","account_type_p_l","other","TRUE"
-"72","72","ONERI STRAORDINARI ","7","account_type_view","view","TRUE"
-"7201","7201","minusvalenze straordinarie ","72","account_type_p_l","other","TRUE"
-"7202","7202","sopravvenienze passive straordinarie ","72","account_type_p_l","other","TRUE"
-"7203","7203","insussistenze passive straordinarie ","72","account_type_p_l","other","TRUE"
-"7204","7204","imposte esercizi precedenti ","72","account_type_p_l","other","TRUE"
-"8","8","IMPOSTE DELL'ESERCIZIO ","0","account_type_view","view","TRUE"
-"8101","8101","imposte dell'esercizio ","8","account_type_p_l","other","TRUE"
-"9","9","CONTI DI RISULTATO ","0","account_type_view","view","TRUE"
-"9101","9101","conto di risultato economico ","9","account_type_p_l","other","TRUE"
-"9102","9102","stato patrimoniale","9","account_type_p_l","other","TRUE"
+id,code,name,parent_id:id,user_type:id,type,reconcile
+0,0,Azienda,,account_type_view,view,FALSE
+1,1,ATTIVO ,0,account_type_view,view,TRUE
+11,11,IMMOBILIZZAZIONI IMMATERIALI ,1,account_type_view,view,TRUE
+1101,1101,costi di impianto ,11,account_type_asset,other,TRUE
+1106,1106,software ,11,account_type_asset,other,TRUE
+1108,1108,avviamento ,11,account_type_asset,other,TRUE
+1111,1111,fondo ammortamento costi di impianto ,11,account_type_asset,other,TRUE
+1116,1116,fondo ammortamento software ,11,account_type_asset,other,TRUE
+1118,1118,fondo ammortamento avviamento ,11,account_type_asset,other,TRUE
+12,12,IMMOBILIZZAZIONI MATERIALI ,1,account_type_view,view,TRUE
+1201,1201,fabbricati ,12,account_type_asset,other,TRUE
+1202,1202,impianti e macchinari ,12,account_type_asset,other,TRUE
+1204,1204,attrezzature commerciali ,12,account_type_asset,other,TRUE
+1205,1205,macchine d'ufficio ,12,account_type_asset,other,TRUE
+1206,1206,arredamento ,12,account_type_asset,other,TRUE
+1207,1207,automezzi ,12,account_type_asset,other,TRUE
+1208,1208,imballaggi durevoli ,12,account_type_asset,other,TRUE
+1211,1211,fondo ammortamento fabbricati ,12,account_type_asset,other,TRUE
+1212,1212,fondo ammortamento impianti e macchinari ,12,account_type_asset,other,TRUE
+1214,1214,fondo ammortamento attrezzature commerciali ,12,account_type_asset,other,TRUE
+1215,1215,fondo ammortamento macchine d'ufficio ,12,account_type_asset,other,TRUE
+1216,1216,fondo ammortamento arredamento ,12,account_type_asset,other,TRUE
+1217,1217,fondo ammortamento automezzi ,12,account_type_asset,other,TRUE
+1218,1218,fondo ammortamento imballaggi durevoli ,12,account_type_asset,other,TRUE
+1220,1220,fornitori immobilizzazioni c/acconti ,12,account_type_asset,other,TRUE
+13,13,IMMOBILIZZAZIONI FINANZIARIE ,1,account_type_view,view,TRUE
+1301,1301,mutui attivi ,13,account_type_asset,other,TRUE
+14,14,RIMANENZE ,1,account_type_view,view,TRUE
+1401,1401,materie di consumo ,14,account_type_asset,other,TRUE
+1404,1404,merci ,14,account_type_asset,other,TRUE
+1410,1410,fornitori c/acconti ,14,account_type_asset,other,TRUE
+15,15,CREDITI COMMERCIALI ,1,account_type_view,view,TRUE
+1501,1501,crediti v/clienti ,15,account_type_receivable,receivable,TRUE
+1502,1502,crediti commerciali diversi ,15,account_type_receivable,other,TRUE
+1503,1503,clienti c/spese anticipate ,15,account_type_receivable,receivable,TRUE
+1505,1505,cambiali attive ,15,account_type_receivable,other,TRUE
+1506,1506,cambiali allo sconto ,15,account_type_receivable,other,TRUE
+1507,1507,cambiali all'incasso ,15,account_type_receivable,other,TRUE
+1509,1509,fatture da emettere ,15,account_type_receivable,other,TRUE
+1510,1510,crediti insoluti ,15,account_type_receivable,other,TRUE
+1511,1511,cambiali insolute ,15,account_type_receivable,other,TRUE
+1531,1531,crediti da liquidare ,15,account_type_receivable,other,TRUE
+1540,1540,fondo svalutazione crediti ,15,account_type_receivable,other,TRUE
+1541,1541,fondo rischi su crediti ,15,account_type_receivable,other,TRUE
+16,16,CREDITI DIVERSI ,1,account_type_view,view,TRUE
+1601,1601,IVA n/credito ,16,account_type_tax,other,TRUE
+1602,1602,IVA c/acconto ,16,account_type_tax,other,TRUE
+1605,1605,crediti per IVA ,16,account_type_tax,other,TRUE
+1607,1607,imposte c/acconto ,16,account_type_tax,other,TRUE
+1608,1608,crediti per imposte ,16,account_type_tax,other,TRUE
+1609,1609,crediti per ritenute subite ,16,account_type_asset,other,TRUE
+1610,1610,crediti per cauzioni ,16,account_type_asset,other,TRUE
+1620,1620,personale c/acconti ,16,account_type_asset,other,TRUE
+1630,1630,crediti v/istituti previdenziali ,16,account_type_asset,other,TRUE
+1640,1640,debitori diversi ,16,account_type_receivable,receivable,TRUE
+18,18,DISPONIBILITÀ LIQUIDE ,1,account_type_view,view,TRUE
+1801,1801,banche c/c ,18,account_type_bank,liquidity,TRUE
+1810,1810,c/c postali ,18,account_type_cash,liquidity,TRUE
+1820,1820,denaro in cassa ,18,account_type_cash,liquidity,TRUE
+1821,1821,assegni ,18,account_type_cash,liquidity,TRUE
+1822,1822,valori bollati ,18,account_type_cash,liquidity,TRUE
+19,19,RATEI E RISCONTI ATTIVI ,1,account_type_view,view,TRUE
+1901,1901,ratei attivi ,19,account_type_asset,other,TRUE
+1902,1902,risconti attivi ,19,account_type_asset,other,TRUE
+2,2,PASSIVO ,0,account_type_view,view,TRUE
+20,20,PATRIMONIO NETTO ,2,account_type_view,view,TRUE
+2101,2101,patrimonio netto ,20,account_type_asset,other,TRUE
+2102,2102,utile d'esercizio ,20,account_type_asset,other,TRUE
+2103,2103,perdita d'esercizio ,20,account_type_asset,other,TRUE
+2104,2104,prelevamenti extra gestione ,20,account_type_asset,other,TRUE
+2105,2105,titolare c/ritenute subite ,20,account_type_asset,other,TRUE
+22,22,FONDI PER RISCHI E ONERI ,2,account_type_view,view,TRUE
+2201,2201,fondo per imposte ,22,account_type_asset,other,TRUE
+2204,2204,fondo responsabilità civile ,22,account_type_asset,other,TRUE
+2205,2205,fondo spese future ,22,account_type_asset,other,TRUE
+2211,2211,fondo manutenzioni programmate ,22,account_type_asset,other,TRUE
+23,23,TRATTAMENTO FINE RAPPORTO DI LAVORO ,2,account_type_view,view,TRUE
+2301,2301,debiti per TFRL ,23,account_type_asset,other,TRUE
+24,24,DEBITI FINANZIARI ,2,account_type_view,view,TRUE
+2410,2410,mutui passivi ,24,account_type_asset,other,TRUE
+2411,2411,banche c/sovvenzioni ,24,account_type_asset,other,TRUE
+2420,2420,banche c/c passivi ,24,account_type_asset,other,TRUE
+2421,2421,banche c/RIBA all'incasso ,24,account_type_asset,other,TRUE
+2422,2422,banche c/cambiali all'incasso ,24,account_type_asset,other,TRUE
+2423,2423,banche c/anticipi su fatture ,24,account_type_asset,other,TRUE
+2440,2440,debiti v/altri finanziatori ,24,account_type_asset,other,TRUE
+25,25,DEBITI COMMERCIALI ,2,account_type_view,view,TRUE
+2501,2501,debiti v/fornitori ,25,account_type_payable,payable,TRUE
+2503,2503,cambiali passive ,25,account_type_asset,other,TRUE
+2520,2520,fatture da ricevere ,25,account_type_asset,other,TRUE
+2521,2521,debiti da liquidare ,25,account_type_asset,other,TRUE
+2530,2530,clienti c/acconti ,25,account_type_payable,payable,TRUE
+26,26,DEBITI DIVERSI ,2,account_type_view,view,TRUE
+2601,2601,IVA n/debito ,26,account_type_tax,other,TRUE
+2602,2602,debiti per ritenute da versare ,26,account_type_tax,other,TRUE
+2605,2605,erario c/IVA ,26,account_type_payable,payable,TRUE
+2606,2606,debiti per imposte ,26,account_type_tax,other,TRUE
+2619,2619,debiti per cauzioni ,26,account_type_asset,other,TRUE
+2620,2620,personale c/retribuzioni ,26,account_type_asset,other,TRUE
+2621,2621,personale c/liquidazioni ,26,account_type_asset,other,TRUE
+2622,2622,clienti c/cessione ,26,account_type_asset,other,TRUE
+2630,2630,debiti v/istituti previdenziali ,26,account_type_asset,other,TRUE
+2640,2640,creditori diversi ,26,account_type_payable,payable,TRUE
+27,27,RATEI E RISCONTI PASSIVI ,2,account_type_view,view,TRUE
+2701,2701,ratei passivi ,27,account_type_asset,other,TRUE
+2702,2702,risconti passivi ,27,account_type_asset,other,TRUE
+28,28,CONTI TRANSITORI E DIVERSI ,2,account_type_view,view,TRUE
+2801,2801,bilancio di apertura ,28,account_type_asset,other,TRUE
+2802,2802,bilancio di chiusura ,28,account_type_asset,other,TRUE
+2810,2810,IVA c/liquidazioni ,28,account_type_asset,other,TRUE
+2811,2811,istituti previdenziali ,28,account_type_asset,other,TRUE
+2820,2820,banca ... c/c ,28,account_type_asset,other,TRUE
+2821,2821,banca ... c/c ,28,account_type_asset,other,TRUE
+2822,2822,banca ... c/c ,28,account_type_asset,other,TRUE
+29,29,CONTI DEI SISTEMI SUPPLEMENTARI ,2,account_type_view,view,TRUE
+2901,2901,beni di terzi ,29,account_type_asset,other,TRUE
+2902,2902,depositanti beni ,29,account_type_asset,other,TRUE
+2911,2911,merci da ricevere ,29,account_type_asset,other,TRUE
+2912,2912,fornitori c/impegni ,29,account_type_asset,other,TRUE
+2913,2913,impegni per beni in leasing ,29,account_type_asset,other,TRUE
+2914,2914,creditori c/leasing ,29,account_type_asset,other,TRUE
+2916,2916,clienti c/impegni ,29,account_type_asset,other,TRUE
+2917,2917,merci da consegnare ,29,account_type_asset,other,TRUE
+2921,2921,rischi per effetti scontati ,29,account_type_asset,other,TRUE
+2922,2922,banche c/effetti scontati ,29,account_type_asset,other,TRUE
+2926,2926,rischi per fideiussioni ,29,account_type_asset,other,TRUE
+2927,2927,creditori per fideiussioni ,29,account_type_asset,other,TRUE
+2931,2931,rischi per avalli ,29,account_type_asset,other,TRUE
+2932,2932,creditori per avalli ,29,account_type_asset,other,TRUE
+3,3,VALORE DELLA PRODUZIONE ,0,account_type_view,view,TRUE
+31,31,VENDITE E PRESTAZIONI ,3,account_type_view,view,TRUE
+3101,3101,merci c/vendite ,31,account_type_income,other,TRUE
+3103,3103,rimborsi spese di vendita ,31,account_type_income,other,TRUE
+3110,3110,resi su vendite ,31,account_type_income,other,TRUE
+3111,3111,ribassi e abbuoni passivi ,31,account_type_income,other,TRUE
+3112,3112,premi su vendite ,31,account_type_income,other,TRUE
+32,32,RICAVI E PROVENTI DIVERSI ,3,account_type_view,view,TRUE
+3201,3201,fitti attivi ,32,account_type_income,other,TRUE
+3202,3202,proventi vari ,32,account_type_income,other,TRUE
+3210,3210,arrotondamenti attivi ,32,account_type_income,other,TRUE
+3220,3220,plusvalenze ordinarie diverse ,32,account_type_income,other,TRUE
+3230,3230,sopravvenienze attive ordinarie diverse ,32,account_type_income,other,TRUE
+3240,3240,insussistenze attive ordinarie diverse ,32,account_type_income,other,TRUE
+4,4,COSTI DELLA PRODUZIONE ,0,account_type_view,view,TRUE
+41,41,COSTO DEL VENDUTO ,4,account_type_view,view,TRUE
+4101,4101,merci c/acquisti ,41,account_type_expense,other,TRUE
+4102,4102,materie di consumo c/acquisti ,41,account_type_expense,other,TRUE
+4105,4105,merci c/apporti ,41,account_type_expense,other,TRUE
+4110,4110,resi su acquisti ,41,account_type_expense,other,TRUE
+4111,4111,ribassi e abbuoni attivi ,41,account_type_expense,other,TRUE
+4112,4112,premi su acquisti ,41,account_type_expense,other,TRUE
+4121,4121,merci c/esistenze iniziali ,41,account_type_expense,other,TRUE
+4122,4122,materie di consumo c/esistenze iniziali ,41,account_type_expense,other,TRUE
+4131,4131,merci c/rimanenze finali ,41,account_type_expense,other,TRUE
+4132,4132,materie di consumo c/rimanenze finali ,41,account_type_expense,other,TRUE
+42,42,COSTI PER SERVIZI ,4,account_type_view,view,TRUE
+4201,4201,costi di trasporto ,42,account_type_expense,other,TRUE
+4202,4202,costi per energia ,42,account_type_expense,other,TRUE
+4203,4203,costi di pubblicità ,42,account_type_expense,other,TRUE
+4204,4204,costi di consulenze ,42,account_type_expense,other,TRUE
+4205,4205,costi postali ,42,account_type_expense,other,TRUE
+4206,4206,costi telefonici ,42,account_type_expense,other,TRUE
+4207,4207,costi di assicurazione ,42,account_type_expense,other,TRUE
+4208,4208,costi di vigilanza ,42,account_type_expense,other,TRUE
+4209,4209,costi per i locali ,42,account_type_expense,other,TRUE
+4210,4210,costi di esercizio automezzi ,42,account_type_expense,other,TRUE
+4211,4211,costi di manutenzione e riparazione ,42,account_type_expense,other,TRUE
+4212,4212,provvigioni passive ,42,account_type_expense,other,TRUE
+4213,4213,spese di incasso ,42,account_type_expense,other,TRUE
+43,43,COSTI PER GODIMENTO BENI DI TERZI ,4,account_type_view,view,TRUE
+4301,4301,fitti passivi ,43,account_type_expense,other,TRUE
+4302,4302,canoni di leasing ,43,account_type_expense,other,TRUE
+44,44,COSTI PER IL PERSONALE ,4,account_type_view,view,TRUE
+4401,4401,salari e stipendi ,44,account_type_expense,other,TRUE
+4402,4402,oneri sociali ,44,account_type_expense,other,TRUE
+4403,4403,TFRL ,44,account_type_expense,other,TRUE
+4404,4404,altri costi per il personale ,44,account_type_expense,other,TRUE
+45,45,AMMORTAMENTI IMMOBILIZZAZIONI IMMATERIALI ,4,account_type_view,view,TRUE
+4501,4501,ammortamento costi di impianto ,45,account_type_p_l,other,TRUE
+4506,4506,ammortamento software ,45,account_type_p_l,other,TRUE
+4508,4508,ammortamento avviamento ,45,account_type_p_l,other,TRUE
+46,46,AMMORTAMENTI IMMOBILIZZAZIONI MATERIALI ,4,account_type_view,view,TRUE
+4601,4601,ammortamento fabbricati ,46,account_type_p_l,other,TRUE
+4602,4602,ammortamento impianti e macchinari ,46,account_type_p_l,other,TRUE
+4604,4604,ammortamento attrezzature commerciali ,46,account_type_p_l,other,TRUE
+4605,4605,ammortamento macchine d'ufficio ,46,account_type_p_l,other,TRUE
+4606,4606,ammortamento arredamento ,46,account_type_p_l,other,TRUE
+4607,4607,ammortamento automezzi ,46,account_type_p_l,other,TRUE
+4608,4608,ammortamento imballaggi durevoli ,46,account_type_p_l,other,TRUE
+47,47,SVALUTAZIONI ,4,account_type_view,view,TRUE
+4701,4701,svalutazioni immobilizzazioni immateriali ,47,account_type_p_l,other,TRUE
+4702,4702,svalutazioni immobilizzazioni materiali ,47,account_type_p_l,other,TRUE
+4706,4706,svalutazione crediti ,47,account_type_p_l,other,TRUE
+48,48,ACCANTONAMENTI ,4,account_type_view,view,TRUE
+481,481,ACCANTONAMENTI PER RISCHI ,48,account_type_view,view,TRUE
+4814,4814,accantonamento per responsabilità civile ,481,account_type_p_l,other,TRUE
+482,482,ALTRI ACCANTONAMENTI ,48,account_type_view,view,TRUE
+4821,4821,accantonamento per spese future ,482,account_type_p_l,other,TRUE
+4823,4823,accantonamento per manutenzioni programmate ,482,account_type_p_l,other,TRUE
+49,49,ONERI DIVERSI ,4,account_type_view,view,TRUE
+4901,4901,oneri fiscali diversi ,49,account_type_p_l,other,TRUE
+4903,4903,oneri vari ,49,account_type_p_l,other,TRUE
+4905,4905,perdite su crediti ,49,account_type_p_l,other,TRUE
+4910,4910,arrotondamenti passivi ,49,account_type_p_l,other,TRUE
+4920,4920,minusvalenze ordinarie diverse ,49,account_type_p_l,other,TRUE
+4930,4930,sopravvenienze passive ordinarie diverse ,49,account_type_p_l,other,TRUE
+4940,4940,insussistenze passive ordinarie diverse ,49,account_type_p_l,other,TRUE
+5,5,PROVENTI E ONERI FINANZIARI ,0,account_type_view,view,TRUE
+51,51,PROVENTI FINANZIARI ,5,account_type_view,view,TRUE
+5110,5110,interessi attivi v/clienti ,51,account_type_p_l,other,TRUE
+5115,5115,interessi attivi bancari ,51,account_type_p_l,other,TRUE
+5116,5116,interessi attivi postali ,51,account_type_p_l,other,TRUE
+5140,5140,proventi finanziari diversi ,51,account_type_p_l,other,TRUE
+52,52,ONERI FINANZIARI ,5,account_type_view,view,TRUE
+5201,5201,interessi passivi v/fornitori ,52,account_type_p_l,other,TRUE
+5202,5202,interessi passivi bancari ,52,account_type_p_l,other,TRUE
+5203,5203,sconti passivi bancari ,52,account_type_p_l,other,TRUE
+5210,5210,interessi passivi su mutui ,52,account_type_p_l,other,TRUE
+5240,5240,oneri finanziari diversi ,52,account_type_p_l,other,TRUE
+7,7,PROVENTI E ONERI STRAORDINARI ,0,account_type_view,view,TRUE
+71,71,PROVENTI STRAORDINARI ,7,account_type_view,view,TRUE
+7101,7101,plusvalenze straordinarie ,71,account_type_p_l,other,TRUE
+7102,7102,sopravvenienze attive straordinarie ,71,account_type_p_l,other,TRUE
+7103,7103,insussistenze attive straordinarie ,71,account_type_p_l,other,TRUE
+72,72,ONERI STRAORDINARI ,7,account_type_view,view,TRUE
+7201,7201,minusvalenze straordinarie ,72,account_type_p_l,other,TRUE
+7202,7202,sopravvenienze passive straordinarie ,72,account_type_p_l,other,TRUE
+7203,7203,insussistenze passive straordinarie ,72,account_type_p_l,other,TRUE
+7204,7204,imposte esercizi precedenti ,72,account_type_p_l,other,TRUE
+8,8,IMPOSTE DELL'ESERCIZIO ,0,account_type_view,view,TRUE
+8101,8101,imposte dell'esercizio ,8,account_type_p_l,other,TRUE
+9,9,CONTI DI RISULTATO ,0,account_type_view,view,TRUE
+9101,9101,conto di risultato economico ,9,account_type_p_l,other,TRUE
+9102,9102,stato patrimoniale,9,account_type_p_l,other,TRUE
From dd04cb02567c49271612c1a5c3d7e8ab9b79f2ed Mon Sep 17 00:00:00 2001
From: "Ujjvala Collins (OpenERP)"
Date: Fri, 25 Nov 2011 15:17:15 +0530
Subject: [PATCH 024/224] [IMP] point_of_sale: Minor improvements.
bzr revid: uco@tinyerp.com-20111125094715-0ut1ehrr0mkamddf
---
addons/point_of_sale/report/pos_details.py | 2 +-
addons/point_of_sale/report/pos_details.rml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/addons/point_of_sale/report/pos_details.py b/addons/point_of_sale/report/pos_details.py
index 48f43a78d99..18546c89bbc 100644
--- a/addons/point_of_sale/report/pos_details.py
+++ b/addons/point_of_sale/report/pos_details.py
@@ -88,7 +88,7 @@ class pos_details(report_sxw.rml_parse):
def _paid_total_2(self):
return self.total or 0.0
- def _get_sum_dis_2(self,form):
+ def _get_sum_dis_2(self):
return self.discount or 0.0
def _get_sum_discount(self, objects):
diff --git a/addons/point_of_sale/report/pos_details.rml b/addons/point_of_sale/report/pos_details.rml
index 3402c7b6a91..027d7aec27e 100644
--- a/addons/point_of_sale/report/pos_details.rml
+++ b/addons/point_of_sale/report/pos_details.rml
@@ -373,7 +373,7 @@
Total discount
|
- [[ formatLang(getsumdisc(data['form']), dp='Sale Price') ]] [[ company.currency_id.symbol ]]
+ [[ formatLang(getsumdisc(), dp='Sale Price') ]] [[ company.currency_id.symbol ]]
|
From f211942d6a7b08b6f65bbfcd17c3d01da8ad39a2 Mon Sep 17 00:00:00 2001
From: "Naresh (OpenERP)"
Date: Wed, 30 Nov 2011 14:24:52 +0530
Subject: [PATCH 025/224] [FIX]:loading translation of .zip module
lp bug: https://launchpad.net/bugs/885134 fixed
bzr revid: nch@tinyerp.com-20111130085452-vcrxnv86avhfihom
---
openerp/addons/base/module/module.py | 2 +-
openerp/tools/translate.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/openerp/addons/base/module/module.py b/openerp/addons/base/module/module.py
index 8e8181c89a2..2955d1d33a2 100644
--- a/openerp/addons/base/module/module.py
+++ b/openerp/addons/base/module/module.py
@@ -542,13 +542,13 @@ class module(osv.osv):
if f2:
logger.info('module %s: loading base translation file %s for language %s', mod.name, iso_lang2, lang)
tools.trans_load(cr, f2, lang, verbose=False, context=context)
- context2['overwrite'] = True
# Implementation notice: we must first search for the full name of
# the language derivative, like "en_UK", and then the generic,
# like "en".
if (not f) and '_' in iso_lang:
iso_lang = iso_lang.split('_')[0]
f = addons.get_module_resource(mod.name, 'i18n', iso_lang + '.po')
+ context2['overwrite'] = True
if f:
logger.info('module %s: loading translation file (%s) for language %s', mod.name, iso_lang, lang)
tools.trans_load(cr, f, lang, verbose=False, context=context2)
diff --git a/openerp/tools/translate.py b/openerp/tools/translate.py
index e163c59a82f..72c8798ce84 100644
--- a/openerp/tools/translate.py
+++ b/openerp/tools/translate.py
@@ -840,7 +840,7 @@ def trans_generate(lang, modules, cr):
def trans_load(cr, filename, lang, verbose=True, context=None):
logger = logging.getLogger('i18n')
try:
- fileobj = open(filename,'r')
+ fileobj = misc.file_open(filename)
logger.info("loading %s", filename)
fileformat = os.path.splitext(filename)[-1][1:].lower()
r = trans_load_data(cr, fileobj, fileformat, lang, verbose=verbose, context=context)
From 04bdda2a295cae1222702b029fdaf61684142816 Mon Sep 17 00:00:00 2001
From: "Rucha (Open ERP)"
Date: Wed, 30 Nov 2011 18:12:10 +0530
Subject: [PATCH 026/224] [FIX]: account: Fixed problem of wrong journal code
generation and which causes installation of some modules break because of
unique constraints
bzr revid: rpa@tinyerp.com-20111130124210-a0rqbej550042kcg
---
addons/account/account.py | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/addons/account/account.py b/addons/account/account.py
index e41a5f2f280..441a28edc5a 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -3135,6 +3135,19 @@ class wizard_multi_charts_accounts(osv.osv_memory):
break
else:
current_num += 1
+
+ # we need to loop again to find next number for journal code
+ # because we can't rely on the value current_num as,
+ # its possible that we already have bank journals created (e.g. by the creation of res.partner.bank)
+ # and the next number for account code might have been already used before for journal
+ journal_count = 1
+ while True:
+ journal_code = _('BNK') + str(journal_count)
+ ids = obj_journal.search(cr, uid, [('code', '=', journal_code)], context=context)
+ if not ids:
+ break
+ journal_count += 1
+
vals = {
'name': tmp,
'currency_id': line.currency_id and line.currency_id.id or False,
@@ -3150,7 +3163,7 @@ class wizard_multi_charts_accounts(osv.osv_memory):
#create the bank journal
vals_journal = {
'name': vals['name'],
- 'code': _('BNK') + str(current_num),
+ 'code': journal_code,
'type': line.account_type == 'cash' and 'cash' or 'bank',
'company_id': company_id,
'analytic_journal_id': False,
From 0de12c221dfc4f4983b94f251063506e540f769d Mon Sep 17 00:00:00 2001
From: "Bhumi Thakkar (Open ERP)"
Date: Wed, 7 Dec 2011 11:35:55 +0530
Subject: [PATCH 027/224] [IMP] When URL contains '#' then Move on Login Page.
bzr revid: bth@tinyerp.com-20111207060555-gf7oftsdl9isajtw
---
addons/web_mobile/static/src/web_mobile.html | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/addons/web_mobile/static/src/web_mobile.html b/addons/web_mobile/static/src/web_mobile.html
index 3d91fb405c2..51f7633bdda 100755
--- a/addons/web_mobile/static/src/web_mobile.html
+++ b/addons/web_mobile/static/src/web_mobile.html
@@ -38,7 +38,10 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ &openerp.paresent;
+
+
+
+
+ &develop.value;
+
+
+
+ &information.value;
+ &openerp.value;
+
+ &axelor.value;
+ &tinyerp.value;
+
+
+ Copyright © 2006-TODAY OpenERP SA All Rights Reserved.
+ OpenERP is a trademark of the OpenERP SA Company. OpenERP Web is jointly developed by OpenERP SA & Axelor.
+ Licenced under the terms of OpenERP Public License (OEPL) v1.1 (https://tiny.odoo.com/LICENSE.txt)
+
+
+
+
+
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/config_change.xul b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/config_change.xul
new file mode 100644
index 00000000000..00a4869b68f
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/config_change.xul
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/create.xul b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/create.xul
new file mode 100644
index 00000000000..6ad5bc6b351
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/create.xul
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/js/config.js b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/js/config.js
new file mode 100644
index 00000000000..0f209b89ea3
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/js/config.js
@@ -0,0 +1,122 @@
+function load_config_data() {
+ getDbList('DBlist');
+ document.getElementById("txturl").value = getServer();
+ document.getElementById("txtusername").value = getUsername();
+ document.getElementById("txtpassword").value = getPassword();
+ document.getElementById("DBlist_text").value = getDbName();
+}
+
+function config_close() {
+ window.close("chrome://openerp_plugin/content/config_change.xul", "", "chrome");
+ window.open("chrome://openerp_plugin/content/config.xul", "", "chrome");
+}
+
+//set the value of the configuration fields
+function config_change_load() {
+ document.getElementById('txtcurl').value = getPreferenceDefault('server_name', 'localhost')
+ document.getElementById('txtcport').value = getPreferenceDefault('serverport', '8069')
+}
+
+
+function config_ok()
+{
+ var protocol = document.getElementById("dbprotocol_list").value
+ if (document.getElementById('txtcurl').value == '' || document.getElementById('txtcport').value == '') {
+ alert("You Must Enter Server Name and a Port!")
+ return false;
+ }
+ setPreference('serverport', document.getElementById('txtcport').value)
+ setPreference('server_name', document.getElementById('txtcurl').value)
+ setServer(document.getElementById("dbprotocol_list").value+document.getElementById('txtcurl').value +":" + document.getElementById('txtcport').value);
+ config_close()
+}
+
+function openConfigChange() {
+ window.close("chrome://openerp_plugin/content/config.xul", "", "chrome");
+ window.open("chrome://openerp_plugin/content/config_change.xul", "", "chrome");
+}
+
+//xmlrpc request handler for getting the list of database
+var listDbHandler = {
+ onResult: function(client, context, result) {
+ netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
+ var arrMethodList = result.QueryInterface(Components.interfaces.nsISupportsArray);
+ var count = arrMethodList.Count();
+ if (count < 1) {
+ setDBList("false");
+ return
+ }
+
+ setDBList("true");
+ dbname_saved = getPreference("serverdbname")
+
+ var menu1 = document.createElement("menulist");
+ menu1.setAttribute("id","DBlist");
+ menu1.setAttribute("width","300");
+ var menupopup1 = document.createElement("menupopup");
+ menu1.appendChild(menupopup1)
+
+ // Loop through the results, adding items to the list
+ for (i = 0; i < count; i++) {
+ var dbname = arrMethodList.QueryElementAt(i, Components.interfaces.nsISupportsCString).data;
+ menupopup1.appendChild(createMenuItem(dbname, dbname));
+ if (dbname == dbname_saved) {
+ index = i
+ }
+ }
+
+ var db_text_field = document.getElementById("DBlist_text");
+ db_text_field.parentNode.replaceChild(menu1, db_text_field);
+
+ menu1.selectedIndex = index
+ },
+
+
+ onFault: function (client, ctxt, fault) {
+ setDBList("false");
+ },
+
+ onError: function (client, ctxt, status, errorMsg) {
+ setDBList("false");
+ }
+};
+//function to get the database list
+function getDbList(argControl) {
+ setDBList("false");
+ setServerService('xmlrpc/db');
+ netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
+ var xmlRpcClient = getXmlRpc();
+ var cmbDbList = document.getElementById(argControl);
+
+ xmlRpcClient.asyncCall(listDbHandler,cmbDbList,'list',[],0);
+ return [];
+}
+
+
+function check_database() {
+ if (getDBList()=="false") {
+ if (document.getElementById('DBlist_text').value =='') {
+ alert("You Must Enter Database Name.");
+ return false;
+ }
+ return document.getElementById('DBlist_text').value;
+ }
+ else {
+ return document.getElementById('DBlist').value;
+ }
+
+}
+
+function connection() {
+ callback = check_connection(login_success)
+ setPreference('serverdbname', check_database())
+ setServer(document.getElementById('txturl').value);
+ setUsername(document.getElementById('txtusername').value);
+ setPassword(document.getElementById('txtpassword').value);
+ login()
+}
+//function to check the login information
+function login_success() {
+ alert("login successfull");
+ window.close("chrome://openerp_plugin/content/config.xul", "", "chrome");
+}
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/js/create.js b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/js/create.js
new file mode 100644
index 00000000000..21faf9f7949
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/js/create.js
@@ -0,0 +1,126 @@
+function load_createContact() {
+ log_message("info : " + getPreference('senderemail') + ", " + getPreference('sendername'))
+ document.getElementById("txtname").value = getSenderName();
+ document.getElementById("txtemail").value = getSenderEmail();
+ setPartnerId(0);
+}
+
+//function to create the xmlrpc supported variables for xmlrpc request
+function dictcontact(a,b){
+ var temp = xmlRpcClient.createType(xmlRpcClient.ARRAY,{});
+ for(i=0;i 1) {
+ alert("You must select only one mail to archive");
+ return false
+ }
+ return fun()
+ }
+ if(getPreference('userid', 'INT') == 0 || getmodule_install() == "no") {
+ callback = check_connection(cb)
+ login()
+ return False
+ }
+
+ return cb()
+
+}
+
+function searchmail()
+{
+ var prefService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
+ var dirService = Components.classes["@mozilla.org/file/directory_service;1"].
+ getService(Components.interfaces.nsIProperties).get("Home", Components.interfaces.nsIFile);
+
+
+ //gives the selected email uri
+ var messageUri= gDBView.URIForFirstSelectedMessage;
+
+ var messenger = Components.classes['@mozilla.org/messenger;1'].createInstance(Components.interfaces.nsIMessenger);
+
+ //gives the selected email object
+ var message = messenger.messageServiceFromURI(messageUri).messageURIToMsgHdr(messageUri);
+
+ //gives the received email date
+ var stdate = new Date(message.date / 1000);
+
+ //functionality to split the author name and email
+ if(message.author.charAt(0) == '"'){
+ sendername = message.author.split('"')[1].split('"')[0];
+ }
+ else if(message.author.indexOf('<')!=-1){
+ sendername = message.author.split('<')[0];
+ }
+ else{
+ sendername = message.author;
+ }
+ if(message.author.indexOf('<')!=-1){
+ senderemail = message.author.split('<')[1].split('>')[0];
+ }
+ else{
+ senderemail = message.author
+ }
+
+ //gives the receiver email address
+ receiveremail = message.mime2DecodedRecipients;
+
+ //parsing the received date in the particular format
+ receivedDate = stdate.getFullYear()+'/'+(stdate.getMonth()+1)+'/'+stdate.getDate();
+
+ //gives the selected email subject
+ subject = message.subject;
+ log_message("subject: " + subject)
+ var uri = message.folder.getUriForMsg(message);
+ var messagebody = getMessage(uri);
+ getPref().setCharPref('email_text', messagebody);
+
+
+ //set the initial information for the selected email
+ window.open("chrome://openerp_plugin/content/push.xul", "", "chrome, resizable=yes");
+}
+
+
+var openPartnerHandler = {
+ onResult: function(client, context, result) {
+ log_message('get partner')
+ log_message(1)
+ res = extract_data(result)
+ log_message(2)
+ log_message(res[RES_ID])
+ log_message(3)
+ log_message(res[URL])
+ log_message(4)
+ if(res[RES_ID]==0)
+ {
+ alert("Partner is not Available.");
+ window.open("chrome://openerp_plugin/content/create.xul", "", "chrome, resizable=yes");
+ return;
+ }
+ open_url(res[URL])
+
+
+ },
+ onFault: function (client, ctxt, fault) {
+ log_message(fault);
+ },
+
+ onError: function (client, ctxt, status, errorMsg) {
+ log_message(errorMsg)
+ }
+
+}
+
+function searchPartner(email)
+{
+ setServerService('xmlrpc/object');
+ netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
+
+ var xmlRpcClient = getXmlRpc();
+ var strDbName = get_rpc_string(xmlRpcClient, getPreference("serverdbname"));
+ var struid = get_rpc_int(xmlRpcClient, getPreference('userid', 'INT'));
+ var strpass = get_rpc_string(xmlRpcClient, getPreference("password"));
+ var strobj = get_rpc_string(xmlRpcClient, 'plugin.handler');
+ var strmethod = get_rpc_string(xmlRpcClient, 'partner_get');
+ var strname = get_rpc_string(xmlRpcClient, email);
+ xmlRpcClient.asyncCall(openPartnerHandler,null,'execute',[ strDbName,struid,strpass,strobj,strmethod,strname ],6);
+}
+
+
+function open_partner()
+{
+ //gives the selected email uri
+ var messageUri= gDBView.URIForFirstSelectedMessage;
+
+
+ var messenger = Components.classes['@mozilla.org/messenger;1'].createInstance(Components.interfaces.nsIMessenger);
+
+ //gives the selected email object
+ var message = messenger.messageServiceFromURI(messageUri).messageURIToMsgHdr(messageUri);
+ //functionality to split the author name and email
+ if(message.author.charAt(0) == '"'){
+ sendername = message.author.split('"')[1].split('"')[0];
+ }
+ else if(message.author.indexOf('<')!=-1){
+ sendername = message.author.split('<')[0];
+ }
+ else{
+ sendername = message.author;
+ }
+ if(message.author.indexOf('<')!=-1){
+ senderemail = message.author.split('<')[1].split('>')[0];
+ }
+ else{
+ senderemail = message.author;
+ }
+ setPreference('senderemail', senderemail);
+ setPreference('sendername', sendername);
+ searchPartner(senderemail);
+}
+
+
+var listDocumentHandler = {
+ onResult: function(client, context, result) {
+ res = extract_data(result)
+ log_message("open document")
+ if(res[RES_ID]==0) {
+ alert("Document is not available.");
+ window.open('chrome://openerp_plugin/content/push_dialog.xul', '', 'chrome', resizable='yes');
+ document.getElementById('message_label').setAttribute('value', 'No document was found');
+ }
+ else {
+ open_url(res[URL])
+ }
+
+ },
+ onFault: function (client, ctxt, fault) {
+ log_message(fault);
+ },
+
+ onError: function (client, ctxt, status, errorMsg) {
+ log_message(errorMsg)
+ }
+}
+
+function open_document() {
+ var prefService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
+
+ //gives the selected email uri
+ var messageUri = gDBView.URIForFirstSelectedMessage;
+
+ var branchobj = getPref();
+
+ setServerService('xmlrpc/object');
+ netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
+
+ var xmlRpcClient = getXmlRpc();
+ var strDbName = get_rpc_string(xmlRpcClient, branchobj.getCharPref("serverdbname"));
+ var struids = get_rpc_int(xmlRpcClient, branchobj.getIntPref('userid'));
+ var strpass = get_rpc_string(xmlRpcClient, branchobj.getCharPref("password"));
+ var strmethod = get_rpc_string(xmlRpcClient, 'document_get');
+
+ var strobj = get_rpc_string(xmlRpcClient, 'plugin.handler');
+
+ var eml_string = getMessage(messageUri);
+ var email = get_rpc_string(xmlRpcClient, eml_string);
+ xmlRpcClient.asyncCall(listDocumentHandler,null,'execute',[strDbName,struids,strpass,strobj,strmethod, email],6);
+}
\ No newline at end of file
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/js/push.js b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/js/push.js
new file mode 100644
index 00000000000..86596397c99
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/js/push.js
@@ -0,0 +1,187 @@
+//xmlrpc request handler for list of search object exist in database or not.
+var DocumentTypeHandler = {
+ onResult: function(client, context, result) {
+ netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
+ var modelListRPC = result.QueryInterface(Components.interfaces.nsISupportsArray);
+
+ var menu_popup = document.getElementById("model_list");
+ log_message("count : " + modelListRPC.Count())
+ for(i = 0; i < modelListRPC.Count(); i++) {
+ var temp_array = modelListRPC.QueryElementAt(i, Components.interfaces.nsISupportsArray);
+ var model_value = temp_array.QueryElementAt(0, Components.interfaces.nsISupportsCString);
+ var model_name = temp_array.QueryElementAt(1, Components.interfaces.nsISupportsCString);
+ if(i == 0) {
+ var menuitem = document.getElementById("first_model_list");
+ menuitem.setAttribute("label", model_name);
+ menuitem.setAttribute("value", model_value);
+ }
+ else {
+ menu_popup.appendChild(createMenuItem(model_name, model_value));
+ }
+
+ }
+ },
+
+ onFault: function (client, ctxt, fault) {
+ log_message("Fault getDocument : " + fault)
+ },
+
+ onError: function (client, ctxt, status, errorMsg) {
+ log_message("Error getDocument : " + errorMsg)
+ }
+}
+
+//function to create a new attachment record
+function getDocumentType(){
+ setServerService('xmlrpc/object');
+ netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
+ var xmlRpcClient = getXmlRpc();
+ var strDbName = get_rpc_string(xmlRpcClient, getPreference("serverdbname"));
+ var struid = get_rpc_int(xmlRpcClient, getPreference('userid', 'INT'));
+ var strpass = get_rpc_string(xmlRpcClient, getPreference("password"));
+ var strobj = get_rpc_string(xmlRpcClient, 'plugin.handler');
+ var strmethod = get_rpc_string(xmlRpcClient, 'document_type');
+ xmlRpcClient.asyncCall(DocumentTypeHandler,null,'execute',[strDbName,struid,strpass,strobj,strmethod], 5);
+}
+
+/**
+ * Return the current operation :
+ * add or create
+ */
+function getOperation() {
+ var operation = document.getElementById('operation').selectedItem;
+ return operation.value
+}
+
+function changeForm() {
+
+ var hidden = false
+
+ if(getOperation() == "create") {
+ hidden = true
+ }
+ document.getElementById('label_box').hidden = hidden
+ document.getElementById('listSearchBox').hidden = hidden
+ document.getElementById('lblsearch').hidden = hidden
+ document.getElementById('txtvalueobj').hidden = hidden
+ document.getElementById('search_button').hidden = hidden
+}
+
+
+
+/**
+ * Search Handler : Fill the result of list_document_get in the listbox
+ */
+//xmlrpc request handler for getting the search results for the particular selected check box object
+var listSearchCheckboxHandler = {
+ onResult: function(client, context, result) {
+ netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
+ var arrMethodList = result.QueryInterface(Components.interfaces.nsISupportsArray);
+ // Set the number of results
+ var count = arrMethodList.Count();
+ var close=0;
+ clear_search_box('listSearchBox')
+ if(count == 0){
+ alert("No Records Found");
+ return false;
+ }
+ log_message("count on result : " + count)
+
+ // Loop through the results, adding items to the list
+ var cmbSearchList = document.getElementById('listSearchBox');
+
+ for (i = 0; i < count; i++) {
+ var temp = arrMethodList.QueryElementAt(i, Components.interfaces.nsISupportsArray);
+ log_message(temp)
+ id = temp.QueryElementAt(0, Components.interfaces.nsISupportsPRInt32);
+ name = temp.QueryElementAt(1, Components.interfaces.nsISupportsCString);
+ log_message(id + " " + name)
+ var listItem = document.createElement("listitem");
+ cmbSearchList.appendItem(name, id)
+ }
+ },
+
+ onFault: function (client, ctxt, fault) {
+ log_message(fault)
+ },
+
+ onError: function (client, ctxt, status, errorMsg) {
+ log_message(errorMsg)
+ }
+};
+
+//function to search the records of selected checkbox object
+function searchCheckbox()
+{
+ model_name = document.getElementById('menu_model_list').selectedItem.value;
+ name = document.getElementById('txtvalueobj').value
+
+ setServerService('xmlrpc/object');
+ netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
+ var xmlRpcClient = getXmlRpc();
+ var cmbSearchList = document.getElementById('listSearchBox');
+ var strDbName = get_rpc_string(xmlRpcClient, getPreference("serverdbname"));
+ var struid = get_rpc_int(xmlRpcClient, getPreference('userid', 'INT'));
+ var strpass = get_rpc_string(xmlRpcClient, getPreference("password"));
+ var strmethod = get_rpc_string(xmlRpcClient, 'list_document_get');
+ var strobj = get_rpc_string(xmlRpcClient, 'plugin.handler');
+ var strmodel = get_rpc_string(xmlRpcClient, model_name);
+ var strname = get_rpc_string(xmlRpcClient, name);
+
+ xmlRpcClient.asyncCall(listSearchCheckboxHandler,cmbSearchList,'execute',[ strDbName,struid,strpass,strobj,strmethod, strmodel, strname],7);
+}
+
+
+
+//xmlrpc request handler for creating the record of mail
+var pushHandler = {
+ onResult: function(client, context, result) {
+ log_message("push finished")
+ netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
+ var message = result.QueryInterface(Components.interfaces.nsISupportsCString);
+ log_message(message)
+ alert(message)
+ window.close();
+ },
+
+ onFault: function (client, ctxt, fault) {
+ log_message(fault)
+ },
+
+ onError: function (client, ctxt, status, errorMsg) {
+ log_message(errorMsg)
+ }
+}
+
+
+function push() {
+ var model_name = document.getElementById('menu_model_list').selectedItem.value;
+ var res_id = 0;
+ if(getOperation() == "add") {
+ var item = document.getElementById('listSearchBox').selectedItem
+ if (String(item) == "null") {
+ alert("select at least one Document !")
+ return
+ }
+
+ var res_id = item.value;
+
+ }
+ log_message("model :" + model_name + ", res_id : " + res_id)
+ setServerService('xmlrpc/object');
+ netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
+ var xmlRpcClient = getXmlRpc();
+
+ var strDbName = get_rpc_string(xmlRpcClient, getPreference("serverdbname"));
+ var struid = get_rpc_int(xmlRpcClient, getPreference('userid', 'INT'));
+ var strpass = get_rpc_string(xmlRpcClient, getPreference("password"));
+ var strmethod = get_rpc_string(xmlRpcClient, 'push_message');
+ var strobj = get_rpc_string(xmlRpcClient, 'plugin.handler');
+ var stremail = get_rpc_string(xmlRpcClient, getPreference('email_text'));
+ var strmodel = get_rpc_string(xmlRpcClient, model_name);
+ var strres_id = get_rpc_int(xmlRpcClient, res_id);
+ xmlRpcClient.asyncCall(pushHandler,null,'execute',[strDbName,struid,strpass,strobj,strmethod,strmodel, stremail, strres_id],8);
+}
+
+
+
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/js/tiny_xmlrpc.js b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/js/tiny_xmlrpc.js
new file mode 100644
index 00000000000..a553010c624
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/js/tiny_xmlrpc.js
@@ -0,0 +1,423 @@
+/************************************************************
+* OpenERP, Open Source Management Solution
+* Copyright (C) 2004-2010 Tiny SPRL ().
+*
+* 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 .
+***************************************************************/
+
+var xmlRpcClient;
+
+//Service name on server like /common,/db etc...
+var strServerService;
+
+
+var uri = new Array();
+var name = new Array();
+var rpc= {
+ servers: {},
+ addserver: function(name,ip,port,path) {
+ netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
+ this.servers[name]= {
+ ip: ip,
+ port: port,
+ path: path,
+ avaible: true,
+ sock: Components.classes['@mozilla.org/xml-rpc/client;1'].createInstance(Components.interfaces.nsIXmlRpcClient)};
+ },
+ getany: function(rpcval,n) {
+ netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
+ var t = ['PRUint8','PRUint16','PRInt16','PRInt32','PRBool','Char','CString','Float','Double','PRTime','InputStream','Array','Dictionary'];
+ for (var i=0; i0)
+ for (var i=0; i"+params[0];
+ msg+= "\n3. Your server may not be launched or connected to the network.";
+ }
+ func_out([false,'error '+status,msg]);
+ } };
+ var p = [];
+ for (var i=0; i
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/push.xul b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/push.xul
new file mode 100644
index 00000000000..b9a17df485f
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/push.xul
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/push_dialog.xul b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/push_dialog.xul
new file mode 100644
index 00000000000..a8d7531e470
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/push_dialog.xul
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/selectpartner.xul b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/selectpartner.xul
new file mode 100644
index 00000000000..b999bc8c33d
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/selectpartner.xul
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/style.css b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/style.css
new file mode 100644
index 00000000000..8e490b773b5
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/content/style.css
@@ -0,0 +1,4 @@
+.text-prompt {
+ padding-top: .25em;
+ text-align: right;
+}
\ No newline at end of file
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/address.dtd b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/address.dtd
new file mode 100644
index 00000000000..3dd37445ada
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/address.dtd
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/config.dtd b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/config.dtd
new file mode 100644
index 00000000000..711190962a6
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/config.dtd
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/config_change.dtd b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/config_change.dtd
new file mode 100644
index 00000000000..19558a9f077
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/config_change.dtd
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/create.dtd b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/create.dtd
new file mode 100644
index 00000000000..bb5f2c34be6
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/create.dtd
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/mboximport.properties b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/mboximport.properties
new file mode 100644
index 00000000000..33845423f7d
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/mboximport.properties
@@ -0,0 +1,31 @@
+nomboxfile=není mbox souborem
+folderexists=Není možné importovat: složka se stejným názvem již existuje
+fileexists=Není možné importovat: soubor se stejným názvem již existuje
+nowritable=Není možné importovat: nemáte právo zápisu do složky
+exportOK=Export byl úspěšně dokončen
+isNewsgroup=Tato funkce není dostupná: export složky z IMAP účtů nebo diskuzních \nskupin je možný, pouze pokud je nastavené čtení v režimu Offline
+nofolder=Nebyla vybrána žádná cílová složka
+badfolder=Není možné importovat do této složky (typ IMAP nebo diskuzní skupina)
+exportAccount=Export všech složek
+exportFolder=Export složky
+filePickerImport=Výběr souboru k importu
+filePickerExport=Výběr cílové složky
+extensions.{3ed8cc52-86fc-4613-9026-c1ef969da4c3}.description=Umožňuje import a export souborů ve formátu mbox a eml
+virtualfolder=Toto je virtuální složka. Pro export jejich\nzpráv musíte tyto zprávy nejdříve\nzkopírovat do normální složky.
+searchdir=Vyberte složku, ve které budou vyhledány mbox soubory
+confirmimport=Chcete importovat soubor?
+endscan=Konec prohledávání složek
+internalerror=Není možné provést import, protože nastala neznámá chyba
+exportstart=Probíhá export, čekejte prosím...
+exported=Exportovalo se
+msgs=zpráv z
+nosubjectmsg=bez_predmetu
+messsubdir=zprávy
+badfolder2=Není možné importovat do této složky (IMAP nebo diskuzní skupina nebo virtuální složka)
+temp_error=Není možné importovat: nastala chyba při vytváření dočasného souboru
+importEMLstart=Pobíhá import, čekejte prosím...
+numEML=Naimportovány eml soubory:
+CSVseparator=,
+noEML=No eml file found in this directory
+backupWarning=During this operation, the program could be\nunresponsive for some minutes.\nDo you want to go on?\n
+noWaring=Don't show again this warning
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/overlay.dtd b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/overlay.dtd
new file mode 100644
index 00000000000..e649eb92ced
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/overlay.dtd
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/plugin.dtd b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/plugin.dtd
new file mode 100644
index 00000000000..cd00045c22a
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/plugin.dtd
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/selectpartner.dtd b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/selectpartner.dtd
new file mode 100644
index 00000000000..d568b96a4ca
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/locale/en-US/selectpartner.dtd
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/skin/Archive.png b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/skin/Archive.png
new file mode 100644
index 0000000000000000000000000000000000000000..5aa6a958d37c9844da02831405fcb07517125a60
GIT binary patch
literal 852
zcmV-a1FQUrP)SdYV3XJBw(p-``H8?dxEwPrAcCG+s=FRMWyWRfS
zIS1z)V1~ahYrL2$^4uZ!4n%;e5wo40B5RNGYeE#fJj1&jF=Wk)49J?*OXGECMrwnXM9pfayGe
z6JX}Bv9XC|Os)=VBcznT%u3{7YA_gB1R(}278O(h=LibIvKF_jWiy*hChqj~G(R~x
zX^qF@-Me=`x-}ZzhT1BHu)vuBDWEI?A`hYr%a9P+T0X|Ob8v9*#?jHy4Q6@&!GkZp
zBA;cZ235mkG6fQYCE;SegmVs#JUA)(9ruX#_xH=eV9*56&+}}%C^BLeuq3D&x?5eS
z8JGjAa*lE_LsibfA%IgN+S}WU!{IOk&n}e){q6YoVePlxY8C$Jy${~~
z@soS+{dE16e(C;u=en-x(ed${+dIA6uf2Y=(`q%xMV|lZJzb8+V|)0`_n)EIyz}|}
z55Ilq&fAZ(Y;^(u0xXEot3Q!;eE2D?
eNY%?PN(TTo*alb-Q_5Tb00004W+J
literal 0
HcmV?d00001
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/skin/Create.png b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/skin/Create.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ab240c32cb51af726eaef02f21bae6ed0286e29
GIT binary patch
literal 888
zcmV-;1Bd*HP)Tx@E2r30#%|SK-J)nsWQvKkW~9Ha9lD^$w4YR(E&zzU*|`)4s0}2PlIv2BQtuIacTUynE#z?jEkwI=KkL
zLF<#5*^~1qitc%!bQ}*rQYDrMZ5-sMH>0gu`VX6mZy^*fZN
ziVCH)rxaM5lDP{UMW(8ndZSFWrim|e-kU$h?>=ICaGlCxopf@^Xfj0U*HD0`ltRc6
z)59-SD2D|ab3R!gjE@6Wrp1kG}vB&dyF5
z4r4seP%H#!qfrVblSG`e&innh?I(ZSe{ef2mzQq6v+&`apUP*yv`?OvfBs5OCga2y
zlZ9dEv{n`&FBF5kR4Tb@wR*U+y!=@8`+eH&Ha~p--CGBH_dk1nKEAWI`S$ZSS5{K3
zb*8nJMx!CV?>l3RtJmwUQmII@*`!{tqeO&WugBKbR%2mtfsOTzZWKi*rFa$o1-i+b
zTx>oIZvX%QB6?I2D?NY%?PN(TTo*alb-Q_5Tb
O0000f$)el7O-HY
z9tfL_B*|icJOB-bRRJ^rGy_xuTnCt8u@;7gNPz&=)Cl3iEK>IyQC};Iq;Aab$#)
z%ezZUmqS8+A@njVY~kCtWpD3Ksi}|FVW;y4LFfTUt93Fm@ET&GrkR$IWegy#-*v@y8-jNk)b}HufmMYpu4AMtiSTTQ+T~0O*iNUSZfc
zmHN|ex6IEwLc>U{)_U&TSF!ky&E|UZW+5%DpT~P36i)Z|YqZ)aJ|86|EiErUY-;Mk
zusNsG#AIFu&|SSs(CM{mHK|ZM4-Q6m?l?>)-N}>s!a@U=W2ml1`T2^R9EDWc5iKD0
z?L#RkNU3zDrz3>EOwYpq{CffJDis5$hoB8);}bx)f{@{9*VOkG(}jx0hB-vbbg?;w=UX~;b2cEB(Q^1TXYpBEM{=eg}8x9qfA}xbM4q*gD8$m+jjq!
zU%K+j{@d=M*{Tpp`Auc8D&Eqen=$)FM$yXy3q%!OTdK-0Iw%yqS2%vjlY0KZFjE{I
zeWHE=ujDDXHp8yYV1Eak-
z(VLvGK)@hL_)Ki|-~Z2w`2&yC^gfYPW6w@nk$y1kK-=VU38mOxiGB6ISj3&p1=ch2
z0KxBh{}U^|eBx&Y0_Ubi0licnpB*X{7BeL*e(WgBQhC8-rsv1@uKvvv=>vz3ol-dS
zcYb4IV|!zBfA0pyo!RUE-!J&Y*QFwFt$g_QdX9ZgU;F;^@T@RoGEaDVu9%1I-@Ag_
zi4HSn_dYx_+n#6NJTZ`+Jag{vH(Fy=AgR|cv_2`*`+xS%TZS773l~Wg{lDwa1_I)l
zW^HG0`y1F~d`&o##js1!;CjukpYsm}G%z|FhcR!EOj0~_XhVkZva~%8I=L_F+pqTj
szdrZR2YImy73PgwmOjZ|Ce6TL@i4;H`TR*IV309*y85}Sb4q9e07!I;iU0rr
literal 0
HcmV?d00001
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/skin/MoveLeft.png b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/skin/MoveLeft.png
new file mode 100644
index 0000000000000000000000000000000000000000..031d75326731aaebaab1c805385bcba28d688722
GIT binary patch
literal 363
zcmV-x0hIoUP)xM+dLJU}_TL_{ch>fXI1jJZG1$)bMd4jF;
z1bKr%8bJ^(Tu?+LMXXcU2&R{n<&x|EL~<<*QQUPkm7aFyd}n4D_}9u+nyPwouabIF
zN#>3H9Zv5a5<_AExk^*5Z5MturS_fK$Y#)u2|AazvBra~W$K5knx13^SRYRE8ukfa
zJbK=M;=IoBO$Puy&iqv(P&jgcbo=;1;!S?!j&6{ho29Tg{Z1XGi$L-C9N@?h>Gtr2
zjKD{zZmpy>u+`CCp6e%tBSRLZQWQ-C0AHkmGyt9uQNU+Nc{k6Mgq0bc##uY|h~>>C
z>ai8Tv}{#vxvJW7m1)`IKT@|=(#|j1WW4CkW68AaA7A_{rdX)-~a#P|NrFw|J>Z%f`gIs|Nq7J
z|MTuzR@&Et-{;bIA
z%J%=X&g%OA|GVw~+5i8#?f>QFRHKdxW{<|J3C3
ztl?p`z^n|NN{)yX*h`{r>;gotCJ!^Uj&Hu(p|WhW(~F$j;@vyS}`<
z$==@VudT4Kyxo|t&a8xK%GT)r|Nj6000000000000000000000A^8LW004OaEC2ui
z01yBW000N0fO&$0goTEJ3l??~CN%(ud1*r|K13f{WEX}3a8FcDP$OIsa)vz}98)0`
zLSG6F1BG)(6fH$r1q2`~kAx{38C5?931$Rqy@LUDHeCz_9!fGmv4dAgaV}_ENd|ac
zGlUvyBzH|>U=uMnWjTW?MrRNWJ3MVPbO%d=SXNA9Fr;9}6F`7~LTuig(1GFwBta#@
UxIrM|p&%R&q6D$X(NG`&JK*76MF0Q*
literal 0
HcmV?d00001
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/skin/Success.gif b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/skin/Success.gif
new file mode 100644
index 0000000000000000000000000000000000000000..fb3bff729c518ced2d1181797fb68004028c244f
GIT binary patch
literal 604
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
literal 0
HcmV?d00001
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/skin/openerp.png b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/skin/openerp.png
new file mode 100644
index 0000000000000000000000000000000000000000..326798df2ecca062f1584e085e0773ceb222cde0
GIT binary patch
literal 2611
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
VC0h80c>MqX002ovPDHLkV1mus*fRhC
literal 0
HcmV?d00001
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/skin/tinyerp-icon.ico b/addons/plugin_thunderbird/plugin/openerp_plugin/chrome/openerp_plugin/skin/tinyerp-icon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..0057dc4c879fae2ec175e2f2a7bf01ff8affe0ff
GIT binary patch
literal 1150
zcmah|TS${(82+?mGh8kqAv%dpF|-pIO0!xf7O6PbMMOp^DCmB>G-b%lMpF^a56PD)t-}+^HQ(ZztHJ)HqsRkRuldyAt50uG8{LX
z%>xf@Hq_SEqN=J2ckkSRR41XKz5(aX756KZ$^)UHp^Fv;oTqGpuaOB8QSglsx+SR@9sZ%EO_xEFb>=){!cG9~L6Z1}vam;8$M@I)HCMIAuo3=}mR6#x9&>=TAY#63|
zHWU^bF*rDgxw$!E!r{Z6SigQ4(a~MhO9~nq>cKfjPft&&+wFcNI409qq@;KdAK!`e
z^lY@XwZZ4}5fA9@p2U_d6G%$((oD>_eEAZlrlv45G9pooCgERKH;c41VAn2S?b;07
zzFm#c(NSTNB`eE=ZQJ}*!z=3bglwChp09e91g8a0Jzoqp6dKgJ$|7+a%f-I(c9aLnVA`s
zm%GXL2cn|h;>;Nfbp?1lo*iO`Ua$8PJ<2+Rp$QsIJC-lM2ZP}l%}RpX?LubeC9GM~
ziKR<#@;7g~Xng$ZpZ&9;p`j!ZPs~(EetsqGsuU{KMa0GBVe{rZdY>#bySvoaRhi@W
z`?Udoanf_1@E3uJz@5$xWM!SC_iqmv+kuFPOm4B (original author)
+ * Samuel Sieb
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/*
+ * nsXmlRpcClient XPCOM component
+ * Version: $Revision: 1.39 $
+ *
+ * $Id: nsXmlRpcClient.js,v 1.39 2006/10/24 16:02:01 silver%warwickcompsoc.co.uk Exp $
+ */
+
+/*
+ * Constants
+ */
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+const XMLRPCCLIENT_CONTRACTID = '@mozilla.org/xml-rpc/client;1';
+const XMLRPCCLIENT_CID =
+ Components.ID('{4d7d15c0-3747-4f7f-b6b3-792a5ea1a9aa}');
+const XMLRPCCLIENT_IID = Components.interfaces.nsIXmlRpcClient;
+
+const XMLRPCFAULT_CONTRACTID = '@mozilla.org/xml-rpc/fault;1';
+const XMLRPCFAULT_CID =
+ Components.ID('{691cb864-0a7e-448c-98ee-4a7f359cf145}');
+const XMLRPCFAULT_IID = Components.interfaces.nsIXmlRpcFault;
+
+const XMLHTTPREQUEST_CONTRACTID = '@mozilla.org/xmlextras/xmlhttprequest;1';
+
+const NSICHANNEL = Components.interfaces.nsIChannel;
+
+const DEBUG = false;
+const DEBUGPARSE = false;
+
+const DOMNode = Components.interfaces.nsIDOMNode;
+/*
+ * Class definitions
+ */
+
+/* The nsXmlRpcFault class constructor. */
+function nsXmlRpcFault() {}
+
+/* the nsXmlRpcFault class def */
+nsXmlRpcFault.prototype = {
+ faultCode: 0,
+ faultString: '',
+
+ init: function(faultCode, faultString) {
+ this.faultCode = faultCode;
+ this.faultString = faultString;
+ },
+
+ toString: function() {
+ return '';
+ },
+
+ // nsISupports interface
+ QueryInterface: function(iid) {
+ if (!iid.equals(Components.interfaces.nsISupports) &&
+ !iid.equals(XMLRPCFAULT_IID))
+ throw Components.results.NS_ERROR_NO_INTERFACE;
+ return this;
+ }
+};
+
+/* The nsXmlRpcClient class constructor. */
+function nsXmlRpcClient() {}
+
+/* the nsXmlRpcClient class def */
+nsXmlRpcClient.prototype = {
+ _serverUrl: null,
+ _useAuth: false,
+
+ classDescription: "nsXmlRpcClient XPCOM component",
+ classID: Components.ID("{4d7d15c0-3747-4f7f-b6b3-792a5ea1a9aa}"),
+ contractID: "@mozilla.org/xml-rpc/client;1",
+
+ init: function(serverURL) {
+ this._serverUrl = serverURL;
+ this._encoding = "UTF-8";
+ },
+
+ setAuthentication: function(username, password){
+ if ((typeof username == "string") &&
+ (typeof password == "string")){
+ this._useAuth = true;
+ this._username = username;
+ this._password = password;
+ }
+ },
+
+ clearAuthentication: function(){
+ this._useAuth = false;
+ },
+
+ setEncoding: function(encoding){
+ this._encoding = encoding;
+ },
+
+ get serverUrl() { return this._serverUrl; },
+
+ // Internal copy of the status
+ _status: null,
+ _listener: null,
+
+ asyncCall: function(listener, context, methodName, methodArgs, count) {
+ debug('asyncCall');
+ // Check for call in progress.
+ if (this._inProgress)
+ return;
+ //throw Components.Exception('Call in progress!');
+
+ // Check for the server URL;
+ if (!this._serverUrl)
+ throw Components.Exception('Not initialized');
+
+ this._inProgress = true;
+
+ // Clear state.
+ this._foundFault = false;
+ this._passwordTried = false;
+ this._result = null;
+ this._fault = null;
+ this._status = null;
+ this._responseStatus = null;
+ this._responseString = null;
+ this._listener = listener;
+ this._seenStart = false;
+ this._context = context;
+
+ debug('Arguments: ' + methodArgs);
+
+ // Generate request body
+ var xmlWriter = new XMLWriter(this._encoding);
+ this._generateRequestBody(xmlWriter, methodName, methodArgs);
+
+ var requestBody = xmlWriter.data;
+
+ debug('Request: ' + requestBody);
+
+ this.xmlhttp = Components.classes[XMLHTTPREQUEST_CONTRACTID]
+ .createInstance(Components.interfaces.nsIXMLHttpRequest);
+ if (this._useAuth) {
+ this.xmlhttp.open('POST', this._serverUrl, true,
+ this._username, this._password);
+ } else {
+ this.xmlhttp.open('POST', this._serverUrl);
+ }
+ this.xmlhttp.onload = this._onload;
+ this.xmlhttp.onerror = this._onerror;
+ this.xmlhttp.parent = this;
+ this.xmlhttp.setRequestHeader('Content-Type','text/xml');
+ this.xmlhttp.send(requestBody);
+ var chan = this.xmlhttp.channel.QueryInterface(NSICHANNEL);
+ chan.notificationCallbacks = this;
+ },
+
+ _onload: function(e) {
+ var result;
+ var parent = e.target.parent;
+ parent._inProgress = false;
+ parent._responseStatus = e.target.status;
+ parent._responseString = e.target.statusText;
+ if (!e.target.responseXML) {
+ if (e.target.status) {
+ try {
+ parent._listener.onError(parent, parent._context,
+ Components.results.NS_ERROR_FAILURE,
+ 'Server returned status ' + e.target.status);
+ } catch (ex) {
+ debug('Exception in listener.onError: ' + ex);
+ }
+ } else {
+ try {
+ parent._listener.onError(parent, parent._context,
+ Components.results.NS_ERROR_FAILURE,
+ 'Unknown network error');
+ } catch (ex) {
+ debug('Exception in listener.onError: ' + ex);
+ }
+ }
+ return;
+ }
+ try {
+ e.target.responseXML.normalize();
+ result = parent.parse(e.target.responseXML);
+ } catch (ex) {
+ try {
+ parent._listener.onError(parent, parent._context,
+ ex.result, ex.message);
+ } catch (ex) {
+ debug('Exception in listener.onError: ' + ex);
+ }
+ return;
+ }
+ if (parent._foundFault) {
+ parent._fault = result;
+ try {
+ parent._listener.onFault(parent, parent._context, result);
+ } catch(ex) {
+ debug('Exception in listener.onFault: ' + ex);
+ }
+ } else {
+ parent._result = result.value;
+ try {
+ parent._listener.onResult(parent, parent._context,
+ result.value);
+ } catch (ex) {
+ debug('Exception in listener.onResult: ' + ex);
+ }
+ }
+ },
+
+ _onerror: function(e) {
+ var parent = e.target.parent;
+ parent._inProgress = false;
+ try {
+ parent._listener.onError(parent, parent._context,
+ Components.results.NS_ERROR_FAILURE,
+ 'Unknown network error');
+ } catch (ex) {
+ debug('Exception in listener.onError: ' + ex);
+ }
+ },
+
+ _foundFault: false,
+
+ _fault: null,
+ _result: null,
+ _responseStatus: null,
+ _responseString: null,
+
+ get fault() { return this._fault; },
+ get result() { return this._result; },
+ get responseStatus() { return this._responseStatus; },
+ get responseString() { return this._responseString; },
+
+ /* Convenience. Create an appropriate XPCOM object for a given type */
+ INT: 1,
+ BOOLEAN: 2,
+ STRING: 3,
+ DOUBLE: 4,
+ DATETIME: 5,
+ ARRAY: 6,
+ STRUCT: 7,
+ BASE64: 8, // Not part of nsIXmlRpcClient interface, internal use.
+ createType: function(type, uuid) {
+ const SUPPORTSID = '@mozilla.org/supports-';
+ switch(type) {
+ case this.INT:
+ uuid.value = Components.interfaces.nsISupportsPRInt32
+ return createInstance(SUPPORTSID + 'PRInt32;1',
+ 'nsISupportsPRInt32');
+
+ case this.BOOLEAN:
+ uuid.value = Components.interfaces.nsISupportsPRBool
+ return createInstance(SUPPORTSID + 'PRBool;1',
+ 'nsISupportsPRBool');
+
+ case this.STRING:
+ uuid.value = Components.interfaces.nsISupportsCString
+ return createInstance(SUPPORTSID + 'cstring;1',
+ 'nsISupportsCString');
+
+ case this.DOUBLE:
+ uuid.value = Components.interfaces.nsISupportsDouble
+ return createInstance(SUPPORTSID + 'double;1',
+ 'nsISupportsDouble');
+
+ case this.DATETIME:
+ uuid.value = Components.interfaces.nsISupportsPRTime
+ return createInstance(SUPPORTSID + 'PRTime;1',
+ 'nsISupportsPRTime');
+
+ case this.ARRAY:
+ uuid.value = Components.interfaces.nsISupportsArray
+ return createInstance(SUPPORTSID + 'array;1',
+ 'nsISupportsArray');
+
+ case this.STRUCT:
+ uuid.value = Components.interfaces.nsIDictionary
+ return createInstance('@mozilla.org/dictionary;1',
+ 'nsIDictionary');
+
+ default: throw Components.Exception('Unsupported type');
+ }
+ },
+
+ // nsISupports interface
+ QueryInterface: function(iid) {
+ if (!iid.equals(Components.interfaces.nsISupports) &&
+ !iid.equals(XMLRPCCLIENT_IID) &&
+ !iid.equals(Components.interfaces.nsIInterfaceRequestor))
+ throw Components.results.NS_ERROR_NO_INTERFACE;
+ return this;
+ },
+
+ // nsIInterfaceRequester interface
+ getInterface: function(iid, result){
+ if (iid.equals(Components.interfaces.nsIAuthPrompt)){
+ return this;
+ }
+ Components.returnCode = Components.results.NS_ERROR_NO_INTERFACE;
+ return null;
+ },
+
+ // nsIAuthPrompt interface
+ _passwordTried: false,
+ promptUsernameAndPassword: function(dialogTitle, text, passwordRealm,
+ savePassword, user, pwd){
+
+ if (this._useAuth){
+ if (this._passwordTried){
+ return false;
+ }
+ user.value = this._username;
+ pwd.value = this._password;
+ this._passwordTried = true;
+ return true;
+ }
+ return false;
+ },
+
+ /* Generate the XML-RPC request body */
+ _generateRequestBody: function(writer, methodName, methodArgs) {
+ writer.startElement('methodCall');
+
+ writer.startElement('methodName');
+ writer.write(methodName);
+ writer.endElement('methodName');
+
+ writer.startElement('params');
+ for (var i = 0; i < methodArgs.length; i++) {
+ writer.startElement('param');
+ this._generateArgumentBody(writer, methodArgs[i]);
+ writer.endElement('param');
+ }
+ writer.endElement('params');
+
+ writer.endElement('methodCall');
+ },
+
+ /* Write out a XML-RPC parameter value */
+ _generateArgumentBody: function(writer, obj) {
+ writer.startElement('value');
+ var sType = this._typeOf(obj);
+ switch (sType) {
+ case 'PRUint8':
+ case 'PRUint16':
+ case 'PRInt16':
+ case 'PRInt32':
+ obj=obj.QueryInterface(Components.interfaces['nsISupports' +
+ sType]);
+ writer.startElement('i4');
+ writer.write(obj.toString());
+ writer.endElement('i4');
+ break;
+
+ case 'PRBool':
+ obj=obj.QueryInterface(Components.interfaces.nsISupportsPRBool);
+ writer.startElement('boolean');
+ writer.write(obj.data ? '1' : '0');
+ writer.endElement('boolean');
+ break;
+
+ case 'Char':
+ case 'CString':
+ obj=obj.QueryInterface(Components.interfaces['nsISupports' +
+ sType]);
+ writer.startElement('string');
+ writer.write(obj.toString());
+ writer.endElement('string');
+ break;
+
+ case 'Float':
+ case 'Double':
+ obj=obj.QueryInterface(Components.interfaces['nsISupports' +
+ sType]);
+ writer.startElement('double');
+ writer.write(obj.toString());
+ writer.endElement('double');
+ break;
+
+ case 'PRTime':
+ obj = obj.QueryInterface(
+ Components.interfaces.nsISupportsPRTime);
+ var date = new Date(obj.data)
+ writer.startElement('dateTime.iso8601');
+ writer.write(iso8601Format(date));
+ writer.endElement('dateTime.iso8601');
+ break;
+
+ case 'InputStream':
+ obj = obj.QueryInterface(Components.interfaces.nsIInputStream);
+ obj = toScriptableStream(obj);
+ writer.startElement('base64');
+ streamToBase64(obj, writer);
+ writer.endElement('base64');
+ break;
+
+ case 'Array':
+ obj = obj.QueryInterface(
+ Components.interfaces.nsISupportsArray);
+ writer.startElement('array');
+ writer.startElement('data');
+ for (var i = 0; i < obj.Count(); i++)
+ this._generateArgumentBody(writer, obj.GetElementAt(i));
+ writer.endElement('data');
+ writer.endElement('array');
+ break;
+
+ case 'Dictionary':
+ obj = obj.QueryInterface(Components.interfaces.nsIDictionary);
+ writer.startElement('struct');
+ var keys = obj.getKeys({});
+ for (var k = 0; k < keys.length; k++) {
+ writer.startElement('member');
+ writer.startElement('name');
+ writer.write(keys[k]);
+ writer.endElement('name');
+ this._generateArgumentBody(writer, obj.getValue(keys[k]));
+ writer.endElement('member');
+ }
+ writer.endElement('struct');
+ break;
+
+ default:
+ throw Components.Exception('Unsupported argument', null, null,
+ obj);
+ }
+
+ writer.endElement('value');
+ },
+
+ /* Determine type of a nsISupports primitive, array or dictionary. */
+ _typeOf: function(obj) {
+ // XPConnect alows JS to pass in anything, because we are a regular
+ // JS object to it. So we have to test rigorously.
+ if (typeof obj != 'object') return 'Unknown';
+
+ // Anything else not nsISupports is not allowed.
+ if (typeof obj.QueryInterface != 'function') return 'Unknown';
+
+ // Now we will have to eliminate by trying all possebilities.
+ try {
+ obj.QueryInterface(Components.interfaces.nsISupportsPRUint8);
+ return 'PRUint8';
+ } catch(e) {}
+
+ try {
+ obj.QueryInterface(Components.interfaces.nsISupportsPRUint16);
+ return 'PRUint16';
+ } catch(e) {}
+
+ try {
+ obj.QueryInterface(Components.interfaces.nsISupportsPRInt16);
+ return 'PRInt16';
+ } catch(e) {}
+
+ try {
+ obj.QueryInterface(Components.interfaces.nsISupportsPRInt32);
+ return 'PRInt32';
+ } catch(e) {}
+
+ try {
+ obj.QueryInterface(Components.interfaces.nsISupportsPRBool);
+ return 'PRBool';
+ } catch(e) {}
+
+ try {
+ obj.QueryInterface(Components.interfaces.nsISupportsChar);
+ return 'Char';
+ } catch(e) {}
+
+ try {
+ obj.QueryInterface(Components.interfaces.nsISupportsCString);
+ return 'CString';
+ } catch(e) {}
+
+ try {
+ obj.QueryInterface(Components.interfaces.nsISupportsFloat);
+ return 'Float';
+ } catch(e) {}
+
+ try {
+ obj.QueryInterface(Components.interfaces.nsISupportsDouble);
+ return 'Double';
+ } catch(e) {}
+
+ try {
+ obj.QueryInterface(Components.interfaces.nsISupportsPRTime);
+ return 'PRTime';
+ } catch(e) {}
+
+ try {
+ obj.QueryInterface(Components.interfaces.nsIInputStream);
+ return 'InputStream';
+ } catch(e) {}
+
+ try {
+ obj.QueryInterface(Components.interfaces.nsISupportsArray);
+ return 'Array';
+ } catch(e) {}
+
+ try {
+ obj.QueryInterface(Components.interfaces.nsIDictionary);
+ return 'Dictionary';
+ } catch(e) {}
+
+ // Not a supported type
+ return 'Unknown';
+ },
+
+ // Response parsing state
+ _valueStack: [],
+ _currValue: null,
+ _cdata: null,
+
+ parse: function(doc) {
+ var node = doc.firstChild;
+ var result;
+ if (node.nodeType == DOMNode.TEXT_NODE)
+ node = node.nextSibling;
+ if ((node.nodeType != DOMNode.ELEMENT_NODE) ||
+ (node.nodeName != 'methodResponse')) {
+ throw Components.Exception('Expecting a methodResponse', null, null,
+ doc);
+ }
+ node = node.firstChild;
+ if (node.nodeType == DOMNode.TEXT_NODE)
+ node = node.nextSibling;
+ if (node.nodeType != DOMNode.ELEMENT_NODE)
+ throw Components.Exception('Expecting a params or fault', null,
+ null, doc);
+ if (node.nodeName == 'params') {
+ node = node.firstChild;
+ if (node.nodeType == DOMNode.TEXT_NODE)
+ node = node.nextSibling;
+ if ((node.nodeType != DOMNode.ELEMENT_NODE) ||
+ (node.nodeName != 'param')) {
+ throw Components.Exception('Expecting a param', null, null,
+ doc);
+ }
+ result = this.parseValue(node.firstChild);
+ } else if (node.nodeName == 'fault') {
+ this._foundFault = true;
+ result = this.parseFault(node.firstChild);
+ } else {
+ throw Components.Exception('Expecting a params or fault', null,
+ null, doc);
+ }
+ debug('Parse finished');
+ return result;
+ },
+
+ parseValue: function(node) {
+ var cValue = new Value();
+ if (node && (node.nodeType == DOMNode.TEXT_NODE))
+ node = node.nextSibling;
+ if (!node || (node.nodeType != DOMNode.ELEMENT_NODE) ||
+ (node.nodeName != 'value')) {
+ throw Components.Exception('Expecting a value', null, null, node);
+ }
+ node = node.firstChild;
+ if (!node)
+ return cValue;
+ if (node.nodeType == DOMNode.TEXT_NODE){
+ if (!node.nextSibling) {
+ cValue.value = node.nodeValue;
+ return cValue;
+ } else {
+ node = node.nextSibling;
+ }
+ }
+ if (node.nodeType != DOMNode.ELEMENT_NODE)
+ throw Components.Exception('Expecting a value type', null, null,
+ node);
+ switch (node.nodeName) {
+ case 'string':
+ cValue.value = this.parseString(node.firstChild);
+ break;
+ case 'i4':
+ case 'int':
+ cValue.type = this.INT;
+ cValue.value = this.parseString(node.firstChild);
+ break;
+ case 'boolean':
+ cValue.type = this.BOOLEAN;
+ cValue.value = this.parseString(node.firstChild);
+ break;
+ case 'double':
+ cValue.type = this.DOUBLE;
+ cValue.value = this.parseString(node.firstChild);
+ break;
+ case 'dateTime.iso8601':
+ cValue.type = this.DATETIME;
+ cValue.value = this.parseString(node.firstChild);
+ break;
+ case 'base64':
+ cValue.type = this.BASE64;
+ cValue.value = this.parseString(node.firstChild);
+ break;
+ case 'struct':
+ cValue.type = this.STRUCT;
+ this.parseStruct(cValue, node.firstChild);
+ break;
+ case 'array':
+ cValue.type = this.ARRAY;
+ this.parseArray(cValue, node.firstChild);
+ break;
+ default:
+ throw Components.Exception('Expecting a value type', null, null,
+ node);
+ }
+ return cValue;
+ },
+
+ parseString: function(node) {
+ value = '';
+ while (node) {
+ if (node.nodeType != DOMNode.TEXT_NODE)
+ throw Components.Exception('Expecting a text node', null, null,
+ node);
+ value += node.nodeValue;
+ node = node.nextSibling;
+ }
+ return value;
+ },
+
+ parseStruct: function(struct, node) {
+ while (node) {
+ if (node.nodeType == DOMNode.TEXT_NODE)
+ node = node.nextSibling;
+ if (!node)
+ return;
+ if ((node.nodeType != DOMNode.ELEMENT_NODE) ||
+ (node.nodeName != 'member')) {
+ throw Components.Exception('Expecting a member', null, null,
+ node);
+ }
+ this.parseMember(struct, node.firstChild);
+ node = node.nextSibling;
+ }
+ },
+
+ parseMember: function(struct, node) {
+ var cValue;
+ if (node.nodeType == DOMNode.TEXT_NODE)
+ node = node.nextSibling;
+ if (!node || (node.nodeType != DOMNode.ELEMENT_NODE) ||
+ (node.nodeName != 'name')) {
+ throw Components.Exception('Expecting a name', null, null, node);
+ }
+ struct.name = this.parseString(node.firstChild);
+ cValue = this.parseValue(node.nextSibling);
+ struct.appendValue(cValue.value);
+ },
+
+ parseArray: function(array, node) {
+ if (node.nodeType == DOMNode.TEXT_NODE)
+ node = node.nextSibling;
+ if (!node || (node.nodeType != DOMNode.ELEMENT_NODE) ||
+ (node.nodeName != 'data')) {
+ throw Components.Exception('Expecting array data', null, null, node);
+ }
+ for (node = node.firstChild; node; node = node.nextSibling) {
+ if (node.nodeType == DOMNode.TEXT_NODE)
+ continue;
+ array.appendValue(this.parseValue(node).value);
+ }
+ },
+
+ parseFault: function(node) {
+ var fault = createInstance(XMLRPCFAULT_CONTRACTID, 'nsIXmlRpcFault');
+ var cValue = this.parseValue(node);
+ if ((cValue.type != this.STRUCT) ||
+ (!cValue.value.hasKey('faultCode')) ||
+ (!cValue.value.hasKey('faultString'))) {
+ throw Components.Exception('Invalid fault', null, null, node);
+ }
+ fault.init(cValue.value.getValue('faultCode').data,
+ cValue.value.getValue('faultString').data);
+ return fault;
+ }
+};
+
+if (XPCOMUtils.generateNSGetFactory)
+ var NSGetFactory = XPCOMUtils.generateNSGetFactory([nsXmlRpcClient]);
+else
+ var NSGetModule = XPCOMUtils.generateNSGetModule([nsXmlRpcClient]);
+
+
+/* The XMLWriter class constructor */
+function XMLWriter(encoding) {
+ if (!encoding)
+ encoding = "UTF-8";
+ this.data = '';
+}
+
+/* The XMLWriter class def */
+XMLWriter.prototype = {
+ data: '',
+
+ startElement: function(element) {
+ this.data += '<' + element + '>';
+ },
+
+ endElement: function(element) {
+ this.data += '' + element + '>';
+ },
+
+ write: function(text) {
+ for (var i = 0; i < text.length; i++) {
+ var c = text[i];
+ switch (c) {
+ case '<':
+ this.data += '<';
+ break;
+ case '&':
+ this.data += '&';
+ break;
+ default:
+ this.data += c;
+ }
+ }
+ },
+
+ markup: function(text) { this.data += text }
+};
+
+/* The Value class contructor */
+function Value() { this.type = this.STRING; };
+
+/* The Value class def */
+Value.prototype = {
+ INT: nsXmlRpcClient.prototype.INT,
+ BOOLEAN: nsXmlRpcClient.prototype.BOOLEAN,
+ STRING: nsXmlRpcClient.prototype.STRING,
+ DOUBLE: nsXmlRpcClient.prototype.DOUBLE,
+ DATETIME: nsXmlRpcClient.prototype.DATETIME,
+ ARRAY: nsXmlRpcClient.prototype.ARRAY,
+ STRUCT: nsXmlRpcClient.prototype.STRUCT,
+ BASE64: nsXmlRpcClient.prototype.BASE64,
+
+ _createType: nsXmlRpcClient.prototype.createType,
+
+ name: null,
+
+ _value: null,
+ get value() { return this._value; },
+ set value(val) {
+ // accepts [0-9]+ or x[0-9a-fA-F]+ and returns the character.
+ function entityTrans(substr, code) {
+ return String.fromCharCode("0" + code);
+ }
+
+ switch (this.type) {
+ case this.STRING:
+ val = val.replace(/([0-9]+);/g, entityTrans);
+ val = val.replace(/(x[0-9a-fA-F]+);/g, entityTrans);
+ val = val.replace(/</g, '<');
+ val = val.replace(/>/g, '>');
+ val = val.replace(/&/g, '&');
+ this._value.data = val;
+ break;
+
+ case this.BOOLEAN:
+ this._value.data = (val == 1);
+ break;
+
+ case this.DATETIME:
+ this._value.data = Date.UTC(val.slice(0, 4),
+ val.slice(4, 6) - 1, val.slice(6, 8), val.slice(9, 11),
+ val.slice(12, 14), val.slice(15));
+ break;
+
+ case this.BASE64:
+ this._value.data = base64ToString(val);
+ break;
+
+ default:
+ this._value.data = val;
+ }
+ },
+
+ _type: null,
+ get type() { return this._type; },
+ set type(type) {
+ this._type = type;
+ if (type == this.BASE64)
+ this._value = this._createType(this.STRING, {});
+ else this._value = this._createType(type, {});
+ },
+
+ appendValue: function(val) {
+ switch (this.type) {
+ case this.ARRAY:
+ this.value.AppendElement(val);
+ break;
+
+ case this.STRUCT:
+ this.value.setValue(this.name, val);
+ break;
+ }
+ }
+};
+
+/*
+ * Objects
+ */
+
+/* nsXmlRpcClient Module (for XPCOM registration) */
+var nsXmlRpcClientModule = {
+ registerSelf: function(compMgr, fileSpec, location, type) {
+ compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
+
+ compMgr.registerFactoryLocation(XMLRPCCLIENT_CID,
+ 'XML-RPC Client JS component',
+ XMLRPCCLIENT_CONTRACTID,
+ fileSpec,
+ location,
+ type);
+ compMgr.registerFactoryLocation(XMLRPCFAULT_CID,
+ 'XML-RPC Fault JS component',
+ XMLRPCFAULT_CONTRACTID,
+ fileSpec,
+ location,
+ type);
+ },
+
+ getClassObject: function(compMgr, cid, iid) {
+ if (!cid.equals(XMLRPCCLIENT_CID) && !cid.equals(XMLRPCFAULT_CID))
+ throw Components.results.NS_ERROR_NO_INTERFACE;
+
+ if (!iid.equals(Components.interfaces.nsIFactory))
+ throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
+
+ if (cid.equals(XMLRPCCLIENT_CID))
+ return nsXmlRpcClientFactory
+ else return nsXmlRpcFaultFactory;
+ },
+
+ canUnload: function(compMgr) { return true; }
+};
+
+/* nsXmlRpcClient Class Factory */
+var nsXmlRpcClientFactory = {
+ createInstance: function(outer, iid) {
+ if (outer != null)
+ throw Components.results.NS_ERROR_NO_AGGREGATION;
+
+ if (!iid.equals(XMLRPCCLIENT_IID) &&
+ !iid.equals(Components.interfaces.nsISupports))
+ throw Components.results.NS_ERROR_INVALID_ARG;
+
+ return new nsXmlRpcClient();
+ }
+}
+
+/* nsXmlRpcFault Class Factory */
+var nsXmlRpcFaultFactory = {
+ createInstance: function(outer, iid) {
+ if (outer != null)
+ throw Components.results.NS_ERROR_NO_AGGREGATION;
+
+ if (!iid.equals(XMLRPCFAULT_IID) &&
+ !iid.equals(Components.interfaces.nsISupports))
+ throw Components.results.NS_ERROR_INVALID_ARG;
+
+ return new nsXmlRpcFault();
+ }
+}
+
+/*
+ * Functions
+ */
+/* module initialisation */
+function NSGetModule(comMgr, fileSpec) { return nsXmlRpcClientModule; }
+
+/* Create an instance of the given ContractID, with given interface */
+function createInstance(contractId, intf) {
+ return Components.classes[contractId]
+ .createInstance(Components.interfaces[intf]);
+}
+
+/* Get a pointer to a service indicated by the ContractID, with given interface */
+function getService(contractId, intf) {
+ return Components.classes[contractId]
+ .getService(Components.interfaces[intf]);
+}
+
+/* Convert an inputstream to a scriptable inputstream */
+function toScriptableStream(input) {
+ var SIStream = Components.Constructor(
+ '@mozilla.org/scriptableinputstream;1',
+ 'nsIScriptableInputStream', 'init');
+ return new SIStream(input);
+}
+
+/* format a Date object into a iso8601 datetime string, UTC time */
+function iso8601Format(date) {
+ var datetime = date.getUTCFullYear();
+ var month = String(date.getUTCMonth() + 1);
+ datetime += (month.length == 1 ? '0' + month : month);
+ var day = date.getUTCDate();
+ datetime += (day < 10 ? '0' + day : day);
+
+ datetime += 'T';
+
+ var hour = date.getUTCHours();
+ datetime += (hour < 10 ? '0' + hour : hour) + ':';
+ var minutes = date.getUTCMinutes();
+ datetime += (minutes < 10 ? '0' + minutes : minutes) + ':';
+ var seconds = date.getUTCSeconds();
+ datetime += (seconds < 10 ? '0' + seconds : seconds);
+
+ return datetime;
+}
+
+/* Convert a stream to Base64, writing it away to a string writer */
+const BASE64CHUNK = 255; // Has to be dividable by 3!!
+function streamToBase64(stream, writer) {
+ while (stream.available()) {
+ var data = [];
+ while (data.length < BASE64CHUNK && stream.available()) {
+ var d = stream.read(1).charCodeAt(0);
+ // reading a 0 results in NaN, compensate.
+ data = data.concat(isNaN(d) ? 0 : d);
+ }
+ writer.write(toBase64(data));
+ }
+}
+
+/* Convert data (an array of integers) to a Base64 string. */
+const toBase64Table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' +
+ '0123456789+/';
+const base64Pad = '=';
+function toBase64(data) {
+ var result = '';
+ var length = data.length;
+ var i;
+ // Convert every three bytes to 4 ascii characters.
+ for (i = 0; i < (length - 2); i += 3) {
+ result += toBase64Table[data[i] >> 2];
+ result += toBase64Table[((data[i] & 0x03) << 4) + (data[i+1] >> 4)];
+ result += toBase64Table[((data[i+1] & 0x0f) << 2) + (data[i+2] >> 6)];
+ result += toBase64Table[data[i+2] & 0x3f];
+ }
+
+ // Convert the remaining 1 or 2 bytes, pad out to 4 characters.
+ if (length%3) {
+ i = length - (length%3);
+ result += toBase64Table[data[i] >> 2];
+ if ((length%3) == 2) {
+ result += toBase64Table[((data[i] & 0x03) << 4) + (data[i+1] >> 4)];
+ result += toBase64Table[(data[i+1] & 0x0f) << 2];
+ result += base64Pad;
+ } else {
+ result += toBase64Table[(data[i] & 0x03) << 4];
+ result += base64Pad + base64Pad;
+ }
+ }
+
+ return result;
+}
+
+/* Convert Base64 data to a string */
+const toBinaryTable = [
+ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
+ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
+ -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,
+ 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1,
+ -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
+ 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,
+ -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
+ 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
+];
+function base64ToString(data) {
+ var result = '';
+ var leftbits = 0; // number of bits decoded, but yet to be appended
+ var leftdata = 0; // bits decoded, but yet to be appended
+
+ // Convert one by one.
+ for (var i = 0; i < data.length; i++) {
+ var c = toBinaryTable[data.charCodeAt(i) & 0x7f];
+ var padding = (data[i] == base64Pad);
+ // Skip illegal characters and whitespace
+ if (c == -1) continue;
+
+ // Collect data into leftdata, update bitcount
+ leftdata = (leftdata << 6) | c;
+ leftbits += 6;
+
+ // If we have 8 or more bits, append 8 bits to the result
+ if (leftbits >= 8) {
+ leftbits -= 8;
+ // Append if not padding.
+ if (!padding)
+ result += String.fromCharCode((leftdata >> leftbits) & 0xff);
+ leftdata &= (1 << leftbits) - 1;
+ }
+ }
+
+ // If there are any bits left, the base64 string was corrupted
+ if (leftbits)
+ throw Components.Exception('Corrupted base64 string');
+
+ return result;
+}
+
+if (DEBUG) debug = function(msg) {
+ dump(' -- XML-RPC client -- : ' + msg + '\n');
+};
+else debug = function() {}
+
+// vim:sw=4:sr:sta:et:sts:
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/components/xml-rpc.xpt b/addons/plugin_thunderbird/plugin/openerp_plugin/components/xml-rpc.xpt
new file mode 100644
index 0000000000000000000000000000000000000000..8e59aa20c852c9d9a2e288334720d4d12134f695
GIT binary patch
literal 1011
zcmZWoy=xRv5TD)q2p$(Pg(-|SB7QYCiiOR6ZNeq@5%%^ZTF9<@FPDYQ?y>J(;0lw6
zAStvslN2gJ)KsQO6Y#6LRxDHm@h`9x#5&;2zDtaHus6S%-@KjQ%)FhOE!L|UtJh%_
z@Ahcsgr-9pAn^+TPUG`l;$Qq5C^LyhQxM?Prw_)?*0g#5f>wB9op&)lI^-tKeb0Vd
zbgQecKi?fZ&2r*i47qpJJI4oCr|K)Oc6%3ZJ%724uN+sLcGf%jrj=PPJ$UqEdgaRI
zPXj<7C{F+Qbo0WUYYolY1DPPpW`!V3c@>XBY-2_V#E
z-_9t!r03H120&lA%S5g1C$6F=54`?g+$PWox!~{_)`K<^XgJyHj^Aa#_d$#KOfVI6
zeda_YYHratJ8seUSRg7M7c5{A$xD#Dy#&@wQr&~vTKaG-6>HUwQjW??%ZIU=FfbYK
z`U1jW(oxokqVT_(R4a?6^rR+L=lT)qb%-Yp;Y)Fb#N2C|y@pk2gu0Q!+N23txsgl~
zK#J1p8qJo_O*(*L3EPBm{)F3_J=M97e@kFQdVwcs1Np94zzKVpX)}Py<7Kk%QO6ps)@q;9k(QLJ*#JDbTQPemj
bCWcWNt1N~srt~&MEGV9c2!|ftK
+
+
+ {d57f315a-9f5d-4366-a530-a769a4a8c949}
+ chrome://openerp_plugin/skin/tinyerp-icon.ico
+ OpenERP Plugin
+ 1.0
+ OpenERP Thunderbird Integration
+ OpenERP SA
+
+ http://openerp.com
+
+
+
+ {3550f703-e582-4d05-9a08-453d09bdfdc6}
+ 2.0
+ 8.0.*
+
+
+
+
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/install.sh b/addons/plugin_thunderbird/plugin/openerp_plugin/install.sh
new file mode 100755
index 00000000000..e1103b30acf
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/install.sh
@@ -0,0 +1,3 @@
+make clean
+make
+cp ../openerp_plugin.xpi /home/openerp/
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin/makefile b/addons/plugin_thunderbird/plugin/openerp_plugin/makefile
new file mode 100644
index 00000000000..17ed0319bcc
--- /dev/null
+++ b/addons/plugin_thunderbird/plugin/openerp_plugin/makefile
@@ -0,0 +1,11 @@
+all: xpi
+
+jar:
+ jar cvf chrome/openerp_plugin.jar -C chrome/openerp_plugin/ .
+
+xpi: jar
+ zip -r ../openerp_plugin.xpi *
+
+clean:
+ rm ../openerp_plugin.xpi
+ rm chrome/openerp_plugin.jar
diff --git a/addons/plugin_thunderbird/security/ir.model.access.csv b/addons/plugin_thunderbird/security/ir.model.access.csv
new file mode 100644
index 00000000000..6c3e9555132
--- /dev/null
+++ b/addons/plugin_thunderbird/security/ir.model.access.csv
@@ -0,0 +1,2 @@
+"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
+"access_thunderbird_ir_actions_todo","ir.actions.todo.thunderbird.installer","base.model_ir_actions_todo","base.group_sale_manager",1,0,0,0
diff --git a/addons/plugin_thunderbird/thunderbird_installer.xml b/addons/plugin_thunderbird/thunderbird_installer.xml
new file mode 100644
index 00000000000..2fb5d3177c3
--- /dev/null
+++ b/addons/plugin_thunderbird/thunderbird_installer.xml
@@ -0,0 +1,81 @@
+
+
+
+
+ thunderbird.installer.view
+ thunderbird.installer
+ form
+
+
+
+
+
+ Install Thunderbird Plug-In
+
+
+ This plug-in allows you to link your e-mail to OpenERP's documents. You can attach it to any existing one in OpenERP or create a new one.
+
+
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Install Thunderbird Plug-In
+ ir.actions.act_window
+ thunderbird.installer
+
+ form
+ form
+ new
+
+
+
+
+
+ 3
+ automatic
+
+
+
+
+ Install Thunderbird Plug-In
+ ir.actions.act_window
+ thunderbird.installer
+
+ form
+ form
+ new
+ {'menu':True}
+
+
+
+
+
+
+
From 11d93b49445c960e5ecdc05180b4dae33d2be1ec Mon Sep 17 00:00:00 2001
From: "tfr@openerp.com" <>
Date: Mon, 19 Dec 2011 12:39:30 +0100
Subject: [PATCH 041/224] [FIX] push email on partner
bzr revid: tfr@openerp.com-20111219113930-d3k4zs40r0fcz3ib
---
addons/plugin/plugin_handler.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/addons/plugin/plugin_handler.py b/addons/plugin/plugin_handler.py
index e7e8b9ea817..3c322b67bf4 100644
--- a/addons/plugin/plugin_handler.py
+++ b/addons/plugin/plugin_handler.py
@@ -92,6 +92,8 @@ class plugin_handler(osv.osv_memory):
msg = mail_message.parse_message(email)
message_id = msg.get('message-id')
mail_ids = mail_message.search(cr, uid, [('message_id','=',message_id),('res_id','=',res_id),('model','=',model)])
+ if model=='res.partner':
+ model_obj = self.pool.get('mail.thread')
if message_id and mail_ids :
mail_record = mail_message.browse(cr, uid, mail_ids)[0]
res_id = mail_record.res_id
From 2003c56ecdc39c6a403a68ba2d9157508892df09 Mon Sep 17 00:00:00 2001
From: MVA
Date: Mon, 19 Dec 2011 16:01:26 +0100
Subject: [PATCH 042/224] [CLEAN] clean layout
bzr revid: mva@openerp.com-20111219150126-n3mwar6k3bbjtj2u
---
.../plugin/openerp_plugin.xpi | Bin 108497 -> 108455 bytes
.../openerp_plugin/chrome/openerp_plugin.jar | Bin 47697 -> 47737 bytes
.../chrome/openerp_plugin/content/create.xul | 13 +++++-----
.../chrome/openerp_plugin/content/overlay.xul | 24 +++++++++---------
.../openerp_plugin/content/push_dialog.xul | 2 +-
5 files changed, 20 insertions(+), 19 deletions(-)
diff --git a/addons/plugin_thunderbird/plugin/openerp_plugin.xpi b/addons/plugin_thunderbird/plugin/openerp_plugin.xpi
index f0255b006230847eaf8c2eefa691eea4847f533d..9d0d543ff1f6803f517f9de9733f5b1c24c60650 100644
GIT binary patch
delta 50400
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 X#sY`Ljad;Q2&S5mitcTC
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 |