- |
-
-
-
- |
+ |
[[ o.partner_id.title or '' ]] [[ o.partner_id.name ]]
[[ o.address_invoice_id.title or '' ]] [[ o.address_invoice_id.name ]]
@@ -248,9 +245,7 @@
[[ o.address_invoice_id.zip or '' ]] [[ o.address_invoice_id.city or '' ]]
[[ o.address_invoice_id.state_id and o.address_invoice_id.state_id.name or '' ]]
[[ o.address_invoice_id.country_id and o.address_invoice_id.country_id.name or '' ]]
-
-
-
+
Tel. : [[ o.address_invoice_id.phone or removeParentNode('para') ]]
Fax : [[ o.address_invoice_id.fax or removeParentNode('para') ]]
VAT : [[ o.partner_id.vat or removeParentNode('para') ]]
@@ -264,131 +259,55 @@
Refund [[ (o.type=='out_refund' or removeParentNode('para')) and '' ]] [[ o.number ]]
Supplier Refund [[ (o.type=='in_refund' or removeParentNode('para')) and '' ]] [[ o.number ]]
Supplier Invoice [[ (o.type=='in_invoice' or removeParentNode('para')) and '' ]] [[ o.number ]]
-
-
-
+
- |
- Document
- |
-
- Invoice Date
- |
-
- Partner Ref.
- |
+ Document |
+ Invoice Date |
+ Partner Ref. |
- |
- [[ o.name ]]
- |
-
- [[ formatLang(o.date_invoice,date=True) ]]
- |
-
- [[ o.address_invoice_id.partner_id.ref or '' ]]
- |
+ [[ o.name ]] |
+ [[ formatLang(o.date_invoice,date=True) ]] |
+ [[ o.address_invoice_id.partner_id.ref or '' ]] |
-
-
-
-
+
+
+
- |
- Description
- |
-
- Taxes
- |
-
- Quantity
- |
-
- Unit Price
- |
-
- Disc. (%)
- |
-
- Price
- |
+ Description |
+ Taxes |
+ Quantity |
+ Unit Price |
+ Disc.(%) |
+ Price |
[[ repeatIn(o.invoice_line,'l') ]]
- |
- [[ l.name ]]
- |
-
- [[ ', '.join([ lt.description or '' for lt in l.invoice_line_tax_id ]) ]]
- |
-
- [[ formatLang(l.quantity)]]
- |
-
- [[ (l.uos_id and l.uos_id.name) or '' ]]
- |
-
- [[ formatLang(l.price_unit) ]]
- |
-
- [[ formatLang(l.discount) ]]
- |
-
- [[ formatLang(l.price_subtotal) ]]
- |
-
- [[ o.currency_id.code ]]
- |
+ [[ l.name ]] |
+ [[ ', '.join([ lt.description or '' for lt in l.invoice_line_tax_id ]) ]] |
+ [[ formatLang(l.quantity)]] |
+ [[ (l.uos_id and l.uos_id.name) or '' ]] |
+ [[ formatLang(l.price_unit) ]] |
+ [[ formatLang(l.discount) ]] |
+ [[ formatLang(l.price_subtotal) ]] |
+ [[ o.currency_id.code ]] |
- |
- [[ format(l.note or removeParentNode('tr')) ]]
-
-
-
- |
-
-
-
-
- |
-
-
-
-
- |
-
-
-
-
- |
-
-
-
-
- |
-
-
-
-
- |
-
-
-
-
- |
-
-
-
-
- |
+ [[ format(l.note or removeParentNode('tr')) ]] |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
@@ -397,63 +316,31 @@
- |
-
-
-
- |
-
-
-
-
- |
+ |
+ |
|
- |
- Net Total:
- |
-
- [[ formatLang(o.amount_untaxed) ]]
- |
-
- [[ o.currency_id.code ]]
- |
+ Net Total: |
+ [[ formatLang(o.amount_untaxed) ]] |
+ [[ o.currency_id.code ]] |
-
-
-
- |
- Taxes:
- |
-
- [[ formatLang(o.amount_tax) ]]
- |
-
- [[ o.currency_id.code ]]
- |
+ Taxes: |
+ [[ formatLang(o.amount_tax) ]] |
+ [[ o.currency_id.code ]] |
-
-
-
- |
- Total:
- |
-
- [[ formatLang(o.amount_total) ]]
- |
-
- [[ o.currency_id.code ]]
- |
+ Total: |
+ [[ formatLang(o.amount_total) ]] |
+ [[ o.currency_id.code ]] |
|
@@ -462,25 +349,13 @@
-
-
-
- |
- Tax
- |
-
- Base
- |
-
- Amount
- |
+ Tax |
+ Base |
+ Amount |
-
-
-
|
@@ -488,15 +363,9 @@
[[ repeatIn(o.tax_line,'t') ]]
- |
- [[ t.name ]]
- |
-
- [[ formatLang(t.base) ]]
- |
-
- [[ t.tax_code_id.notprintable and removeParentNode('blockTable') or '' ]][[ formatLang(t.amount) ]]
- |
+ [[ t.name ]] |
+ [[ formatLang(t.base) ]] |
+ [[ t.tax_code_id.notprintable and removeParentNode('blockTable') or '' ]][[ formatLang(t.amount) ]] |
@@ -505,21 +374,9 @@
- |
-
-
-
- |
-
-
-
-
- |
-
-
-
-
- |
+ |
+ |
+ |
|
@@ -527,23 +384,13 @@
- |
-
-
-
- |
-
-
-
-
- |
+ |
+ |
- |
- [[ format(o.comment or removeParentNode('blockTable')) ]]
- |
+ [[ format(o.comment or removeParentNode('blockTable')) ]] |
@@ -551,9 +398,7 @@
- |
- [[ format((o.payment_term and o.payment_term.note) or removeParentNode('blockTable')) ]]
- |
+ [[ format((o.payment_term and o.payment_term.note) or removeParentNode('blockTable')) ]] |
diff --git a/addons/account/report/partner_balance.rml b/addons/account/report/partner_balance.rml
index a096b5a2412..ff6e1214a1b 100644
--- a/addons/account/report/partner_balance.rml
+++ b/addons/account/report/partner_balance.rml
@@ -57,11 +57,10 @@
-
-
-
+
+
+
+
@@ -88,21 +87,16 @@
-
-
-
-
-
-
-
-
+
+
+
-
-
-
+
+
+
@@ -110,7 +104,7 @@
-
+
@@ -289,96 +283,42 @@
fontName="Times-Italic" leading="5" alignment="RIGHT" spaceBefore="0.0" spaceAfter="6.0"
/>
-
+
- |
- [[ setTag('tr','tr',{'style':'Line1'}) ]] Code
- |
-
- Partner name
- |
-
- Débit
- |
-
- Crédit
- |
-
- Balance
- |
-
- In dispute
- |
+ Code |
+ (Account/Partner) Name |
+ Debit |
+ Credit |
+ Balance |
+ In dispute |
- |
- [[ setTag('tr','tr',{'style':'Line2'}) ]] Grand total
- |
-
-
- |
-
- [[ formatLang(sum_debit(data)) ]]
- |
-
- [[ formatLang(sum_credit(data)) ]]
- |
-
- [[ formatLang((solde_debit(data)-solde_credit(data))) ]]
- |
-
- [[ formatLang(sum_litige(data)) ]]
- |
+ Grand total |
+ |
+ [[ formatLang(sum_debit(data)) ]] |
+ [[ formatLang(sum_credit(data)) ]] |
+ [[ formatLang((solde_debit(data)-solde_credit(data))) ]] |
+ [[ formatLang(sum_litige(data)) ]] |
-
- |
- [[ repeatIn(lines(data), 'a') ]][[ a['type']==3 and ( setTag('para','para',{'fontName':'Helvetica-Bold'})) ]] [[ a['ref'] ]] [[ a['type']==3 and a['code'] ]]
- |
-
- [[ a['type']==3 and ( setTag('tr','tr',{'style':'TrLevel0'})) ]] [[ a['type']==3 and ( setTag('para','para',{'fontName':'Helvetica-Bold'})) ]] [[ a['type']==1 and ( setTag('blockTable','blockTable',{'style':'LineLevel1'})) ]] [[ a['name'] ]]
- |
-
-
- [[ (a['type']==3 or removeParentNode('font')) and setTag('para','para',{'fontName':'Helvetica-Bold'}) ]] [[ formatLang(a['debit']) ]]
- [[ (a['type']!=3 or removeParentNode('font')) and setTag('para','para',{'fontName':'Helvetica'}) ]] [[ formatLang(a['debit']) ]]
-
- |
-
-
- [[ (a['type']==3 or removeParentNode('font')) and setTag('para','para',{'fontName':'Helvetica-Bold'}) ]] [[ formatLang(a['credit']) ]]
- [[ (a['type']!=3 or removeParentNode('font')) and setTag('para','para',{'fontName':'Helvetica'}) ]] [[ formatLang(a['credit']) ]]
-
- |
-
-
- [[ (a['type']==3 or removeParentNode('font')) and setTag('para','para',{'fontName':'Helvetica-Bold'}) ]] [[ formatLang(a['balance']) ]]
- [[ (a['type']!=3 or removeParentNode('font')) and setTag('para','para',{'fontName':'Helvetica'}) ]] [[ formatLang(a['balance']) ]]
-
- |
-
-
- [[ (a['type']==3 or removeParentNode('font')) and setTag('para','para',{'fontName':'Helvetica-Bold'}) ]] [[ formatLang(a['enlitige'] or 0.00) ]]
- [[ (a['type']!=3 or removeParentNode('font')) and setTag('para','para',{'fontName':'Helvetica'}) ]] [[ formatLang(a['enlitige'] or 0.00) ]]
-
- |
+ Balance |
+ |
+ [[ formatLang(solde_debit(data)) ]] |
+ [[ formatLang(solde_credit(data)) ]] |
+ |
+ |
+
+
+ | [[ repeatIn(lines(data), 'a') ]][[ a['type']==3 and ( setTag('para','para',{'fontName':'Helvetica-Bold'})) ]][[ a['ref'] ]] [[ a['type']==3 and a['code'] ]] |
+ [[ a['type']==3 and ( setTag('para','para',{'fontName':'Helvetica-Bold'})) ]][[ a['name'] ]] |
+ [[ a['type']==3 and ( setTag('para','para',{'fontName':'Helvetica-Bold'})) ]][[ formatLang(a['debit']) ]] |
+ [[ a['type']==3 and ( setTag('para','para',{'fontName':'Helvetica-Bold'})) ]][[ formatLang(a['credit']) ]] |
+ [[ a['type']==3 and ( setTag('para','para',{'fontName':'Helvetica-Bold'})) ]][[ formatLang(a['balance']) ]] |
+ [[ a['type']==3 and ( setTag('para','para',{'fontName':'Helvetica-Bold'})) ]][[ formatLang(a['enlitige'] or 0.00) ]] |
-
\ No newline at end of file
+
diff --git a/addons/account/report/tax_report.py b/addons/account/report/tax_report.py
index d82f9ab99bd..79e59959d12 100644
--- a/addons/account/report/tax_report.py
+++ b/addons/account/report/tax_report.py
@@ -58,7 +58,7 @@ class tax_report(rml_parse.rml_parse):
else:
return self.comma_me(new)
def _get_lines(self, based_on,period_list,company_id=False, parent=False, level=0):
- res = self._get_codes(based_on,parent,level,period_list)
+ res = self._get_codes(based_on,company_id,parent,level,period_list)
if period_list[0][2] :
res = self._add_codes(based_on,res,period_list)
@@ -157,15 +157,15 @@ class tax_report(rml_parse.rml_parse):
i+=1
return res
- def _get_codes(self, based_on, parent=False, level=0,period_list=[]):
+ def _get_codes(self,based_on, company_id, parent=False, level=0,period_list=[]):
tc = self.pool.get('account.tax.code')
- ids = tc.search(self.cr, self.uid, [('parent_id','=',parent)])
+ ids = tc.search(self.cr, self.uid, [('parent_id','=',parent),('company_id','=',company_id)])
res = []
for code in tc.browse(self.cr, self.uid, ids, {'based_on': based_on}):
res.append(('.'*2*level,code))
- res += self._get_codes(based_on, code.id, level+1)
+ res += self._get_codes(based_on, company_id, code.id, level+1)
return res
def _add_codes(self,based_on, account_list=[],period_list=[]):
diff --git a/addons/account/report/tax_report.rml b/addons/account/report/tax_report.rml
index 9cdba22c43f..eecf76f7551 100644
--- a/addons/account/report/tax_report.rml
+++ b/addons/account/report/tax_report.rml
@@ -54,10 +54,10 @@
-
-
-
-
+
+
+
+
@@ -88,7 +88,7 @@
-
+
@@ -116,61 +116,20 @@
-
-
-
-
-
-
- |
- Code
- |
-
- Debit
- |
-
- Credit
- |
-
- Tax Amount
- |
-
-
-
-
-
- [[ repeatIn(get_lines(data['form']['based_on'],data['form']['periods'],data['form']['company_id']), 'o') ]]
- |
- [[ '...'*len(o['level']) ]]
- [[o['type']==1 and ( setTag('para','para',{'fontName':'Helvetica-Bold'}))]]
-
- [[ o['code'] ]] [[ o['name'] ]]
-
- |
-
-
-
- [[ len(o['level'])>3 and removeParentNode('font') ]][[ formatLang(o['debit']) ]]
- [[ len(o['level'])<4 and removeParentNode('font') ]][[ formatLang(o['debit']) ]]
-
- |
-
- [[ len(o['level'])>3 and removeParentNode('font') ]][[ formatLang(o['credit'])]]
- [[ len(o['level'])<4 and removeParentNode('font') ]][[ formatLang(o['credit'])]]
-
-
- |
-
- [[ len(o['level'])>3 and removeParentNode('font') ]][[ formatLang(o['tax_amount']) ]]
- [[ len(o['level'])<4 and removeParentNode('font') ]][[ formatLang(o['tax_amount']) ]]
-
-
- |
-
-
-
-
-
-
+
+
+
+ | Tax Name |
+ Debit |
+ Credit |
+ Tax Amount |
+
+
+ | [[ repeatIn(get_lines(data['form']['based_on'],data['form']['periods'],data['form']['company_id']), 'o') ]][[ '...'*len(o['level']) ]] [[o['type']==1 and ( setTag('para','para',{'fontName':'Helvetica-Bold'}))]][[ o['code'] ]] [[ o['name'] ]] |
+ [[ len(o['level'])<3 and setTag('para','para',{'fontName':"Helvetica-Bold"}) ]][[ formatLang(o['debit']) ]] |
+ [[ len(o['level'])<3 and setTag('para','para',{'fontName':"Helvetica-Bold"}) ]][[ formatLang(o['credit'])]] |
+ [[ len(o['level'])<3 and setTag('para','para',{'fontName':"Helvetica-Bold"}) ]][[ formatLang(o['tax_amount']) ]] |
+
+
diff --git a/addons/account/report/third_party_ledger.py b/addons/account/report/third_party_ledger.py
index 3004beddd7e..9828fdfbd63 100644
--- a/addons/account/report/third_party_ledger.py
+++ b/addons/account/report/third_party_ledger.py
@@ -447,4 +447,8 @@ report_sxw.report_sxw('report.account.third_party_ledger', 'res.partner',
'addons/account/report/third_party_ledger.rml',parser=third_party_ledger,
header=False)
+report_sxw.report_sxw('report.account.third_party_ledger_other', 'res.partner',
+ 'addons/account/report/third_party_ledger_other.rml',parser=third_party_ledger,
+ header=False)
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/report/third_party_ledger.rml b/addons/account/report/third_party_ledger.rml
index 91a9b67d7ca..82d14a6ef94 100644
--- a/addons/account/report/third_party_ledger.rml
+++ b/addons/account/report/third_party_ledger.rml
@@ -124,117 +124,54 @@
-
-
- [[ data['form']['page_split'] == True or removeParentNode('para') ]]
- [[ repeatIn(objects, 'p') ]] [[ setLang(p.partner_id.lang) ]]
-
-
+ [[ repeatIn(objects, 'p') ]] [[ setLang(p.partner_id.lang) ]]
- |
-
- Date
- |
-
- JNRL
- |
-
- Ref.
- |
-
- Entry label
- |
-
- Debit
- |
-
- Credit
- |
-
- Balance
- |
-
-
+ | Date |
+ JNRL |
+ Ref. |
+ Entry label |
+ Debit |
+ Credit |
+ Balance |
-
+
- |
- Balance brought forward
- |
-
- [[ formatLang((sum_debit(data))) ]]
- |
-
- [[ formatLang((sum_credit(data))) ]]
- |
-
- [[ formatLang((sum_debit(data) - sum_credit(data))) ]]
- |
+ Balance brought forward |
+ [[ formatLang((sum_debit(data))) ]] |
+ [[ formatLang((sum_credit(data))) ]] |
+ [[ formatLang((sum_debit(data) - sum_credit(data))) ]] |
|
-
- [[ data['form']['page_split'] == False or removeParentNode('para') ]]
- [[ repeatIn(objects, 'p') ]]
-
- |
- [[ p.ref ]] - [[ p.name ]]
- |
-
-
- |
-
- [[ formatLang((sum_debit_partner(p,data))) ]]
- |
-
- [[ formatLang((sum_credit_partner(p,data))) ]]
- |
-
- [[ formatLang((sum_debit_partner(p,data) - sum_credit_partner(p,data))) ]]
- |
+ [[ p.ref ]] - [[ p.name ]] |
+ |
+ [[ formatLang((sum_debit_partner(p,data))) ]] |
+ [[ formatLang((sum_credit_partner(p,data))) ]] |
+ [[ formatLang((sum_debit_partner(p,data) - sum_credit_partner(p,data))) ]] |
- |
- [[ repeatIn(lines(p,data), 'line') ]][[ formatLang(line['date'],date=True) ]]
- |
-
- [[ line['code'] ]]
- |
-
- [[ line['ref'] ]] / [[ line['name'] ]]
- |
-
-
- |
-
- [[ formatLang((line['debit'])) ]]
- |
-
- [[ formatLang((line['credit'])) ]]
- |
-
- [[ formatLang((line['progress'])) ]]
- |
+ [[ repeatIn(lines(p,data), 'line') ]][[ formatLang(line['date'],date=True) ]] |
+ [[ line['code'] ]] |
+ [[ line['ref'] ]] / [[ line['name'] ]] |
+ |
+ [[ formatLang((line['debit'])) ]] |
+ [[ formatLang((line['credit'])) ]] |
+ [[ formatLang((line['progress'])) ]] |
-
|
-
-
-
-
\ No newline at end of file
diff --git a/addons/account/report/third_party_ledger_other.rml b/addons/account/report/third_party_ledger_other.rml
new file mode 100644
index 00000000000..36a208d1206
--- /dev/null
+++ b/addons/account/report/third_party_ledger_other.rml
@@ -0,0 +1,177 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [[ company.name ]]
+ Third Party Ledger [[ data['form']['result_selection'] == 'customer' and '/ Débiteur' ]] [[ data['form']['result_selection'] == 'supplier' and '/ Créancier' ]] [[ data['form']['result_selection'] == 'all' and '/ Créancier et Débiteur' ]]
+
+
+
+
+
+ [[ formatLang(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),date_time = True) ]]
+ Page
+
+
+
+
+ 1cm 27.7cm 20cm 27.7cm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ | Date |
+ JNRL |
+ Ref. |
+ Entry label |
+ Debit |
+ Credit |
+ Balance |
+
+
+
+
+
+ | Balance brought forward |
+ [[ formatLang((sum_debit(data))) ]] |
+ [[ formatLang((sum_credit(data))) ]] |
+ [[ formatLang((sum_debit(data) - sum_credit(data))) ]] |
+
+
+ |
+
+
+
+ [[ repeatIn(objects, 'p') ]]
+
+
+ | [[ p.ref ]] - [[ p.name ]] |
+ |
+ [[ formatLang((sum_debit_partner(p,data))) ]] |
+ [[ formatLang((sum_credit_partner(p,data))) ]] |
+ [[ formatLang((sum_debit_partner(p,data) - sum_credit_partner(p,data))) ]] |
+
+
+
+
+ | [[ repeatIn(lines(p,data), 'line') ]][[ formatLang(line['date'],date=True) ]] |
+ [[ line['code'] ]] |
+ [[ line['ref'] ]] / [[ line['name'] ]] |
+ |
+ [[ formatLang((line['debit'])) ]] |
+ [[ formatLang((line['credit'])) ]] |
+ [[ formatLang((line['progress'])) ]] |
+
+
+ |
+
+
+
+
\ No newline at end of file
diff --git a/addons/account/wizard/wizard_general_ledger_report.py b/addons/account/wizard/wizard_general_ledger_report.py
index 47191fa1d2b..c03171f8e61 100644
--- a/addons/account/wizard/wizard_general_ledger_report.py
+++ b/addons/account/wizard/wizard_general_ledger_report.py
@@ -120,10 +120,10 @@ def _check_state(self, cr, uid, data, context):
if data['form']['state'] == 'bydate':
_check_date(self, cr, uid, data, context)
- data['form']['fiscalyear'] = 0
- else :
-
- data['form']['fiscalyear'] = 1
+# data['form']['fiscalyear'] = 0
+# else :
+#
+# data['form']['fiscalyear'] = 1
return data['form']
@@ -138,8 +138,8 @@ class wizard_report(wizard.interface):
fiscalyear_obj = pooler.get_pool(cr.dbname).get('account.fiscalyear')
data['form']['fiscalyear'] = fiscalyear_obj.find(cr, uid)
- periods_obj=pooler.get_pool(cr.dbname).get('account.period')
- data['form']['periods'] =periods_obj.search(cr, uid, [('fiscalyear_id','=',data['form']['fiscalyear'])])
+ #periods_obj=pooler.get_pool(cr.dbname).get('account.period')
+ #data['form']['periods'] =periods_obj.search(cr, uid, [('fiscalyear_id','=',data['form']['fiscalyear'])])
data['form']['sortbydate'] = 'sort_date'
data['form']['display_account']='bal_all'
data['form']['landscape']=True
diff --git a/addons/account/wizard/wizard_third_party_ledger.py b/addons/account/wizard/wizard_third_party_ledger.py
index 8d7a46868ed..5693b54da77 100755
--- a/addons/account/wizard/wizard_third_party_ledger.py
+++ b/addons/account/wizard/wizard_third_party_ledger.py
@@ -105,6 +105,12 @@ class wizard_report(wizard.interface):
data['form']['soldeinit'] = True
return data['form']
+ def _check(self, cr, uid, data, context):
+ if data['form']['page_split']:
+ return 'report'
+ else:
+ return 'report_other'
+
def _check_date(self, cr, uid, data, context):
sql = """
@@ -134,12 +140,21 @@ class wizard_report(wizard.interface):
states = {
'init': {
'actions': [_get_defaults],
- 'result': {'type':'form', 'arch':period_form, 'fields':period_fields, 'state':[('end','Cancel','gtk-cancel'),('report','Print','gtk-print')]}
+ 'result': {'type':'form', 'arch':period_form, 'fields':period_fields, 'state':[('end','Cancel','gtk-cancel'),('checkreport','Print','gtk-print')]}
+ },
+ 'checkreport': {
+ 'actions': [],
+ 'result': {'type':'choice','next_state':_check}
},
'report': {
'actions': [_check_state],
'result': {'type':'print', 'report':'account.third_party_ledger', 'state':'end'}
+ },
+ 'report_other': {
+ 'actions': [_check_state],
+ 'result': {'type':'print', 'report':'account.third_party_ledger_other', 'state':'end'}
}
+
}
wizard_report('account.third_party_ledger.report')
diff --git a/addons/account_invoice_layout/report/report_account_invoice_layout.rml b/addons/account_invoice_layout/report/report_account_invoice_layout.rml
index f9166f00104..5fabe670f81 100644
--- a/addons/account_invoice_layout/report/report_account_invoice_layout.rml
+++ b/addons/account_invoice_layout/report/report_account_invoice_layout.rml
@@ -17,16 +17,20 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
@@ -35,89 +39,88 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
[[ repeatIn(objects,'o') ]]
[[ setLang(o.partner_id.lang) ]]
-
-|
-
-
-
- |
-
-[[ o.partner_id.title or '' ]] [[ o.partner_id.name ]]
-[[ o.address_invoice_id.title or '' ]] [[ o.address_invoice_id.name ]]
-[[ o.address_invoice_id.street ]]
-[[ o.address_invoice_id.street2 or '' ]]
-[[ o.address_invoice_id.zip or '' ]] [[ o.address_invoice_id.city or '' ]]
-[[ o.address_invoice_id.state_id and o.address_invoice_id.state_id.name or '' ]]
-[[ o.address_invoice_id.country_id and o.address_invoice_id.country_id.name or '' ]]
-
-
-
-Tel. : [[ o.address_invoice_id.phone or removeParentNode('para') ]]
-Fax : [[ o.address_invoice_id.fax or removeParentNode('para') ]]
-VAT : [[ o.partner_id.vat or removeParentNode('para') ]]
- |
-
+
+ | |
+
+ [[ o.partner_id.title or '' ]] [[ o.partner_id.name ]]
+ [[ o.address_invoice_id.title or '' ]] [[ o.address_invoice_id.name ]]
+ [[ o.address_invoice_id.street ]]
+ [[ o.address_invoice_id.street2 or '' ]]
+ [[ o.address_invoice_id.zip or '' ]] [[ o.address_invoice_id.city or '' ]]
+ [[ o.address_invoice_id.state_id and o.address_invoice_id.state_id.name or '' ]]
+ [[ o.address_invoice_id.country_id and o.address_invoice_id.country_id.name or '' ]]
+
+ Tel. : [[ o.address_invoice_id.phone or removeParentNode('para') ]]
+ Fax : [[ o.address_invoice_id.fax or removeParentNode('para') ]]
+ VAT : [[ o.partner_id.vat or removeParentNode('para') ]]
+ |
+
-
-
+
+
Invoice [[ ((o.type == 'out_invoice' and (o.state == 'open' or o.state == 'paid')) or removeParentNode('para')) and '' ]] [[ o.number ]]
PRO-FORMA [[ ((o.type == 'out_invoice' and o.state == 'proforma') or removeParentNode('para')) and '' ]]
@@ -125,190 +128,142 @@
Canceled Invoice [[ ((o.type == 'out_invoice' and o.state == 'cancel') or removeParentNode('para')) and '' ]]
Refund [[ (o.type=='out_refund' or removeParentNode('para')) and '' ]] [[ o.number ]]
Supplier Refund [[ (o.type=='in_refund' or removeParentNode('para')) and '' ]] [[ o.number ]]
-
-Supplier Invoice [[ (o.type=='in_invoice' or removeParentNode('para')) and '' ]]
-[[ o.number ]]
+Supplier Invoice [[ (o.type=='in_invoice' or removeParentNode('para')) and '' ]][[ o.number ]]
+
+
-
-
+Document:[[ o.name ]]
+
+Invoice Date: [[ formatLang(o.date_invoice,date=True) ]]
+Customer Ref:[[ o.address_invoice_id.partner_id.ref or '/' ]]
+
+
-
-Document:[[ o.name ]]
-
-
-Invoice Date: [[ formatLang(o.date_invoice,date=True) ]]
-
-
-Customer Ref: [[ o.address_invoice_id.partner_id.ref or '/' ]]
-
-
-
-
-
-
-
+
-|
-Description
- |
-
-Taxes
- |
-
-Quantity
- |
-
-Unit Price
- |
-
-Disc. (%)
- |
-
-Price
- |
+Description |
+Taxes |
+Quantity |
+Unit Price |
+Disc. (%) |
+Price |
[[ repeatIn(invoice_lines(o), 'a') ]]
-
+
- |
- [[ a['type']=='text' and removeParentNode('blockTable')]]
- |
-
- [[ (a['type']=='title' or a['type']=='subtotal') and ( setTag('para','para',{'fontName':'Times-bold'})) ]][[ a['name'] ]]
- |
-
- [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Times-bold'})) ]][[ a['tax_types'] ]]
- |
-
- [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Times-bold'})) ]][[ a['quantity'] ]]
- |
-
- [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Times-bold'})) ]][[ a['uos'] ]]
- |
-
-
- |
-
- [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Times-bold'})) ]][[ a['price_unit'] ]]
- |
-
- [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Times-bold'})) ]][[ a['discount'] ]]
- |
-
- [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Times-bold'})) ]][[ a['price_subtotal'] ]]
- |
-
- [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Times-bold'})) ]][[ a['currency'] ]]
- |
+ [[ a['type']=='text' and removeParentNode('blockTable')]] |
+ [[ (a['type']=='title' or a['type']=='subtotal') and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['name'] ]] |
+ [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['tax_types'] ]] |
+ [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['quantity'] ]] |
+ [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['uos'] ]] |
+ |
+ [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['price_unit'] ]] |
+ [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['discount'] ]] |
+ [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['price_subtotal'] ]] |
+ [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['currency'] ]] |
+
+
+ |
+ [[ format(a['note'] or removeParentNode('tr')) ]] |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
- |
- [[ a['type']=='text' and a['name'] or removeParentNode('blockTable') ]]
- |
-
- [[ a['type']=='text' and '' or removeParentNode('blockTable') ]]
- |
-
-
-
-
- |
- [[ a['note']=='' and removeParentNode('blockTable') ]][[ repeatIn(( a['note'] and a['note'].splitlines()) or [], 'note') ]]
- |
-
- [[ note or removeParentNode('blockTable') ]]
- |
+ [[ a['type']=='text' and a['name'] or removeParentNode('blockTable') ]] |
+ [[ a['type']=='text' and '' or removeParentNode('blockTable') ]] |
[[ a['type']!='break' and removeParentNode('pageBreak')]]
-
+
- |
- Description [[ a['type']!='break' and removeParentNode('blockTable')]]
- |
-
- Taxes
- |
-
- Quantity
- |
-
- Unit Price
- |
-
- Disc. (%)
- |
-
- Price
- |
+ Description [[ a['type']!='break' and removeParentNode('blockTable')]] |
+ Taxes |
+ Quantity |
+ Unit Price |
+ Disc. (%) |
+ Price |
-
-
+
+
+
+
+
+ |
+ |
+ |
+
+
+ |
+ |
+ |
+
+
+ |
+
+
+
+ | Total (Excl. taxes): |
+ [[ '%.2f' % o.amount_untaxed ]] [[o.currency_id.code ]] |
+
+
+ | Taxes: |
+ [[ '%.2f' % o.amount_tax ]] [[o.currency_id.code ]] |
+
+
+ | Total (Incl. taxes): |
+ [[ '%.2f' % o.amount_total ]] [[o.currency_id.code ]] |
+
+
+ |
+
+
+
-
-|
-Tax
- |
-
-Base
- |
-
-Amount
- |
-
-
-|
-[[ repeatIn(o.tax_line,'t') ]] [[ t.name ]]
- |
-
-[[ '%.2f' % t.base ]]
- |
-
-[[ '%.2f' % t.amount]]
- |
-
+
+ | Tax |
+ Base |
+ Amount |
+
+
+ | [[ repeatIn(o.tax_line,'t') ]][[ t.name ]] |
+ [[ '%.2f' % t.base ]] |
+ [[ '%.2f' % t.amount]] |
+
|
-
-
-|
-Total (excl. taxes):
- |
-
-[[ '%.2f' % o.amount_untaxed ]] [[o.currency_id.code ]]
+
+
+ |
+ |
+ |
+
+
+ |
+ |
+ |
+
+
|
-
-|
-Taxes:
- |
-
-[[ '%.2f' % o.amount_tax ]] [[o.currency_id.code ]]
- |
-
-
-|
-Total (incl. taxes):
+
+
+
- |
-
-[[ '%.2f' % o.amount_total ]] [[o.currency_id.code ]]
- |
-
-
-
- |
-
-
[[ format(o.comment) or '' ]]
[[ format(o.payment_term and o.payment_term.note) or '' ]]
diff --git a/addons/account_invoice_layout/report/special_message_invoice.rml b/addons/account_invoice_layout/report/special_message_invoice.rml
index 4878163a1b8..16deca9e70c 100644
--- a/addons/account_invoice_layout/report/special_message_invoice.rml
+++ b/addons/account_invoice_layout/report/special_message_invoice.rml
@@ -17,16 +17,20 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
@@ -35,87 +39,89 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
[[ repeatIn(objects,'o') ]]
[[ setLang(o.partner_id.lang) ]]
-
-|
-
-
-
- |
-
-[[ o.partner_id.title or '' ]] [[ o.partner_id.name ]]
-[[ o.address_invoice_id.title or '' ]] [[ o.address_invoice_id.name ]]
-[[ o.address_invoice_id.street ]]
-[[ o.address_invoice_id.street2 or '' ]]
-[[ o.address_invoice_id.zip or '' ]] [[ o.address_invoice_id.city or '' ]]
-[[ o.address_invoice_id.state_id and o.address_invoice_id.state_id.name or '' ]]
-[[ o.address_invoice_id.country_id and o.address_invoice_id.country_id.name or '' ]]
-
-
-
-Tel. : [[ o.address_invoice_id.phone or removeParentNode('para') ]]
-Fax : [[ o.address_invoice_id.fax or removeParentNode('para') ]]
-VAT : [[ o.partner_id.vat or removeParentNode('para') ]]
- |
-
+
+ | |
+
+ [[ o.partner_id.title or '' ]] [[ o.partner_id.name ]]
+ [[ o.address_invoice_id.title or '' ]] [[ o.address_invoice_id.name ]]
+ [[ o.address_invoice_id.street ]]
+ [[ o.address_invoice_id.street2 or '' ]]
+ [[ o.address_invoice_id.zip or '' ]] [[ o.address_invoice_id.city or '' ]]
+ [[ o.address_invoice_id.state_id and o.address_invoice_id.state_id.name or '' ]]
+ [[ o.address_invoice_id.country_id and o.address_invoice_id.country_id.name or '' ]]
+
+
+
+ Tel. : [[ o.address_invoice_id.phone or removeParentNode('para') ]]
+ Fax : [[ o.address_invoice_id.fax or removeParentNode('para') ]]
+ VAT : [[ o.partner_id.vat or removeParentNode('para') ]]
+ |
+
-
+
Invoice [[ ((o.type == 'out_invoice' and (o.state == 'open' or o.state == 'paid')) or removeParentNode('para')) and '' ]] [[ o.number ]]
@@ -124,189 +130,145 @@
Canceled Invoice [[ ((o.type == 'out_invoice' and o.state == 'cancel') or removeParentNode('para')) and '' ]]
Refund [[ (o.type=='out_refund' or removeParentNode('para')) and '' ]] [[ o.number ]]
Supplier Refund [[ (o.type=='in_refund' or removeParentNode('para')) and '' ]] [[ o.number ]]
-
-Supplier Invoice [[ (o.type=='in_invoice' or removeParentNode('para')) and '' ]]
-[[ o.number ]]
-
-
+Supplier Invoice [[ (o.type=='in_invoice' or removeParentNode('para')) and '' ]][[ o.number ]]
+
-
-Document:[[o.name]]
-
-
-Invoice Date: [[ formatLang(o.date_invoice,date=True) ]]
-
-
-Customer Ref: [[ o.address_invoice_id.partner_id.ref or '/' ]]
-
-
-
-
-
-|
-Description
- |
-
-Taxes
- |
-
-Quantity
- |
-
-Unit Price
- |
-
-Disc. (%)
- |
-
-Price
- |
-
+Document:[[o.name]]
+
+Invoice Date: [[ formatLang(o.date_invoice,date=True) ]]
+Customer Ref: [[ o.address_invoice_id.partner_id.ref or '/' ]]
+
+
+
+ | Description |
+ Taxes |
+ Quantity |
+ Unit Price |
+ Disc. (%) |
+ Price |
+
[[ repeatIn(invoice_lines(o), 'a') ]]
-
+
- |
- [[ a['type']=='text' and removeParentNode('blockTable')]]
- |
-
- [[ (a['type']=='title' or a['type']=='subtotal') and ( setTag('para','para',{'fontName':'Times-bold'})) ]][[ a['name'] ]]
- |
-
- [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Times-bold'})) ]][[ a['tax_types'] ]]
- |
-
- [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Times-bold'})) ]][[ a['quantity'] ]]
- |
-
- [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Times-bold'})) ]][[ a['uos'] ]]
- |
-
-
- |
-
- [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Times-bold'})) ]][[ a['price_unit'] ]]
- |
-
- [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Times-bold'})) ]][[ a['discount'] ]]
- |
-
- [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Times-bold'})) ]][[ a['price_subtotal'] ]]
- |
-
- [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Times-bold'})) ]][[ a['currency'] ]]
- |
+ [[ a['type']=='text' and removeParentNode('blockTable')]] |
+ [[ (a['type']=='title' or a['type']=='subtotal') and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['name'] ]] |
+ [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['tax_types'] ]] |
+ [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['quantity'] ]] |
+ [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['uos'] ]] |
+ |
+ [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['price_unit'] ]] |
+ [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['discount'] ]] |
+ [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['price_subtotal'] ]] |
+ [[ a['type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['currency'] ]] |
+
+
+ |
+ [[ format(a['note'] or '') ]] |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
- |
- [[ a['type']=='text' and a['name'] or removeParentNode('blockTable') ]]
- |
-
- [[ a['type']=='text' and '' or removeParentNode('blockTable') ]]
- |
-
-
-
-
- |
- [[ a['note']=='' and removeParentNode('blockTable') ]][[ repeatIn(( a['note'] and a['note'].splitlines()) or [], 'note') ]]
- |
-
- [[ note or removeParentNode('blockTable') ]]
- |
+ [[ a['type']=='text' and a['name'] or removeParentNode('blockTable') ]] |
+ [[ a['type']=='text' and '' or removeParentNode('blockTable') ]] |
[[ a['type']!='break' and removeParentNode('pageBreak')]]
-
+
- |
- Description [[ a['type']!='break' and removeParentNode('blockTable')]]
- |
-
- Taxes
- |
-
- Quantity
- |
-
- Unit Price
- |
-
- Disc. (%)
- |
-
- Price
- |
+ Description [[ a['type']!='break' and removeParentNode('blockTable')]] |
+ Taxes |
+ Quantity |
+ Unit Price |
+ Disc. (%) |
+ Price |
-
-
+
-
-
-
-Tax
+
+
+ |
+ |
+ |
+
+
+ |
+ |
+ |
+
+
|
-Base
- |
-
-Amount
- |
-
-
-|
-[[ repeatIn(o.tax_line,'t') ]] [[ t.name ]]
- |
-
-[[ '%.2f' % t.base ]]
- |
-
-[[ '%.2f' % t.amount]]
+
+
+ | Total (Excl. taxes): |
+ [[ '%.2f' % o.amount_untaxed ]] [[o.currency_id.code ]] |
+
+
+ | Taxes: |
+ [[ '%.2f' % o.amount_tax ]] [[o.currency_id.code ]] |
+
+
+ | Total (Incl. taxes): |
+ [[ '%.2f' % o.amount_total ]] [[o.currency_id.code ]] |
+
+
|
- |
-
-
+
-Total (excl. taxes):
+
+
+ | Tax |
+ Base |
+ Amount |
+
+
+ | [[ repeatIn(o.tax_line,'t') ]][[ t.name ]] |
+ [[ '%.2f' % t.base ]] |
+ [[ '%.2f' % t.amount]] |
+
+
|
-[[ '%.2f' % o.amount_untaxed ]] [[o.currency_id.code ]]
+
+
+ |
+ |
+ |
+
+
+ |
+ |
+ |
+
+
|
-
-|
-Taxes:
- |
-
-[[ '%.2f' % o.amount_tax ]] [[o.currency_id.code ]]
- |
-
-
-|
-Total (incl. taxes):
+
+
+
- |
-
-[[ '%.2f' % o.amount_total ]] [[o.currency_id.code ]]
- |
-
-
-
- |
-
-
[[ format(o.comment) or '' ]]
[[ format(o.payment_term and o.payment_term.note) or '' ]]
+
+
+
[[ repeatIn((spcl_msg(data['form']) and spcl_msg(data['form']).splitlines()) or [], 'note') ]]
[[ note or removeParentNode('para') ]]
diff --git a/addons/hr/hr.py b/addons/hr/hr.py
index 5489735db29..3fe64ea6bba 100644
--- a/addons/hr/hr.py
+++ b/addons/hr/hr.py
@@ -22,6 +22,7 @@
from mx import DateTime
import time
+import math
from osv import fields, osv
from tools.translate import _
@@ -34,50 +35,57 @@ class hr_timesheet_group(osv.osv):
'timesheet_id' : fields.one2many('hr.timesheet', 'tgroup_id', 'Working Time'),
'manager' : fields.many2one('res.users', 'Workgroup manager'),
}
- #
- # TODO: improve; very slow !
- # bug if transition to another period
- #
+ def interval_min_get(self, cr, uid, id, dt_from, hours):
+ if not id:
+ return [(dt_from-DateTime.RelativeDateTime(hours=int(hours)*3), dt_from)]
+ todo = hours
+ cycle = 0
+ result = []
+ maxrecur = 100
+ current_hour = dt_from.hour
+ while (todo>0) and maxrecur:
+ cr.execute("select hour_from,hour_to from hr_timesheet where dayofweek='%s' and tgroup_id=%s order by hour_from desc", (dt_from.day_of_week,id))
+ for (hour_from,hour_to) in cr.fetchall():
+ if (hour_from0):
+ m = min(hour_to, current_hour)
+ if (m-hour_from)>todo:
+ hour_from = m-todo
+ d1 = DateTime.DateTime(dt_from.year,dt_from.month,dt_from.day,int(math.floor(hour_from)),int((hour_from%1) * 60))
+ d2 = DateTime.DateTime(dt_from.year,dt_from.month,dt_from.day,int(math.floor(m)),int((m%1) * 60))
+ result.append((d1, d2))
+ current_hour = hour_from
+ todo -= (m-hour_from)
+ dt_from -= DateTime.RelativeDateTime(days=1)
+ current_hour = 24
+ maxrecur -= 1
+ result.reverse()
+ return result
+
def interval_get(self, cr, uid, id, dt_from, hours, byday=True):
if not id:
return [(dt_from,dt_from+DateTime.RelativeDateTime(hours=int(hours)*3))]
todo = hours
cycle = 0
result = []
- while todo>0:
+ maxrecur = 100
+ current_hour = dt_from.hour
+ while (todo>0) and maxrecur:
cr.execute("select hour_from,hour_to from hr_timesheet where dayofweek='%s' and tgroup_id=%s order by hour_from", (dt_from.day_of_week,id))
for (hour_from,hour_to) in cr.fetchall():
-
- import math
-
- hour_from = '%02d:%02d' % (math.floor(abs(hour_from)),round(abs(hour_from)%1+0.01,2) * 60)
- hour_to = '%02d:%02d' % (math.floor(abs(hour_to)),round(abs(hour_to)%1+0.01,2) * 60)
-
- h1,m1 = map(int,hour_from.split(':'))
- h2,m2 = map(int,hour_to.split(':'))
- d1 = DateTime.DateTime(dt_from.year,dt_from.month,dt_from.day,h1,m1)
- d2 = DateTime.DateTime(dt_from.year,dt_from.month,dt_from.day,h2,m2)
- if dt_from7 and todo==hours:
- return [(dt_from,dt_from+DateTime.RelativeDateTime(hours=hours*3))]
- if byday:
- i = 1
- while icurrent_hour) and (todo>0):
+ m = max(hour_from, current_hour)
+ if (hour_to-m)>todo:
+ hour_to = m+todo
+ d1 = DateTime.DateTime(dt_from.year,dt_from.month,dt_from.day,int(math.floor(m)),int((m%1) * 60))
+ d2 = DateTime.DateTime(dt_from.year,dt_from.month,dt_from.day,int(math.floor(hour_to)),int((hour_to%1) * 60))
+ result.append((d1, d2))
+ current_hour = hour_to
+ todo -= (hour_to - m)
+ dt_from += DateTime.RelativeDateTime(days=1)
+ current_hour = 0
+ maxrecur -= 1
return result
+
hr_timesheet_group()
diff --git a/addons/membership/membership_demo.xml b/addons/membership/membership_demo.xml
index dba3e44abc3..35b04539ce3 100644
--- a/addons/membership/membership_demo.xml
+++ b/addons/membership/membership_demo.xml
@@ -26,7 +26,7 @@
membership
- 0
+ Membership-0
@@ -36,7 +36,7 @@
membership account
- 1254
+ Membership-1254
diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py
index 726b7c0325f..e1f02ec39a6 100644
--- a/addons/mrp/mrp.py
+++ b/addons/mrp/mrp.py
@@ -380,6 +380,12 @@ class mrp_production(osv.osv):
result[prod.id]['cycle_total'] += wc.cycle
return result
+ def _production_date_end(self, cr, uid, ids, prop, unknow_none, context={}):
+ result = {}
+ for prod in self.browse(cr, uid, ids, context=context):
+ result[prod.id] = prod.date_planned
+ return result
+
def _production_date(self, cr, uid, ids, prop, unknow_none, context={}):
result = {}
for prod in self.browse(cr, uid, ids, context=context):
@@ -408,7 +414,8 @@ class mrp_production(osv.osv):
'location_dest_id': fields.many2one('stock.location', 'Finished Products Location', required=True,
help="Location where the system will stock the finished products."),
- 'date_planned_date': fields.function(_production_date, method=True, type='date', string='Planned Date'),
+ 'date_planned_end': fields.function(_production_date_end, method=True, type='date', string='Scheduled End'),
+ 'date_planned_date': fields.function(_production_date, method=True, type='date', string='Scheduled Date'),
'date_planned': fields.datetime('Scheduled date', required=True, select=1),
'date_start': fields.datetime('Start Date'),
'date_finnished': fields.datetime('End Date'),
@@ -456,7 +463,8 @@ class mrp_production(osv.osv):
default.update({
'name': self.pool.get('ir.sequence').get(cr, uid, 'mrp.production'),
'move_lines' : [],
- 'move_created_ids': []
+ 'move_created_ids': [],
+ 'state': 'draft'
})
return super(mrp_production, self).copy(cr, uid, id, default, context)
@@ -722,9 +730,10 @@ stock_move()
class mrp_production_workcenter_line(osv.osv):
_name = 'mrp.production.workcenter.line'
- _description = 'Production workcenters used'
+ _description = 'Work Orders'
+ _order = 'sequence'
_columns = {
- 'name': fields.char('Name', size=64, required=True),
+ 'name': fields.char('Work Order', size=64, required=True),
'workcenter_id': fields.many2one('mrp.workcenter', 'Workcenter', required=True),
'cycle': fields.float('Nbr of cycle', digits=(16,2)),
'hour': fields.float('Nbr of hour', digits=(16,2)),
diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml
index c2f8d94eaac..5ae97154a42 100644
--- a/addons/mrp/mrp_view.xml
+++ b/addons/mrp/mrp_view.xml
@@ -409,9 +409,9 @@
mrp.production
gantt
-
+
-
+
diff --git a/addons/mrp_operations/mrp_operations.py b/addons/mrp_operations/mrp_operations.py
index 94a265c6bfb..94f1460ca1c 100644
--- a/addons/mrp_operations/mrp_operations.py
+++ b/addons/mrp_operations/mrp_operations.py
@@ -2,7 +2,7 @@
##############################################################################
#
# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2009 Tiny SPRL (). All Rights Reserved
+# dmr Copyright (C) 2004-2009 Tiny SPRL (). All Rights Reserved
# $Id$
#
# This program is free software: you can redistribute it and/or modify
@@ -39,22 +39,53 @@ from tools.translate import _
# TODO: Work Center may be recursive ?
#
+class stock_move(osv.osv):
+ _inherit = 'stock.move'
+ _columns = {
+ 'move_dest_id_lines': fields.one2many('stock.move','move_dest_id', 'Children Moves')
+ }
+stock_move()
+
class mrp_production_workcenter_line(osv.osv):
+ def _get_date_date(self, cr, uid, ids, field_name, arg, context):
+ res={}
+ for op in self.browse(cr, uid, ids, context=context):
+ if op.date_start:
+ res[op.id] = op.date_start[:10]
+ else:
+ res[op.id]=False
+ return res
+ def _get_date_end(self, cr, uid, ids, field_name, arg, context):
+ res={}
+ for op in self.browse(cr, uid, ids, context=context):
+ d = DateTime.strptime(op.date_planned,'%Y-%m-%d %H:%M:%S')
+ i = self.pool.get('hr.timesheet.group').interval_get(cr, uid, op.workcenter_id.timesheet_id.id or False, d, op.hour or 0.0)
+ if i:
+ res[op.id] = i[-1][1].strftime('%Y-%m-%d %H:%M:%S')
+ else:
+ res[op.id] = op.date_planned
+ return res
_inherit = 'mrp.production.workcenter.line'
_columns = {
'state': fields.selection([('draft','Draft'),('startworking', 'In Progress'),('pause','Pause'),('cancel','Canceled'),('done','Finished')],'Status', readonly=True),
- 'date_planned': fields.related('production_id', 'date_planned', type='datetime', string='Date Planned'),
+ 'date_start_date': fields.function(_get_date_date, method=True, string='Start Date', type='date'),
+ 'date_planned': fields.datetime('Scheduled Date'),
+ 'date_planned_end': fields.function(_get_date_end, method=True, string='End Date', type='datetime'),
'date_start': fields.datetime('Start Date'),
'date_finnished': fields.datetime('End Date'),
- 'delay': fields.char('Delay',size=128,help="This is delay between operation start and stop in this workcenter",readonly=True),
- 'production_state':fields.related('production_id','state',type='char',string='Prod.State'),
- 'product':fields.related('production_id','product_id',type='many2one',relation='product.product',string='Product'),
- 'qty':fields.related('production_id','product_qty',type='float',string='Qty'),
- 'uom':fields.related('production_id','product_uom',type='many2one',relation='product.uom',string='UOM'),
+ 'delay': fields.float('Working Hours',help="This is delay between operation start and stop in this workcenter",readonly=True),
+ 'production_state':fields.related('production_id','state',
+ type='selection',
+ selection=[('draft','Draft'),('picking_except', 'Packing Exception'),('confirmed','Waiting Goods'),('ready','Ready to Produce'),('in_production','In Production'),('cancel','Canceled'),('done','Done')],
+ string='Prod.State', readonly=True),
+ 'product':fields.related('production_id','product_id',type='many2one',relation='product.product',string='Product',
+ readonly=True),
+ 'qty':fields.related('production_id','product_qty',type='float',string='Qty',readonly=True),
+ 'uom':fields.related('production_id','product_uom',type='many2one',relation='product.uom',string='UOM',readonly=True),
}
_defaults = {
'state': lambda *a: 'draft',
- 'delay': lambda *a: '0 Days 0 hrs and 0 mins'
+ 'delay': lambda *a: 0.0
}
def modify_production_order_state(self,cr,uid,ids,action):
@@ -82,17 +113,28 @@ class mrp_production_workcenter_line(osv.osv):
wf_service.trg_validate(uid, 'mrp.production', oper_obj.production_id.id, 'button_produce_done', cr)
return
+ def write(self, cr, uid, ids, vals, context={}, update=True):
+ result = super(mrp_production_workcenter_line, self).write(cr, uid, ids, vals, context=context)
+ if vals.get('date_planned', False) and update:
+ pids = {}
+ pids2 = {}
+ for prod in self.browse(cr, uid, ids, context=context):
+ if prod.production_id.workcenter_lines:
+ dstart = min(vals['date_planned'], prod.production_id.workcenter_lines[0]['date_planned'])
+ self.pool.get('mrp.production').write(cr, uid, [prod.production_id.id], {'date_start':dstart}, context=context, mini=False)
+ return result
+
def action_draft(self, cr, uid, ids):
self.write(cr, uid, ids, {'state':'draft'})
return True
def action_start_working(self, cr, uid, ids):
self.modify_production_order_state(cr,uid,ids,'start')
- self.write(cr, uid, ids, {'state':'startworking'})
+ self.write(cr, uid, ids, {'state':'startworking', 'date_start': time.strftime('%Y-%m-%d %H:%M:%S')})
return True
def action_done(self, cr, uid, ids):
- self.write(cr, uid, ids, {'state':'done'})
+ self.write(cr, uid, ids, {'state':'done', 'date_finnished': time.strftime('%Y-%m-%d %H:%M:%S')})
self.modify_production_order_state(cr,uid,ids,'done')
return True
@@ -111,9 +153,18 @@ class mrp_production_workcenter_line(osv.osv):
mrp_production_workcenter_line()
class mrp_production(osv.osv):
- _name = 'mrp.production'
_inherit = 'mrp.production'
- _description = 'Production'
+ _columns = {
+ 'allow_reorder': fields.boolean('Free Serialisation', help="Check this to be able to move independently all production orders, without moving dependent ones."),
+ }
+
+ def _production_date_end(self, cr, uid, ids, prop, unknow_none, context={}):
+ result = {}
+ for prod in self.browse(cr, uid, ids, context=context):
+ result[prod.id] = prod.date_planned
+ for line in prod.workcenter_lines:
+ result[prod.id] = max(line.date_planned_end, result[prod.id])
+ return result
def action_production_end(self, cr, uid, ids):
obj=self.browse(cr,uid,ids)[0]
@@ -127,6 +178,108 @@ class mrp_production(osv.osv):
tmp=self.pool.get('mrp.production.workcenter.line').action_cancel(cr,uid,[workcenter_line.id])
return super(mrp_production,self).action_cancel(cr,uid,ids)
+ def _compute_planned_workcenter(self, cr, uid, ids, context={}, mini=False):
+ dt_end = DateTime.now()
+ for po in self.browse(cr, uid, ids, context=context):
+ dt_end = DateTime.strptime(po.date_start or po.date_planned, '%Y-%m-%d %H:%M:%S')
+ if not po.date_start:
+ self.write(cr, uid, [po.id], {
+ 'date_start': po.date_planned
+ }, context=context, update=False)
+ old = None
+ for wci in range(len(po.workcenter_lines)):
+ wc = po.workcenter_lines[wci]
+ if (old is None) or (wc.sequence>old):
+ dt = dt_end
+ if context.get('__last_update'):
+ del context['__last_update']
+ if (wc.date_planneddt):
+ if l.production_id.state not in ('done','cancel'):
+ for wc in l.production_id.workcenter_lines:
+ i = self.pool.get('hr.timesheet.group').interval_min_get(
+ cr,
+ uid,
+ wc.workcenter_id.timesheet_id.id or False,
+ dt, wc.hour or 0.0
+ )
+ dt = i[0][0]
+ if l.production_id.date_start>dt.strftime('%Y-%m-%d %H:%M:%S'):
+ self.write(cr, uid, [l.production_id.id], {'date_start':dt.strftime('%Y-%m-%d %H:%M:%S')}, mini=True)
+ return True
+
+ def _move_futur(self, cr, uid, ids, context={}):
+ for po in self.browse(cr, uid, ids, context):
+ if po.allow_reorder:
+ continue
+ for line in po.move_created_ids:
+ l = line
+ while l.move_dest_id:
+ l = l.move_dest_id
+ if l.state in ('done','cancel','draft'):
+ break
+ if l.production_id.state in ('done','cancel'):
+ break
+ if l.production_id and (l.production_id.date_start=60:
- m+=1
- s=0
- if m>=60:
- h+=1
- m=0
- if h>=24:
- days+=1
- h=0
- delay=str(days) +" Days "+ str(h) + " hrs and " + str(m)+ " mins"
- return delay
+ a = datetime.datetime.strptime(time_lst[i-1],'%Y:%m:%d %H:%M:%S')
+ b = datetime.datetime.strptime(time_lst[i],'%Y:%m:%d %H:%M:%S')
+ diff += (b-a).days * 24
+ diff += (b-a).seconds / (60*60)
+ return diff
def check_operation(self,cr,uid,vals):
code_ids=self.pool.get('mrp_operations.operation.code').search(cr,uid,[('id','=',vals['code_id'])])
@@ -300,8 +439,8 @@ class mrp_operations_operation(osv.osv):
'order_date': fields.function(_get_order_date,method=True,string='Order Date',type='date',store={'mrp.production':(_order_date_search_production,['date_planned'], 10)}),
}
_defaults={
- 'date_start': lambda *a:DateTime.now().strftime('%Y-%m-%d %H:%M:%S')
- }
+ 'date_start': lambda *a:DateTime.now().strftime('%Y-%m-%d %H:%M:%S')
+ }
mrp_operations_operation()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mrp_operations/mrp_operations_view.xml b/addons/mrp_operations/mrp_operations_view.xml
index 6d0ac9bcee3..7f248929dd5 100644
--- a/addons/mrp_operations/mrp_operations_view.xml
+++ b/addons/mrp_operations/mrp_operations_view.xml
@@ -10,6 +10,7 @@
+
@@ -31,22 +32,52 @@
@@ -69,8 +100,9 @@
mrp.production.workcenter.line
gantt
-
-
+
+
+
@@ -99,6 +131,17 @@
tree,form,graph,calendar,gantt
+
+
+ Work Orders Planning
+ ir.actions.act_window
+ mrp.production.workcenter.line
+ form
+ [('production_state','in',('ready','confirmed','in_production'))]
+ gantt,tree,form,graph,calendar
+
+
+
@@ -133,6 +176,7 @@
+
@@ -196,9 +240,10 @@
mrp.production.workcenter.line
graph
-
-
+
+
+
@@ -233,6 +278,18 @@
id="menu_mrp_production_operation_action"
action="mrp_production_operation_action"/>
+
+ mrp.production.allow_reorder.form
+
+ mrp.production
+ form
+
+
+
+
+
+
+
mrp.perations.calendar
mrp_operations.operation
|