\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 05:22+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-11-25 05:22+0000\n"
+"X-Generator: Launchpad (build 14376)\n"
#. module: account_invoice_layout
#: selection:account.invoice.line,state:0
msgid "Sub Total"
-msgstr "Subtotal"
+msgstr "Podtotal"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
@@ -32,7 +32,7 @@ msgstr "Napomena:"
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Cancelled Invoice"
-msgstr "Otkazane Fakture"
+msgstr "Otkazana faktura"
#. module: account_invoice_layout
#: selection:account.invoice.line,state:0
@@ -44,7 +44,7 @@ msgstr "Naslov"
#: model:ir.actions.act_window,name:account_invoice_layout.action_account_invoice_special_msg
#: model:ir.actions.report.xml,name:account_invoice_layout.account_invoices_layout_message
msgid "Invoices with Layout and Message"
-msgstr "Formatirana Faktura sa Porukom"
+msgstr "Formatirana faktura sa porukom"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
@@ -60,19 +60,19 @@ msgstr "Napomena"
#. module: account_invoice_layout
#: model:ir.model,name:account_invoice_layout.model_notify_message
msgid "Notify By Messages"
-msgstr "Napomena po porukama"
+msgstr "Obaveštenje putem poruke"
#. module: account_invoice_layout
#: help:notify.message,msg:0
msgid ""
"This notification will appear at the bottom of the Invoices when printed."
-msgstr "Ova napomena ce se pojaviti na dnu fakture pri stampi"
+msgstr "Ova napomena će se pojaviti na dnu faktura kad se odštampa"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Unit Price"
-msgstr "Jedinična cijena"
+msgstr "Pojedinačna cena"
#. module: account_invoice_layout
#: model:ir.module.module,description:account_invoice_layout.module_meta_information
@@ -93,6 +93,20 @@ msgid ""
"\n"
" "
msgstr ""
+"\n"
+" Ovaj modul dodaje funkcije za poboljšanje prikaza faktura.\n"
+"\n"
+" Daje Vam mogućnost da\n"
+" *poređate sve linije jedne fakture\n"
+" *dodajete naslove, linije komentara, linije podtotala\n"
+" *dodajete vodoravne linije i odvajate stranice\n"
+"\n"
+" Povrh toga, postoji opcija koja Vam omogućava štampu svih faktura sa "
+"datom specijalnom porukom\n"
+"na dnu. Ova funkcija je veoma korisna za štampu faktura sa čestitkama za "
+"Novu godinu, specijalnim uslovima...\n"
+"\n"
+" "
#. module: account_invoice_layout
#: report:account.invoice.layout:0
@@ -115,7 +129,7 @@ msgstr "Predračun"
#. module: account_invoice_layout
#: field:account.invoice,abstract_line_ids:0
msgid "Invoice Lines"
-msgstr "Stavke računa"
+msgstr "Linije računa"
#. module: account_invoice_layout
#: view:account.invoice.line:0
@@ -125,7 +139,7 @@ msgstr "Sekv."
#. module: account_invoice_layout
#: model:ir.ui.menu,name:account_invoice_layout.menu_finan_config_notify_message
msgid "Notification Message"
-msgstr "Poruka Napomene"
+msgstr "Poruka obaveštenja"
#. module: account_invoice_layout
#: selection:account.invoice.line,state:0
@@ -136,12 +150,12 @@ msgstr "Proizvod"
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Description"
-msgstr ""
+msgstr "Opis"
#. module: account_invoice_layout
#: help:account.invoice.line,sequence:0
msgid "Gives the sequence order when displaying a list of invoice lines."
-msgstr "poredja sekvence pri prikazu liste faktura."
+msgstr "Daje redosled sekvenci pri prikazu spiska linija fakture"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
@@ -153,7 +167,7 @@ msgstr "Cena"
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Invoice Date"
-msgstr "Datum Fakture"
+msgstr "Datum fakture"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
@@ -163,12 +177,12 @@ msgstr "Porezi:"
#. module: account_invoice_layout
#: field:account.invoice.line,functional_field:0
msgid "Source Account"
-msgstr "Изворни налог"
+msgstr "Izvorni nalog"
#. module: account_invoice_layout
#: model:ir.actions.act_window,name:account_invoice_layout.notify_mesage_tree_form
msgid "Write Messages"
-msgstr "Napisi Poruke"
+msgstr "Napiši poruke"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
@@ -179,18 +193,18 @@ msgstr "Osnova"
#. module: account_invoice_layout
#: selection:account.invoice.line,state:0
msgid "Page Break"
-msgstr "Прелом стране"
+msgstr "Kraj stranice"
#. module: account_invoice_layout
#: view:notify.message:0
#: field:notify.message,msg:0
msgid "Special Message"
-msgstr "Specijalna Poruka"
+msgstr "Specijalna poruka"
#. module: account_invoice_layout
#: help:account.invoice.special.msg,message:0
msgid "Message to Print at the bottom of report"
-msgstr "Poruka koja se stampa pri dnu izvestaja"
+msgstr "Poruka za štampu pri dnu izveštaja"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
@@ -202,7 +216,7 @@ msgstr "Količina"
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Refund"
-msgstr "Refundiraj"
+msgstr "Refundiranje"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
@@ -228,7 +242,7 @@ msgstr "Poruke"
#. module: account_invoice_layout
#: model:ir.actions.report.xml,name:account_invoice_layout.account_invoices_1
msgid "Invoices with Layout"
-msgstr "Formatirana Faktura"
+msgstr "Formatirane Fakture"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
@@ -240,33 +254,33 @@ msgstr "Opis / Porezi"
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Amount"
-msgstr "Iznos"
+msgstr "Količina"
#. module: account_invoice_layout
#: model:notify.message,msg:account_invoice_layout.demo_message1
msgid "ERP & CRM Solutions..."
-msgstr ""
+msgstr "ERP & CRM Rešenja..."
#. module: account_invoice_layout
#: report:notify_account.invoice:0
msgid "Net Total :"
-msgstr ""
+msgstr "Ukupno neto :"
#. module: account_invoice_layout
#: report:notify_account.invoice:0
msgid "Total :"
-msgstr ""
+msgstr "Ukupno :"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Draft Invoice"
-msgstr "Neodobreni računi"
+msgstr "Fakture u pripremi"
#. module: account_invoice_layout
#: field:account.invoice.line,sequence:0
msgid "Sequence Number"
-msgstr "Broj Sekvence"
+msgstr "Broj sekvence"
#. module: account_invoice_layout
#: model:ir.model,name:account_invoice_layout.model_account_invoice_special_msg
@@ -277,7 +291,7 @@ msgstr "Specijalna poruka naloga fakture"
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Origin"
-msgstr ""
+msgstr "Poreklo"
#. module: account_invoice_layout
#: field:account.invoice.line,state:0
@@ -293,18 +307,18 @@ msgstr "Linija za odvajanje"
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Your Reference"
-msgstr ""
+msgstr "Vaš poziv na broj"
#. module: account_invoice_layout
#: model:ir.module.module,shortdesc:account_invoice_layout.module_meta_information
msgid "Invoices Layout Improvement"
-msgstr "Unapredjenje izgleda fakture"
+msgstr "Unapređenje izgleda fakture"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Supplier Invoice"
-msgstr "Račun dobavljača"
+msgstr "Faktura dobavljača"
#. module: account_invoice_layout
#: view:account.invoice.special.msg:0
@@ -320,7 +334,7 @@ msgstr "Porez"
#. module: account_invoice_layout
#: model:ir.model,name:account_invoice_layout.model_account_invoice_line
msgid "Invoice Line"
-msgstr "Redak računa"
+msgstr "Red fakture"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
@@ -330,14 +344,14 @@ msgstr "Neto Ukupno"
#. module: account_invoice_layout
#: view:notify.message:0
msgid "Write a notification or a wishful message."
-msgstr "Napisi napomenu ili celu poruku"
+msgstr "Napiši obaveštenje ili neku lepu želju"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: model:ir.model,name:account_invoice_layout.model_account_invoice
#: report:notify_account.invoice:0
msgid "Invoice"
-msgstr "Račun"
+msgstr "Faktura"
#. module: account_invoice_layout
#: view:account.invoice.special.msg:0
@@ -348,7 +362,7 @@ msgstr "Otkaži"
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Supplier Refund"
-msgstr "Povrat Dobavljaču"
+msgstr "Povraćaj dobavljača"
#. module: account_invoice_layout
#: field:account.invoice.special.msg,message:0
@@ -358,12 +372,12 @@ msgstr "Poruka"
#. module: account_invoice_layout
#: report:notify_account.invoice:0
msgid "Taxes :"
-msgstr ""
+msgstr "Porezi :"
#. module: account_invoice_layout
#: model:ir.ui.menu,name:account_invoice_layout.menu_notify_mesage_tree_form
msgid "All Notification Messages"
-msgstr "Sve Napomene"
+msgstr "Sve poruke obaveštenja"
#~ msgid ""
#~ "The Object name must start with x_ and not contain any special character !"
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 c2dc0e036bb..6a8a286b66c 100644
--- a/addons/account_invoice_layout/report/report_account_invoice_layout.rml
+++ b/addons/account_invoice_layout/report/report_account_invoice_layout.rml
@@ -193,11 +193,7 @@
[[ (o.partner_id and o.partner_id.title and o.partner_id.title.name) or '' ]] [[ (o.partner_id and o.partner_id.name) or '' ]]
- [[ (o.address_invoice_id and o.address_invoice_id.street) or '' ]]
- [[ (o.address_invoice_id and o.address_invoice_id.street2) or removeParentNode('para') ]]
- [[ (o.address_invoice_id and o.address_invoice_id.zip) or '' ]] [[ (o.address_invoice_id and o.address_invoice_id.city) or '' ]]
- [[ (o.address_invoice_id and o.address_invoice_id.state_id and o.address_invoice_id.state_id.name) or removeParentNode('para') ]]
- [[ (o.address_invoice_id and o.address_invoice_id.country_id and o.address_invoice_id.country_id.name) or '' ]]
+ [[ display_address(o.address_invoice_id) ]]
@@ -235,7 +231,7 @@
Origin
- Your Reference
+ Customer Code
diff --git a/addons/account_invoice_layout/report/special_message_invoice.rml b/addons/account_invoice_layout/report/special_message_invoice.rml
index c6fc9d236fc..bfef662db85 100644
--- a/addons/account_invoice_layout/report/special_message_invoice.rml
+++ b/addons/account_invoice_layout/report/special_message_invoice.rml
@@ -197,11 +197,7 @@
[[ (o.partner_id and o.partner_id.title and o.partner_id.title.name) or '' ]] [[ (o.partner_id and o.partner_id.name) or '' ]]
- [[ (o.address_invoice_id and o.address_invoice_id.street) or '' ]]
- [[ (o.address_invoice_id and o.address_invoice_id.street2) or removeParentNode('para') ]]
- [[ (o.address_invoice_id and o.address_invoice_id.zip) or '' ]] [[ (o.address_invoice_id and o.address_invoice_id.city) or '' ]]
- [[ (o.address_invoice_id and o.address_invoice_id.state_id and o.address_invoice_id.state_id.name) or removeParentNode('para') ]]
- [[ (o.address_invoice_id and o.address_invoice_id.country_id and o.address_invoice_id.country_id.name) or '' ]]
+ [[ display_address(o.address_invoice_id) ]]
diff --git a/addons/account_invoice_layout/security/ir.model.access.csv b/addons/account_invoice_layout/security/ir.model.access.csv
index c838392e6eb..98878fc91bf 100644
--- a/addons/account_invoice_layout/security/ir.model.access.csv
+++ b/addons/account_invoice_layout/security/ir.model.access.csv
@@ -1,2 +1,2 @@
-id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
-access_notify_message,notify.message,model_notify_message,account.group_account_invoice,1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_notify_message,notify.message,model_notify_message,account.group_account_invoice,1,1,1,1
diff --git a/addons/account_invoice_layout/wizard/account_invoice_special_message.xml b/addons/account_invoice_layout/wizard/account_invoice_special_message.xml
index d849595bfca..5bf1e480d1e 100644
--- a/addons/account_invoice_layout/wizard/account_invoice_special_message.xml
+++ b/addons/account_invoice_layout/wizard/account_invoice_special_message.xml
@@ -32,7 +32,6 @@
-
Account Invioce Special Message
client_print_multi
diff --git a/addons/account_payment/account_payment.py b/addons/account_payment/account_payment.py
index 9858d536d17..ba98c71fc3e 100644
--- a/addons/account_payment/account_payment.py
+++ b/addons/account_payment/account_payment.py
@@ -374,7 +374,7 @@ class payment_line(osv.osv):
data = {}
move_line_obj = self.pool.get('account.move.line')
- data['amount_currency'] = data['communication'] = data['partner_id'] = data['reference'] = data['date_created'] = data['bank_id'] = data['amount'] = False
+ data['amount_currency'] = data['communication'] = data['partner_id'] = data['bank_id'] = data['amount'] = False
if move_line_id:
line = move_line_obj.browse(cr, uid, move_line_id, context=context)
@@ -396,8 +396,6 @@ class payment_line(osv.osv):
temp_dict = self.onchange_partner(cr, uid, ids, line.partner_id.id, payment_type)
data.update(temp_dict['value'])
- data['reference'] = line.ref
- data['date_created'] = line.date_created
data['communication'] = line.ref
if date_prefered == 'now':
diff --git a/addons/account_payment/account_payment_view.xml b/addons/account_payment/account_payment_view.xml
index d0a543bf749..3fc2d716e66 100644
--- a/addons/account_payment/account_payment_view.xml
+++ b/addons/account_payment/account_payment_view.xml
@@ -251,7 +251,7 @@
-
+
@@ -322,7 +322,5 @@
-
-
diff --git a/addons/account_payment/i18n/hr.po b/addons/account_payment/i18n/hr.po
index fbb8a4251ac..02d1ade77aa 100644
--- a/addons/account_payment/i18n/hr.po
+++ b/addons/account_payment/i18n/hr.po
@@ -7,19 +7,19 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
-"PO-Revision-Date: 2011-01-17 01:09+0000\n"
+"PO-Revision-Date: 2011-12-08 17:06+0000\n"
"Last-Translator: Goran Kliska \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 05:21+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-09 04:45+0000\n"
+"X-Generator: Launchpad (build 14450)\n"
#. module: account_payment
#: field:payment.order,date_scheduled:0
msgid "Scheduled date if fixed"
-msgstr "Zakazani datum ako je fiskno"
+msgstr "Zakazani datum ako je fiksno"
#. module: account_payment
#: field:payment.line,currency:0
@@ -29,7 +29,7 @@ msgstr "Valuta partnera"
#. module: account_payment
#: view:payment.order:0
msgid "Set to draft"
-msgstr "Stavi u pripremu"
+msgstr "Postavi na nacrt"
#. module: account_payment
#: help:payment.order,mode:0
@@ -55,7 +55,7 @@ msgstr ""
#. module: account_payment
#: field:payment.order,line_ids:0
msgid "Payment lines"
-msgstr "Retci plaćanja"
+msgstr "Redci plaćanja"
#. module: account_payment
#: view:payment.line:0
@@ -71,6 +71,9 @@ msgid ""
" Once the bank is confirmed the state is set to 'Confirmed'.\n"
" Then the order is paid the state is 'Done'."
msgstr ""
+"When an order is placed the state is 'Draft'.\n"
+" Once the bank is confirmed the state is set to 'Confirmed'.\n"
+" Then the order is paid the state is 'Done'."
#. module: account_payment
#: help:account.invoice,amount_to_pay:0
@@ -84,7 +87,7 @@ msgstr ""
#. module: account_payment
#: field:payment.mode,company_id:0
msgid "Company"
-msgstr "Tvrtka"
+msgstr "Organizacija"
#. module: account_payment
#: field:payment.order,date_prefered:0
@@ -104,7 +107,7 @@ msgstr "Stavke"
#. module: account_payment
#: report:payment.order:0
msgid "Used Account"
-msgstr ""
+msgstr "Used Account"
#. module: account_payment
#: field:payment.line,ml_maturity_date:0
@@ -115,23 +118,23 @@ msgstr "Datum dospijeća"
#. module: account_payment
#: constraint:account.move.line:0
msgid "You can not create move line on closed account."
-msgstr ""
+msgstr "Ne možete kreirati stavke prometa za zatvoreni račun."
#. module: account_payment
#: view:account.move.line:0
msgid "Account Entry Line"
-msgstr "Stavke knjiženja"
+msgstr "Stavke"
#. module: account_payment
#: view:payment.order.create:0
msgid "_Add to payment order"
-msgstr ""
+msgstr "_Dodaj na nalog za plaćanje"
#. module: account_payment
#: model:ir.actions.act_window,name:account_payment.action_account_payment_populate_statement
#: model:ir.actions.act_window,name:account_payment.action_account_populate_statement_confirm
msgid "Payment Populate statement"
-msgstr ""
+msgstr "Popuni nalog za plaćanje"
#. module: account_payment
#: report:payment.order:0
@@ -142,17 +145,17 @@ msgstr "Iznos"
#. module: account_payment
#: sql_constraint:account.move.line:0
msgid "Wrong credit or debit value in accounting entry !"
-msgstr ""
+msgstr "Pogrešno kreditna ili debitnom vrijednost unešene stavke!"
#. module: account_payment
#: view:payment.order:0
msgid "Total in Company Currency"
-msgstr "Ukupno u valuti tvrtke"
+msgstr "Ukupno u valuti organizacije"
#. module: account_payment
#: selection:payment.order,state:0
msgid "Cancelled"
-msgstr "Poništeno"
+msgstr "Otkazani"
#. module: account_payment
#: model:ir.actions.act_window,name:account_payment.action_payment_order_tree_new
@@ -163,12 +166,12 @@ msgstr "Novi nalog za plaćanje"
#: report:payment.order:0
#: field:payment.order,reference:0
msgid "Reference"
-msgstr "Veza"
+msgstr "Vezna oznaka"
#. module: account_payment
#: sql_constraint:payment.line:0
msgid "The payment line name must be unique!"
-msgstr ""
+msgstr "Naziv stavke plaćanja mora biti jedinstven!"
#. module: account_payment
#: model:ir.actions.act_window,name:account_payment.action_payment_order_tree
@@ -225,7 +228,7 @@ msgstr "Stanje"
#: view:payment.line:0
#: view:payment.order:0
msgid "Transaction Information"
-msgstr "Podatci o transakciji"
+msgstr "Podaci o transakciji"
#. module: account_payment
#: model:ir.actions.act_window,name:account_payment.action_payment_mode_form
@@ -244,7 +247,7 @@ msgstr "Efektivni datum"
#. module: account_payment
#: field:payment.line,ml_inv_ref:0
msgid "Invoice Ref."
-msgstr ""
+msgstr "Poziv na br."
#. module: account_payment
#: help:payment.order,date_prefered:0
@@ -276,7 +279,7 @@ msgstr "Datum izvršenja"
#. module: account_payment
#: help:payment.mode,journal:0
msgid "Bank or Cash Journal for the Payment Mode"
-msgstr ""
+msgstr "Dnevnik banke ili blagajne za način plaćanja"
#. module: account_payment
#: selection:payment.order,date_prefered:0
@@ -297,7 +300,7 @@ msgstr "Ciljni konto"
#. module: account_payment
#: view:payment.order:0
msgid "Search Payment Orders"
-msgstr ""
+msgstr "Traži naloge za plaćanje"
#. module: account_payment
#: constraint:account.move.line:0
@@ -323,12 +326,12 @@ msgstr "Ukupni iznos u valuti"
#. module: account_payment
#: view:payment.order:0
msgid "Make Payments"
-msgstr "Napravite plaćanja"
+msgstr "Kreiraj plaćanja"
#. module: account_payment
#: field:payment.line,state:0
msgid "Communication Type"
-msgstr "Vrsta veze"
+msgstr "Vrsta komunikacije"
#. module: account_payment
#: model:ir.module.module,shortdesc:account_payment.module_meta_information
@@ -338,32 +341,32 @@ msgstr ""
#. module: account_payment
#: field:payment.line,bank_statement_line_id:0
msgid "Bank statement line"
-msgstr ""
+msgstr "Redak bankovnog izvoda"
#. module: account_payment
#: selection:payment.order,date_prefered:0
msgid "Due date"
-msgstr ""
+msgstr "Datum dospijeća"
#. module: account_payment
#: field:account.invoice,amount_to_pay:0
msgid "Amount to be paid"
-msgstr ""
+msgstr "Za uplatu"
#. module: account_payment
#: report:payment.order:0
msgid "Currency"
-msgstr ""
+msgstr "Valuta"
#. module: account_payment
#: view:account.payment.make.payment:0
msgid "Yes"
-msgstr ""
+msgstr "Da"
#. module: account_payment
#: help:payment.line,info_owner:0
msgid "Address of the Main Partner"
-msgstr ""
+msgstr "Address of the Main Partner"
#. module: account_payment
#: help:payment.line,date:0
@@ -371,42 +374,44 @@ msgid ""
"If no payment date is specified, the bank will treat this payment line "
"directly"
msgstr ""
+"If no payment date is specified, the bank will treat this payment line "
+"directly"
#. module: account_payment
#: model:ir.model,name:account_payment.model_account_payment_populate_statement
msgid "Account Payment Populate Statement"
-msgstr ""
+msgstr "Popuni izvod plaćanja"
#. module: account_payment
#: help:payment.mode,name:0
msgid "Mode of Payment"
-msgstr ""
+msgstr "Način plaćanja"
#. module: account_payment
#: report:payment.order:0
msgid "Value Date"
-msgstr ""
+msgstr "Value Date"
#. module: account_payment
#: report:payment.order:0
msgid "Payment Type"
-msgstr ""
+msgstr "Uvjet plaćanja"
#. module: account_payment
#: help:payment.line,amount_currency:0
msgid "Payment amount in the partner currency"
-msgstr ""
+msgstr "Iznos plaćanja u partnerovoj valuti"
#. module: account_payment
#: view:payment.order:0
#: selection:payment.order,state:0
msgid "Draft"
-msgstr ""
+msgstr "Nacrt"
#. module: account_payment
#: help:payment.line,communication2:0
msgid "The successor message of Communication."
-msgstr ""
+msgstr "The successor message of Communication."
#. module: account_payment
#: code:addons/account_payment/account_move_line.py:110
@@ -417,43 +422,43 @@ msgstr ""
#. module: account_payment
#: help:payment.line,info_partner:0
msgid "Address of the Ordering Customer."
-msgstr ""
+msgstr "Adresa Uplatitelja"
#. module: account_payment
#: view:account.payment.populate.statement:0
msgid "Populate Statement:"
-msgstr ""
+msgstr "Populate Statement:"
#. module: account_payment
#: view:account.move.line:0
msgid "Total credit"
-msgstr ""
+msgstr "Ukupno potražuje"
#. module: account_payment
#: help:payment.order,date_scheduled:0
msgid "Select a date if you have chosen Preferred Date to be fixed."
-msgstr ""
+msgstr "Select a date if you have chosen Preferred Date to be fixed."
#. module: account_payment
#: field:payment.order,user_id:0
msgid "User"
-msgstr ""
+msgstr "Korisnik"
#. module: account_payment
#: field:account.payment.populate.statement,lines:0
#: model:ir.actions.act_window,name:account_payment.act_account_invoice_2_payment_line
msgid "Payment Lines"
-msgstr ""
+msgstr "Stavke plaćanja"
#. module: account_payment
#: model:ir.model,name:account_payment.model_account_move_line
msgid "Journal Items"
-msgstr ""
+msgstr "Stavke glavne knjige"
#. module: account_payment
#: constraint:account.move.line:0
msgid "Company must be same for its related account and period."
-msgstr ""
+msgstr "Company must be same for its related account and period."
#. module: account_payment
#: help:payment.line,move_line_id:0
@@ -461,104 +466,106 @@ msgid ""
"This Entry Line will be referred for the information of the ordering "
"customer."
msgstr ""
+"This Entry Line will be referred for the information of the ordering "
+"customer."
#. module: account_payment
#: view:payment.order.create:0
msgid "Search"
-msgstr ""
+msgstr "Search"
#. module: account_payment
#: model:ir.actions.report.xml,name:account_payment.payment_order1
#: model:ir.model,name:account_payment.model_payment_order
msgid "Payment Order"
-msgstr ""
+msgstr "Nalog za plaćanje"
#. module: account_payment
#: field:payment.line,date:0
msgid "Payment Date"
-msgstr ""
+msgstr "Datum plaćanja"
#. module: account_payment
#: report:payment.order:0
msgid "Total:"
-msgstr ""
+msgstr "Ukupno:"
#. module: account_payment
#: field:payment.order,date_created:0
msgid "Creation date"
-msgstr ""
+msgstr "Datum kreiranja"
#. module: account_payment
#: view:account.payment.populate.statement:0
msgid "ADD"
-msgstr ""
+msgstr "ADD"
#. module: account_payment
#: view:account.bank.statement:0
msgid "Import payment lines"
-msgstr ""
+msgstr "Uvezi linije plaćanja"
#. module: account_payment
#: field:account.move.line,amount_to_pay:0
msgid "Amount to pay"
-msgstr ""
+msgstr "Iznos za platiti"
#. module: account_payment
#: field:payment.line,amount:0
msgid "Amount in Company Currency"
-msgstr ""
+msgstr "Iznos u valuti organizacije"
#. module: account_payment
#: help:payment.line,partner_id:0
msgid "The Ordering Customer"
-msgstr ""
+msgstr "The Ordering Customer"
#. module: account_payment
#: model:ir.model,name:account_payment.model_account_payment_make_payment
msgid "Account make payment"
-msgstr ""
+msgstr "Plaćanje"
#. module: account_payment
#: report:payment.order:0
msgid "Invoice Ref"
-msgstr ""
+msgstr "Poziv na br."
#. module: account_payment
#: field:payment.line,name:0
msgid "Your Reference"
-msgstr ""
+msgstr "Vaša oznaka"
#. module: account_payment
#: field:payment.order,mode:0
msgid "Payment mode"
-msgstr ""
+msgstr "Vrsta plaćanja"
#. module: account_payment
#: view:payment.order:0
msgid "Payment order"
-msgstr ""
+msgstr "Nalog za plaćanje"
#. module: account_payment
#: view:payment.line:0
#: view:payment.order:0
msgid "General Information"
-msgstr ""
+msgstr "Opći podaci"
#. module: account_payment
#: view:payment.order:0
#: selection:payment.order,state:0
msgid "Done"
-msgstr ""
+msgstr "Izvršeno"
#. module: account_payment
#: model:ir.model,name:account_payment.model_account_invoice
msgid "Invoice"
-msgstr ""
+msgstr "Račun"
#. module: account_payment
#: field:payment.line,communication:0
msgid "Communication"
-msgstr ""
+msgstr "Veza"
#. module: account_payment
#: view:account.payment.make.payment:0
@@ -566,13 +573,13 @@ msgstr ""
#: view:payment.order:0
#: view:payment.order.create:0
msgid "Cancel"
-msgstr ""
+msgstr "Odustani"
#. module: account_payment
#: view:payment.line:0
#: view:payment.order:0
msgid "Information"
-msgstr ""
+msgstr "Informacija"
#. module: account_payment
#: model:ir.actions.act_window,help:account_payment.action_payment_order_tree
@@ -582,26 +589,30 @@ msgid ""
"that should be done, keep track of all payment orders and mention the "
"invoice reference and the partner the payment should be done for."
msgstr ""
+"Nalog za plaćanje je zahtjev za plaćanjem za plaćanjem računa dobavljaču ili "
+"odobrenje kupca. Ovdje se mogu prijaviti svi nalozi za plaćanje koje je "
+"potrebno izvršiti, omogućuje također praćenje naloga za plaćanje i "
+"spomenutih računa i partnera koje je potrebno platiti."
#. module: account_payment
#: help:payment.line,amount:0
msgid "Payment amount in the company currency"
-msgstr ""
+msgstr "Iznos plaćanja u valuti organizacije"
#. module: account_payment
#: view:payment.order.create:0
msgid "Search Payment lines"
-msgstr ""
+msgstr "Traži stavke naloga za plaćanje"
#. module: account_payment
#: field:payment.line,amount_currency:0
msgid "Amount in Partner Currency"
-msgstr ""
+msgstr "Iznos u valuti partnera"
#. module: account_payment
#: field:payment.line,communication2:0
msgid "Communication 2"
-msgstr ""
+msgstr "Komunikacija 2"
#. module: account_payment
#: field:payment.line,bank_id:0
@@ -611,46 +622,46 @@ msgstr ""
#. module: account_payment
#: view:account.payment.make.payment:0
msgid "Are you sure you want to make payment?"
-msgstr ""
+msgstr "Želite dodati plaćanje?"
#. module: account_payment
#: view:payment.mode:0
#: field:payment.mode,journal:0
msgid "Journal"
-msgstr ""
+msgstr "Dnevnik"
#. module: account_payment
#: field:payment.mode,bank_id:0
msgid "Bank account"
-msgstr ""
+msgstr "Bankovni račun"
#. module: account_payment
#: view:payment.order:0
msgid "Confirm Payments"
-msgstr ""
+msgstr "Potvrdi plaćanja"
#. module: account_payment
#: field:payment.line,company_currency:0
#: report:payment.order:0
msgid "Company Currency"
-msgstr ""
+msgstr "Valuta organizacije"
#. module: account_payment
#: model:ir.ui.menu,name:account_payment.menu_main_payment
#: view:payment.line:0
#: view:payment.order:0
msgid "Payment"
-msgstr ""
+msgstr "Plaćanje"
#. module: account_payment
#: report:payment.order:0
msgid "Payment Order / Payment"
-msgstr ""
+msgstr "Nalog za plaćanje / plaćanje"
#. module: account_payment
#: field:payment.line,move_line_id:0
msgid "Entry line"
-msgstr ""
+msgstr "Redak"
#. module: account_payment
#: help:payment.line,communication:0
@@ -658,61 +669,63 @@ msgid ""
"Used as the message between ordering customer and current company. Depicts "
"'What do you want to say to the recipient about this order ?'"
msgstr ""
+"Used as the message between ordering customer and current company. Depicts "
+"'What do you want to say to the recipient about this order ?'"
#. module: account_payment
#: field:payment.mode,name:0
msgid "Name"
-msgstr ""
+msgstr "Naziv"
#. module: account_payment
#: report:payment.order:0
msgid "Bank Account"
-msgstr ""
+msgstr "Bankovni račun"
#. module: account_payment
#: view:payment.line:0
#: view:payment.order:0
msgid "Entry Information"
-msgstr ""
+msgstr "Informacije"
#. module: account_payment
#: model:ir.model,name:account_payment.model_payment_order_create
msgid "payment.order.create"
-msgstr ""
+msgstr "payment.order.create"
#. module: account_payment
#: field:payment.line,order_id:0
msgid "Order"
-msgstr ""
+msgstr "Order"
#. module: account_payment
#: field:payment.order,total:0
msgid "Total"
-msgstr ""
+msgstr "Ukupno"
#. module: account_payment
#: view:account.payment.make.payment:0
#: model:ir.actions.act_window,name:account_payment.action_account_payment_make_payment
msgid "Make Payment"
-msgstr ""
+msgstr "Plaćanje"
#. module: account_payment
#: field:payment.line,partner_id:0
#: report:payment.order:0
msgid "Partner"
-msgstr ""
+msgstr "Partner"
#. module: account_payment
#: model:ir.actions.act_window,name:account_payment.action_create_payment_order
msgid "Populate Payment"
-msgstr ""
+msgstr "Popuni plaćanje"
#. module: account_payment
#: help:payment.mode,bank_id:0
msgid "Bank Account for the Payment Mode"
-msgstr ""
+msgstr "Račun banke za vrstu plaćanja"
#. module: account_payment
#: constraint:account.move.line:0
msgid "You can not create move line on view account."
-msgstr ""
+msgstr "Ne može se knjižiti na sintetički konto."
diff --git a/addons/account_payment/security/ir.model.access.csv b/addons/account_payment/security/ir.model.access.csv
index a4b6fe0af5e..864b7656964 100644
--- a/addons/account_payment/security/ir.model.access.csv
+++ b/addons/account_payment/security/ir.model.access.csv
@@ -1,11 +1,8 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_payment_mode","payment.mode","model_payment_mode","group_account_payment",1,1,1,1
-"access_payment_order","payment.order","model_payment_order","group_account_payment",1,1,1,1
-"access_payment_line","payment.line","model_payment_line","group_account_payment",1,1,1,1
-"access_account_journal_payement","account.journal payment","account.model_account_journal","group_account_payment",1,0,0,0
-"access_account_invoice_payment","account.invoice payment","account.model_account_invoice","group_account_payment",1,0,0,0
-"access_account_move_line_payment","account.move.line payment","account.model_account_move_line","group_account_payment",1,0,0,0
-"access_payment_order_accountant","payment.order accountant","model_payment_order","account.group_account_user",1,1,1,1
-"access_payment_order_manager","payment.order manager","model_payment_order","account.group_account_manager",1,0,0,0
-"access_payment_order_invoice","payment.order invoice","model_payment_order","account.group_account_invoice",1,1,1,1
-"access_payment_line_invoice","payment.line invoice","model_payment_line","account.group_account_invoice",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_payment_mode,payment.mode,model_payment_mode,group_account_payment,1,1,1,1
+access_payment_order,payment.order,model_payment_order,group_account_payment,1,1,1,1
+access_payment_line,payment.line,model_payment_line,group_account_payment,1,1,1,1
+access_account_journal_payement,account.journal payment,account.model_account_journal,group_account_payment,1,0,0,0
+access_account_invoice_payment,account.invoice payment,account.model_account_invoice,group_account_payment,1,0,0,0
+access_account_move_line_payment,account.move.line payment,account.model_account_move_line,group_account_payment,1,0,0,0
+access_payment_order_manager,payment.order manager,model_payment_order,account.group_account_manager,1,0,0,0
diff --git a/addons/account_sequence/__openerp__.py b/addons/account_sequence/__openerp__.py
index 31d4f373e2f..7ad66a5b428 100644
--- a/addons/account_sequence/__openerp__.py
+++ b/addons/account_sequence/__openerp__.py
@@ -22,7 +22,7 @@
{
'name': 'Entries Sequence Numbering',
'version': '1.1',
- 'category': 'Hidden',
+ "category": 'Accounting & Finance',
'complexity': "easy",
'description': """
This module maintains internal sequence number for accounting entries.
diff --git a/addons/account_sequence/i18n/hr.po b/addons/account_sequence/i18n/hr.po
new file mode 100644
index 00000000000..14005991bb8
--- /dev/null
+++ b/addons/account_sequence/i18n/hr.po
@@ -0,0 +1,222 @@
+# Croatian translation for openobject-addons
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2011-01-11 11:14+0000\n"
+"PO-Revision-Date: 2011-12-08 15:33+0000\n"
+"Last-Translator: Goran Kliska \n"
+"Language-Team: Croatian \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-12-09 04:46+0000\n"
+"X-Generator: Launchpad (build 14450)\n"
+
+#. module: account_sequence
+#: view:account.sequence.installer:0
+#: model:ir.actions.act_window,name:account_sequence.action_account_seq_installer
+msgid "Account Sequence Application Configuration"
+msgstr "Postave brojčanih serija"
+
+#. module: account_sequence
+#: constraint:account.move:0
+msgid ""
+"You cannot create entries on different periods/journals in the same move"
+msgstr ""
+"Sva knjiženja na jednoj temeljnici moraju imati isti period i dnevnik."
+
+#. module: account_sequence
+#: help:account.move,internal_sequence_number:0
+#: help:account.move.line,internal_sequence_number:0
+msgid "Internal Sequence Number"
+msgstr "Interni broj"
+
+#. module: account_sequence
+#: help:account.sequence.installer,number_next:0
+msgid "Next number of this sequence"
+msgstr "Slijedeći broj ove brojčane serije"
+
+#. module: account_sequence
+#: field:account.sequence.installer,number_next:0
+msgid "Next Number"
+msgstr "Sljedeći broj"
+
+#. module: account_sequence
+#: field:account.sequence.installer,number_increment:0
+msgid "Increment Number"
+msgstr "Povećati za broj"
+
+#. module: account_sequence
+#: model:ir.module.module,description:account_sequence.module_meta_information
+msgid ""
+"\n"
+" This module maintains internal sequence number for accounting entries.\n"
+" "
+msgstr ""
+
+#. module: account_sequence
+#: model:ir.module.module,shortdesc:account_sequence.module_meta_information
+msgid "Entries Sequence Numbering"
+msgstr ""
+
+#. module: account_sequence
+#: help:account.sequence.installer,number_increment:0
+msgid "The next number of the sequence will be incremented by this number"
+msgstr "Korak uvećanja brojača. 1 će uvećavati brojač za jedan, 10 za 10."
+
+#. module: account_sequence
+#: view:account.sequence.installer:0
+msgid "Configure Your Account Sequence Application"
+msgstr "Postavite vaše brojčane serije"
+
+#. module: account_sequence
+#: field:account.sequence.installer,progress:0
+msgid "Configuration Progress"
+msgstr "Napredak konfiguracije"
+
+#. module: account_sequence
+#: help:account.sequence.installer,suffix:0
+msgid "Suffix value of the record for the sequence"
+msgstr "Sufiks (poslije brojača) za ovu brojčanu seriju"
+
+#. module: account_sequence
+#: field:account.sequence.installer,company_id:0
+msgid "Company"
+msgstr "Organizacija"
+
+#. module: account_sequence
+#: help:account.journal,internal_sequence_id:0
+msgid ""
+"This sequence will be used to maintain the internal number for the journal "
+"entries related to this journal."
+msgstr ""
+
+#. module: account_sequence
+#: field:account.sequence.installer,padding:0
+msgid "Number padding"
+msgstr "Dopunjavanje na duljinu"
+
+#. module: account_sequence
+#: model:ir.model,name:account_sequence.model_account_move_line
+msgid "Journal Items"
+msgstr "Stavke glavne knjige"
+
+#. module: account_sequence
+#: field:account.move,internal_sequence_number:0
+#: field:account.move.line,internal_sequence_number:0
+msgid "Internal Number"
+msgstr "Interni broj"
+
+#. module: account_sequence
+#: constraint:account.move.line:0
+msgid "Company must be same for its related account and period."
+msgstr ""
+
+#. module: account_sequence
+#: help:account.sequence.installer,padding:0
+msgid ""
+"OpenERP will automatically adds some '0' on the left of the 'Next Number' to "
+"get the required padding size."
+msgstr "Potreban broj vodećih \"0\" će se automatski dodati."
+
+#. module: account_sequence
+#: field:account.sequence.installer,name:0
+msgid "Name"
+msgstr "Naziv"
+
+#. module: account_sequence
+#: constraint:account.move.line:0
+msgid "You can not create move line on closed account."
+msgstr "Ne možete kreirati stavke prometa za zatvoreni račun."
+
+#. module: account_sequence
+#: constraint:account.move:0
+msgid ""
+"You cannot create more than one move per period on centralized journal"
+msgstr ""
+
+#. module: account_sequence
+#: sql_constraint:account.move.line:0
+msgid "Wrong credit or debit value in accounting entry !"
+msgstr "Pogrešna dugovna ili potražna vrijednost upisane stavke!"
+
+#. module: account_sequence
+#: field:account.journal,internal_sequence_id:0
+msgid "Internal Sequence"
+msgstr "Interna brojčana serija"
+
+#. module: account_sequence
+#: model:ir.model,name:account_sequence.model_account_sequence_installer
+msgid "account.sequence.installer"
+msgstr ""
+
+#. module: account_sequence
+#: view:account.sequence.installer:0
+msgid "Configure"
+msgstr "Postavke"
+
+#. module: account_sequence
+#: help:account.sequence.installer,prefix:0
+msgid "Prefix value of the record for the sequence"
+msgstr "Prefiks za brojčanu seriju"
+
+#. module: account_sequence
+#: model:ir.model,name:account_sequence.model_account_move
+msgid "Account Entry"
+msgstr "Temeljnica"
+
+#. module: account_sequence
+#: field:account.sequence.installer,suffix:0
+msgid "Suffix"
+msgstr "Sufiks"
+
+#. module: account_sequence
+#: field:account.sequence.installer,config_logo:0
+msgid "Image"
+msgstr "Slika"
+
+#. module: account_sequence
+#: view:account.sequence.installer:0
+msgid "title"
+msgstr "naslov"
+
+#. module: account_sequence
+#: sql_constraint:account.journal:0
+msgid "The name of the journal must be unique per company !"
+msgstr "Naziv dnevnika mora biti jedinstven za jednu organizaciju!"
+
+#. module: account_sequence
+#: field:account.sequence.installer,prefix:0
+msgid "Prefix"
+msgstr "Prefiks"
+
+#. module: account_sequence
+#: sql_constraint:account.journal:0
+msgid "The code of the journal must be unique per company !"
+msgstr "Šifra dnevnika mora biti jedinstvena (za organizaciju) !"
+
+#. module: account_sequence
+#: constraint:account.move.line:0
+msgid ""
+"You can not create move line on receivable/payable account without partner"
+msgstr ""
+
+#. module: account_sequence
+#: model:ir.model,name:account_sequence.model_account_journal
+msgid "Journal"
+msgstr "Dnevnik"
+
+#. module: account_sequence
+#: view:account.sequence.installer:0
+msgid "You can enhance the Account Sequence Application by installing ."
+msgstr ""
+
+#. module: account_sequence
+#: constraint:account.move.line:0
+msgid "You can not create move line on view account."
+msgstr "Ne može se knjižiti na sintetički konto."
diff --git a/addons/account_sequence/i18n/pt.po b/addons/account_sequence/i18n/pt.po
index 84c22715b25..e2e827d4e57 100644
--- a/addons/account_sequence/i18n/pt.po
+++ b/addons/account_sequence/i18n/pt.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
-"PO-Revision-Date: 2011-04-24 03:28+0000\n"
-"Last-Translator: FULL NAME \n"
+"PO-Revision-Date: 2011-12-09 10:09+0000\n"
+"Last-Translator: Paulino Ascenção \n"
"Language-Team: Portuguese \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 05:56+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-10 04:56+0000\n"
+"X-Generator: Launchpad (build 14450)\n"
#. module: account_sequence
#: view:account.sequence.installer:0
@@ -28,12 +28,13 @@ msgstr ""
msgid ""
"You cannot create entries on different periods/journals in the same move"
msgstr ""
+"Não pode criar registos em períodos ou diários diferentes no mesmo movimento"
#. module: account_sequence
#: help:account.move,internal_sequence_number:0
#: help:account.move.line,internal_sequence_number:0
msgid "Internal Sequence Number"
-msgstr ""
+msgstr "Número interno de sequência"
#. module: account_sequence
#: help:account.sequence.installer,number_next:0
@@ -43,12 +44,12 @@ msgstr ""
#. module: account_sequence
#: field:account.sequence.installer,number_next:0
msgid "Next Number"
-msgstr ""
+msgstr "Próximo número"
#. module: account_sequence
#: field:account.sequence.installer,number_increment:0
msgid "Increment Number"
-msgstr ""
+msgstr "Incremento"
#. module: account_sequence
#: model:ir.module.module,description:account_sequence.module_meta_information
@@ -57,6 +58,10 @@ msgid ""
" This module maintains internal sequence number for accounting entries.\n"
" "
msgstr ""
+"\n"
+" Esse módulo gere os números de sequência internos dos lançamentos "
+"contabilísticos.\n"
+" "
#. module: account_sequence
#: model:ir.module.module,shortdesc:account_sequence.module_meta_information
diff --git a/addons/account_sequence/i18n/sr@latin.po b/addons/account_sequence/i18n/sr@latin.po
new file mode 100644
index 00000000000..5bd9511ee9f
--- /dev/null
+++ b/addons/account_sequence/i18n/sr@latin.po
@@ -0,0 +1,233 @@
+# Serbian Latin translation for openobject-addons
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2011-01-11 11:14+0000\n"
+"PO-Revision-Date: 2011-11-24 21:01+0000\n"
+"Last-Translator: Milan Milosevic \n"
+"Language-Team: Serbian Latin \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-11-25 05:22+0000\n"
+"X-Generator: Launchpad (build 14376)\n"
+
+#. module: account_sequence
+#: view:account.sequence.installer:0
+#: model:ir.actions.act_window,name:account_sequence.action_account_seq_installer
+msgid "Account Sequence Application Configuration"
+msgstr "Podešavanje aplikacije nizova naloga"
+
+#. module: account_sequence
+#: constraint:account.move:0
+msgid ""
+"You cannot create entries on different periods/journals in the same move"
+msgstr ""
+"Ne možete napraviti ulaze za različite periode/dnevnike u jednom potezu"
+
+#. module: account_sequence
+#: help:account.move,internal_sequence_number:0
+#: help:account.move.line,internal_sequence_number:0
+msgid "Internal Sequence Number"
+msgstr "Broj unutrašnjeg niza"
+
+#. module: account_sequence
+#: help:account.sequence.installer,number_next:0
+msgid "Next number of this sequence"
+msgstr "Sledeći broj ovog niza"
+
+#. module: account_sequence
+#: field:account.sequence.installer,number_next:0
+msgid "Next Number"
+msgstr "Sledeći broj"
+
+#. module: account_sequence
+#: field:account.sequence.installer,number_increment:0
+msgid "Increment Number"
+msgstr "Inkrementalni broj"
+
+#. module: account_sequence
+#: model:ir.module.module,description:account_sequence.module_meta_information
+msgid ""
+"\n"
+" This module maintains internal sequence number for accounting entries.\n"
+" "
+msgstr ""
+"\n"
+" Ovaj modul održava unutrašnji niz brojeva za odgovarajuće naloge.\n"
+" "
+
+#. module: account_sequence
+#: model:ir.module.module,shortdesc:account_sequence.module_meta_information
+msgid "Entries Sequence Numbering"
+msgstr "Dodeljivanje brojeva nizovima ulaza"
+
+#. module: account_sequence
+#: help:account.sequence.installer,number_increment:0
+msgid "The next number of the sequence will be incremented by this number"
+msgstr "Sledeći broj ovog niza biće povećan ovim brojem"
+
+#. module: account_sequence
+#: view:account.sequence.installer:0
+msgid "Configure Your Account Sequence Application"
+msgstr "Podesi svoju aplikaciju za niz brojeva"
+
+#. module: account_sequence
+#: field:account.sequence.installer,progress:0
+msgid "Configuration Progress"
+msgstr "Napredak podešavanja"
+
+#. module: account_sequence
+#: help:account.sequence.installer,suffix:0
+msgid "Suffix value of the record for the sequence"
+msgstr "Sufiksalna vrednost zapisa za niz"
+
+#. module: account_sequence
+#: field:account.sequence.installer,company_id:0
+msgid "Company"
+msgstr "Preduzeće"
+
+#. module: account_sequence
+#: help:account.journal,internal_sequence_id:0
+msgid ""
+"This sequence will be used to maintain the internal number for the journal "
+"entries related to this journal."
+msgstr ""
+"Ovaj niz će biti iskorišćen za održavanje unutrašnjeg broja za ulaze "
+"dnevnika vezane za dnevnik."
+
+#. module: account_sequence
+#: field:account.sequence.installer,padding:0
+msgid "Number padding"
+msgstr "Ispunjavanje brojeva"
+
+#. module: account_sequence
+#: model:ir.model,name:account_sequence.model_account_move_line
+msgid "Journal Items"
+msgstr "Stavke dnevnika"
+
+#. module: account_sequence
+#: field:account.move,internal_sequence_number:0
+#: field:account.move.line,internal_sequence_number:0
+msgid "Internal Number"
+msgstr "Unutrašnji broj"
+
+#. module: account_sequence
+#: constraint:account.move.line:0
+msgid "Company must be same for its related account and period."
+msgstr "Preduzeće mora biti isto za sve vezane račune i periode."
+
+#. module: account_sequence
+#: help:account.sequence.installer,padding:0
+msgid ""
+"OpenERP will automatically adds some '0' on the left of the 'Next Number' to "
+"get the required padding size."
+msgstr ""
+"OpenERP će automatski dodati nekoliko '0' levo od 'Sledećeg broja' za "
+"dobijanje tražene veličine ispunjavanja."
+
+#. module: account_sequence
+#: field:account.sequence.installer,name:0
+msgid "Name"
+msgstr "Naziv"
+
+#. module: account_sequence
+#: constraint:account.move.line:0
+msgid "You can not create move line on closed account."
+msgstr "Ne možete da napravite poteznu liniju na zatvorenim računima."
+
+#. module: account_sequence
+#: constraint:account.move:0
+msgid ""
+"You cannot create more than one move per period on centralized journal"
+msgstr ""
+"Ne možete napraviti više od jednog pomeranja po periodu u centralizovanom "
+"dnevniku"
+
+#. module: account_sequence
+#: sql_constraint:account.move.line:0
+msgid "Wrong credit or debit value in accounting entry !"
+msgstr "Pogrešna vrednost kredita ili debita u ulazu računa !"
+
+#. module: account_sequence
+#: field:account.journal,internal_sequence_id:0
+msgid "Internal Sequence"
+msgstr "Unutrašnji niz"
+
+#. module: account_sequence
+#: model:ir.model,name:account_sequence.model_account_sequence_installer
+msgid "account.sequence.installer"
+msgstr "account.sequence.installer"
+
+#. module: account_sequence
+#: view:account.sequence.installer:0
+msgid "Configure"
+msgstr "Podešavanje"
+
+#. module: account_sequence
+#: help:account.sequence.installer,prefix:0
+msgid "Prefix value of the record for the sequence"
+msgstr "Prefiksalna vrednost zapisa za niz"
+
+#. module: account_sequence
+#: model:ir.model,name:account_sequence.model_account_move
+msgid "Account Entry"
+msgstr "Ulaz naloga"
+
+#. module: account_sequence
+#: field:account.sequence.installer,suffix:0
+msgid "Suffix"
+msgstr "Sufiks"
+
+#. module: account_sequence
+#: field:account.sequence.installer,config_logo:0
+msgid "Image"
+msgstr "Slika"
+
+#. module: account_sequence
+#: view:account.sequence.installer:0
+msgid "title"
+msgstr "naslov"
+
+#. module: account_sequence
+#: sql_constraint:account.journal:0
+msgid "The name of the journal must be unique per company !"
+msgstr "Naziv dnevnika mora biti jedinstven po preduzeću"
+
+#. module: account_sequence
+#: field:account.sequence.installer,prefix:0
+msgid "Prefix"
+msgstr "Prefiks"
+
+#. module: account_sequence
+#: sql_constraint:account.journal:0
+msgid "The code of the journal must be unique per company !"
+msgstr "Kod dnevnika mora biti jedinstven po preduzeću !"
+
+#. module: account_sequence
+#: constraint:account.move.line:0
+msgid ""
+"You can not create move line on receivable/payable account without partner"
+msgstr ""
+"Ne možete napraviti poteznu liniju na primaćem/platežnom računu bez partnera"
+
+#. module: account_sequence
+#: model:ir.model,name:account_sequence.model_account_journal
+msgid "Journal"
+msgstr "Dnevnik"
+
+#. module: account_sequence
+#: view:account.sequence.installer:0
+msgid "You can enhance the Account Sequence Application by installing ."
+msgstr ""
+"Ne možete poboljšati Aplikaciju za nizanje naloga instaliranjem iste."
+
+#. module: account_sequence
+#: constraint:account.move.line:0
+msgid "You can not create move line on view account."
+msgstr "Ne možete napraviti poteznu liniju na računu po viđenju"
diff --git a/addons/account_voucher/__openerp__.py b/addons/account_voucher/__openerp__.py
index 5e6e6ab0513..74e9097b57c 100644
--- a/addons/account_voucher/__openerp__.py
+++ b/addons/account_voucher/__openerp__.py
@@ -20,7 +20,7 @@
##############################################################################
{
- "name" : "Accounting Voucher Entries",
+ "name" : "eInvoicing & Payments",
"version" : "1.0",
"author" : 'OpenERP SA',
'complexity': "normal",
@@ -32,7 +32,7 @@ Account Voucher module includes all the basic requirements of Voucher Entries fo
* Voucher Receipt
* Cheque Register
""",
- "category" : "Hidden",
+ "category": 'Accounting & Finance',
"website" : "http://tinyerp.com",
"images" : ["images/customer_payment.jpeg","images/journal_voucher.jpeg","images/sales_receipt.jpeg","images/supplier_voucher.jpeg"],
"depends" : ["account"],
@@ -68,6 +68,7 @@ Account Voucher module includes all the basic requirements of Voucher Entries fo
],
'certificate': '0037580727101',
"active": False,
+ "application": True,
"installable": True,
}
diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py
index 03b3a75144c..535f76b8d64 100644
--- a/addons/account_voucher/account_voucher.py
+++ b/addons/account_voucher/account_voucher.py
@@ -90,6 +90,21 @@ class account_voucher(osv.osv):
return tax_id
return False
+ def _get_payment_rate_currency(self, cr, uid, context=None):
+ '''
+ Return the default value for field payment_rate_currency_id: the currency of the journal
+ if there is one, otherwise the currency of the user's company
+ '''
+ if context is None: context = {}
+ journal_pool = self.pool.get('account.journal')
+ journal_id = context.get('journal_id', False)
+ if journal_id:
+ journal = journal_pool.browse(cr, uid, journal_id, context=context)
+ if journal.currency:
+ return journal.currency.id
+ #no journal given in the context, use company currency as default
+ return self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.currency_id.id
+
def _get_currency(self, cr, uid, context=None):
if context is None: context = {}
journal_pool = self.pool.get('account.journal')
@@ -143,11 +158,12 @@ class account_voucher(osv.osv):
res = super(account_voucher, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar, submenu=submenu)
doc = etree.XML(res['arch'])
- nodes = doc.xpath("//field[@name='partner_id']")
+
if context.get('type', 'sale') in ('purchase', 'payment'):
+ nodes = doc.xpath("//field[@name='partner_id']")
for node in nodes:
node.set('domain', "[('supplier', '=', True)]")
- res['arch'] = etree.tostring(doc)
+ res['arch'] = etree.tostring(doc)
return res
def _compute_writeoff_amount(self, cr, uid, line_dr_ids, line_cr_ids, amount):
@@ -158,17 +174,25 @@ class account_voucher(osv.osv):
credit += l['amount']
return abs(amount - abs(credit - debit))
- def onchange_line_ids(self, cr, uid, ids, line_dr_ids, line_cr_ids, amount, context=None):
+ def onchange_line_ids(self, cr, uid, ids, line_dr_ids, line_cr_ids, amount, voucher_currency, context=None):
context = context or {}
if not line_dr_ids and not line_cr_ids:
return {'value':{}}
line_osv = self.pool.get("account.voucher.line")
line_dr_ids = resolve_o2m_operations(cr, uid, line_osv, line_dr_ids, ['amount'], context)
line_cr_ids = resolve_o2m_operations(cr, uid, line_osv, line_cr_ids, ['amount'], context)
- return {'value': {'writeoff_amount': self._compute_writeoff_amount(cr, uid, line_dr_ids, line_cr_ids, amount)}}
+
+ #loop into the lines to see if there is an amount allocated on a voucher line with a currency different than the voucher currency
+ is_multi_currency = False
+ for voucher_line in line_dr_ids+line_cr_ids:
+ if voucher_line.get('currency_id',False) != voucher_currency:
+ is_multi_currency = True
+ break
+ return {'value': {'writeoff_amount': self._compute_writeoff_amount(cr, uid, line_dr_ids, line_cr_ids, amount), 'is_multi_currency': is_multi_currency}}
def _get_writeoff_amount(self, cr, uid, ids, name, args, context=None):
if not ids: return {}
+ currency_obj = self.pool.get('res.currency')
res = {}
debit = credit = 0.0
for voucher in self.browse(cr, uid, ids, context=context):
@@ -176,15 +200,24 @@ class account_voucher(osv.osv):
debit += l.amount
for l in voucher.line_cr_ids:
credit += l.amount
- res[voucher.id] = abs(voucher.amount - abs(credit - debit))
+ currency = voucher.currency_id or voucher.company_id.currency_id
+ res[voucher.id] = currency_obj.round(cr, uid, currency, abs(voucher.amount - abs(credit - debit)))
return res
def _paid_amount_in_company_currency(self, cr, uid, ids, name, args, context=None):
if not ids: return {}
res = {}
- debit = credit = 0.0
+ voucher_rate = company_currency_rate = 1.0
for voucher in self.browse(cr, uid, ids, context=context):
- res[voucher.id] = voucher.amount / voucher.payment_rate
+ if voucher.currency_id:
+ ctx = context.copy()
+ ctx.update({'date': voucher.date})
+ voucher_rate = self.browse(cr, uid, voucher.id, context=ctx).currency_id.rate
+ if voucher.company_id.currency_id.id == voucher.payment_rate_currency_id.id:
+ company_currency_rate = voucher.payment_rate
+ else:
+ company_currency_rate = voucher.company_id.currency_id.rate
+ res[voucher.id] = voucher.amount / voucher_rate * company_currency_rate
return res
_name = 'account.voucher'
@@ -235,21 +268,22 @@ class account_voucher(osv.osv):
('pay_now','Pay Directly'),
('pay_later','Pay Later or Group Funds'),
],'Payment', select=True, readonly=True, states={'draft':[('readonly',False)]}),
- 'tax_id':fields.many2one('account.tax', 'Tax', readonly=True, states={'draft':[('readonly',False)]}),
+ 'tax_id': fields.many2one('account.tax', 'Tax', readonly=True, states={'draft':[('readonly',False)]}, domain=[('price_include','=', False)], help="Only for tax excluded from price"),
'pre_line':fields.boolean('Previous Payments ?', required=False),
'date_due': fields.date('Due Date', readonly=True, select=True, states={'draft':[('readonly',False)]}),
'payment_option':fields.selection([
('without_writeoff', 'Keep Open'),
('with_writeoff', 'Reconcile Payment Balance'),
- ], 'Payment Difference', required=True, readonly=True, states={'draft': [('readonly', False)]}),
- 'exchange_acc_id': fields.many2one('account.account', 'Exchange Diff. Account', readonly=True, states={'draft': [('readonly', False)]}),
+ ], 'Payment Difference', required=True, readonly=True, states={'draft': [('readonly', False)]}, help="This field helps you to choose what you want to do with the eventual difference between the paid amount and the sum of allocated amounts. You can either choose to keep open this difference on the partner's account, or reconcile it with the payment(s)"),
'writeoff_acc_id': fields.many2one('account.account', 'Counterpart Account', readonly=True, states={'draft': [('readonly', False)]}),
'comment': fields.char('Counterpart Comment', size=64, required=True, readonly=True, states={'draft': [('readonly', False)]}),
'analytic_id': fields.many2one('account.analytic.account','Write-Off Analytic Account', readonly=True, states={'draft': [('readonly', False)]}),
- 'writeoff_amount': fields.function(_get_writeoff_amount, string='Reconcile Amount', type='float', readonly=True),
- 'payment_rate': fields.float('Payment Rate', digits=(12,6), required=True, readonly=True, states={'draft': [('readonly', False)]},
- help='The rate between the journal currency and the company currency for this particular payment.'),
+ 'writeoff_amount': fields.function(_get_writeoff_amount, string='Difference Amount', type='float', readonly=True, help="Computed as the difference between the amount stated in the voucher and the sum of allocation on the voucher lines."),
+ 'payment_rate_currency_id': fields.many2one('res.currency', 'Payment Rate Currency', required=True, readonly=True, states={'draft':[('readonly',False)]}),
+ 'payment_rate': fields.float('Exchange Rate', digits=(12,6), required=True, readonly=True, states={'draft': [('readonly', False)]},
+ help='The specific rate that will be used, in this voucher, between the selected currency (in \'Payment Rate Currency\' field) and the voucher currency.'),
'paid_amount_in_company_currency': fields.function(_paid_amount_in_company_currency, string='Paid Amount in Company Currency', type='float', readonly=True),
+ 'is_multi_currency': fields.boolean('Multi Currency Voucher', help='Fields with internal purpose only that depicts if the voucher is a multi currency one or not'),
}
_defaults = {
'period_id': _get_period,
@@ -269,6 +303,7 @@ class account_voucher(osv.osv):
'payment_option': 'without_writeoff',
'comment': _('Write-Off'),
'payment_rate': 1.0,
+ 'payment_rate_currency_id': _get_payment_rate_currency,
}
def compute_tax(self, cr, uid, ids, context=None):
@@ -374,7 +409,7 @@ class account_voucher(osv.osv):
})
return {'value':default}
- def onchange_journal_voucher(self, cr, uid, ids, line_ids=False, tax_id=False, price=0.0, partner_id=False, journal_id=False, ttype=False, context=None):
+ def onchange_journal_voucher(self, cr, uid, ids, line_ids=False, tax_id=False, price=0.0, partner_id=False, journal_id=False, ttype=False, company_id=False, context=None):
"""price
Returns a dict that contains new values and context
@@ -413,25 +448,78 @@ class account_voucher(osv.osv):
default['value']['account_id'] = account_id
default['value']['type'] = ttype or tr_type
- vals = self.onchange_journal(cr, uid, ids, journal_id, line_ids, tax_id, partner_id, context)
+ vals = self.onchange_journal(cr, uid, ids, journal_id, line_ids, tax_id, partner_id, company_id, context)
default['value'].update(vals.get('value'))
return default
- def onchange_rate(self, cr, uid, ids, rate, amount, context=None):
- res = {'value': {'paid_amount_in_company_currency': 0.0}}
- if rate and amount:
- res['value']['paid_amount_in_company_currency'] = amount / rate
+ def onchange_rate(self, cr, uid, ids, rate, amount, currency_id, payment_rate_currency_id, company_id, context=None):
+ res = {'value': {'paid_amount_in_company_currency': amount}}
+ company_currency = self.pool.get('res.company').browse(cr, uid, company_id, context=context).currency_id
+ if rate and amount and currency_id:# and currency_id == payment_rate_currency_id:
+ voucher_rate = self.pool.get('res.currency').browse(cr, uid, currency_id, context).rate
+ if company_currency.id == payment_rate_currency_id:
+ company_rate = rate
+ else:
+ company_rate = self.pool.get('res.company').browse(cr, uid, company_id, context=context).currency_id.rate
+ res['value']['paid_amount_in_company_currency'] = amount / voucher_rate * company_rate
return res
- def onchange_amount(self, cr, uid, ids, amount, rate, partner_id, journal_id, currency_id, ttype, date, context=None):
- res = self.onchange_partner_id(cr, uid, ids, partner_id, journal_id, amount, currency_id, ttype, date, context=context)
- vals = self.onchange_rate(cr, uid, ids, rate, amount, context=context)
+ def onchange_amount(self, cr, uid, ids, amount, rate, partner_id, journal_id, currency_id, ttype, date, payment_rate_currency_id, company_id, context=None):
+ if context is None:
+ context = {}
+ res = self.recompute_voucher_lines(cr, uid, ids, partner_id, journal_id, amount, currency_id, ttype, date, context=context)
+ ctx = context.copy()
+ ctx.update({'date': date})
+ vals = self.onchange_rate(cr, uid, ids, rate, amount, currency_id, payment_rate_currency_id, company_id, context=ctx)
for key in vals.keys():
res[key].update(vals[key])
return res
- def onchange_partner_id(self, cr, uid, ids, partner_id, journal_id, price, currency_id, ttype, date, context=None):
+ def recompute_payment_rate(self, cr, uid, ids, vals, currency_id, date, ttype, journal_id, amount, context=None):
+ if context is None:
+ context = {}
+ #on change of the journal, we need to set also the default value for payment_rate and payment_rate_currency_id
+ currency_obj = self.pool.get('res.currency')
+ journal = self.pool.get('account.journal').browse(cr, uid, journal_id, context=context)
+ company_id = journal.company_id.id
+ payment_rate = 1.0
+ payment_rate_currency_id = currency_id
+ ctx = context.copy()
+ ctx.update({'date': date})
+ o2m_to_loop = False
+ if ttype == 'receipt':
+ o2m_to_loop = 'line_cr_ids'
+ elif ttype == 'payment':
+ o2m_to_loop = 'line_dr_ids'
+ if o2m_to_loop and 'value' in vals and o2m_to_loop in vals['value']:
+ for voucher_line in vals['value'][o2m_to_loop]:
+ if voucher_line['currency_id'] != currency_id:
+ # we take as default value for the payment_rate_currency_id, the currency of the first invoice that
+ # is not in the voucher currency
+ payment_rate_currency_id = voucher_line['currency_id']
+ tmp = currency_obj.browse(cr, uid, payment_rate_currency_id, context=ctx).rate
+ voucher_currency_id = currency_id or journal.company_id.currency_id.id
+ payment_rate = tmp / currency_obj.browse(cr, uid, voucher_currency_id, context=ctx).rate
+ break
+ res = self.onchange_rate(cr, uid, ids, payment_rate, amount, currency_id, payment_rate_currency_id, company_id, context=ctx)
+ for key in res.keys():
+ vals[key].update(res[key])
+ vals['value'].update({'payment_rate': payment_rate})
+ if payment_rate_currency_id:
+ vals['value'].update({'payment_rate_currency_id': payment_rate_currency_id})
+ return vals
+
+ def onchange_partner_id(self, cr, uid, ids, partner_id, journal_id, amount, currency_id, ttype, date, context=None):
+ if not journal_id:
+ return {}
+ res = self.recompute_voucher_lines(cr, uid, ids, partner_id, journal_id, amount, currency_id, ttype, date, context=context)
+ vals = self.recompute_payment_rate(cr, uid, ids, res, currency_id, date, ttype, journal_id, amount, context=context)
+ for key in vals.keys():
+ res[key].update(vals[key])
+ return res
+
+ def recompute_voucher_lines(self, cr, uid, ids, partner_id, journal_id, price, currency_id, ttype, date, context=None):
"""
Returns a dict that contains new values and context
@@ -502,9 +590,9 @@ class account_voucher(osv.osv):
#order the lines by most old first
ids.reverse()
- moves = move_line_pool.browse(cr, uid, ids, context=context)
+ account_move_lines = move_line_pool.browse(cr, uid, ids, context=context)
- for line in moves:
+ for line in account_move_lines:
if line.credit and line.reconcile_partial_id and ttype == 'receipt':
continue
if line.debit and line.reconcile_partial_id and ttype == 'payment':
@@ -518,7 +606,7 @@ class account_voucher(osv.osv):
elif currency_id == company_currency:
#otherwise treatments is the same but with other field names
if line.amount_residual == price:
- #if the amount residual is equal the amount voucher, we assign it to that voucher
+ #if the amount residual is equal the amount voucher, we assign it to that voucher
#line, whatever the other voucher lines
move_line_found = line.id
break
@@ -533,7 +621,7 @@ class account_voucher(osv.osv):
total_debit += line.debit and line.amount_currency or 0.0
#voucher line creation
- for line in moves:
+ for line in account_move_lines:
if line.credit and line.reconcile_partial_id and ttype == 'receipt':
continue
if line.debit and line.reconcile_partial_id and ttype == 'payment':
@@ -544,6 +632,7 @@ class account_voucher(osv.osv):
else:
amount_original = currency_pool.compute(cr, uid, company_currency, currency_id, line.credit or line.debit or 0.0)
amount_unreconciled = currency_pool.compute(cr, uid, company_currency, currency_id, abs(line.amount_residual))
+ line_currency_id = line.currency_id and line.currency_id.id or company_currency
rs = {
'name':line.move_id.name,
'type': line.credit and 'dr' or 'cr',
@@ -554,11 +643,11 @@ class account_voucher(osv.osv):
'date_original':line.date,
'date_due':line.date_maturity,
'amount_unreconciled': amount_unreconciled,
+ 'currency_id': line_currency_id,
}
#split voucher amount by most old first, but only for lines in the same currency
if not move_line_found:
- line_currency_id = line.currency_id and line.currency_id.id or company_currency
if currency_id == line_currency_id:
if line.credit:
amount = min(amount_unreconciled, abs(total_debit))
@@ -569,7 +658,9 @@ class account_voucher(osv.osv):
rs['amount'] = amount
total_credit -= amount
- default['value']['line_ids'].append(rs)
+ if rs['amount_unreconciled'] == rs['amount']:
+ rs['reconcile'] = True
+
if rs['type'] == 'cr':
default['value']['line_cr_ids'].append(rs)
else:
@@ -582,30 +673,51 @@ class account_voucher(osv.osv):
default['value']['writeoff_amount'] = self._compute_writeoff_amount(cr, uid, default['value']['line_dr_ids'], default['value']['line_cr_ids'], price)
return default
- def onchange_date(self, cr, uid, ids, date, currency_id, amount, context=None):
+ def onchange_payment_rate_currency(self, cr, uid, ids, currency_id, payment_rate, payment_rate_currency_id, date, amount, company_id, context=None):
+ if context is None:
+ context = {}
+ res = {'value': {}}
+ #set the default payment rate of the voucher and compute the paid amount in company currency
+ if currency_id and currency_id == payment_rate_currency_id:
+ ctx = context.copy()
+ ctx.update({'date': date})
+ vals = self.onchange_rate(cr, uid, ids, payment_rate, amount, currency_id, payment_rate_currency_id, company_id, context=ctx)
+ for key in vals.keys():
+ res[key].update(vals[key])
+ return res
+
+ def onchange_date(self, cr, uid, ids, date, currency_id, payment_rate_currency_id, amount, company_id, context=None):
"""
@param date: latest value from user input for field date
@param args: other arguments
@param context: context arguments, like lang, time zone
@return: Returns a dict which contains new values, and context
"""
+ if context is None:
+ context ={}
res = {'value': {}}
#set the period of the voucher
period_pool = self.pool.get('account.period')
- pids = period_pool.search(cr, uid, [('date_start', '<=', date), ('date_stop', '>=', date)])
+ currency_obj = self.pool.get('res.currency')
+ ctx = context.copy()
+ ctx.update({'company_id': company_id})
+ pids = period_pool.find(cr, uid, date, context=ctx)
if pids:
res['value'].update({'period_id':pids[0]})
- #set the default payment rate of the voucher and compute the paid amount in company currency
- payment_rate = 1.0
- if currency_id:
- payment_rate = self.pool.get('res.currency').browse(cr, uid, currency_id, context={'date': date}).rate
- res['value'].update({'payment_rate': payment_rate})
- vals = self.onchange_rate(cr, uid, ids, payment_rate, amount, context=context)
- for key in vals.keys():
- res[key].update(vals[key])
+ if payment_rate_currency_id:
+ ctx.update({'date': date})
+ payment_rate = 1.0
+ if payment_rate_currency_id != currency_id:
+ tmp = currency_obj.browse(cr, uid, payment_rate_currency_id, context=ctx).rate
+ voucher_currency_id = currency_id or self.pool.get('res.company').browse(cr, uid, company_id, context=ctx).currency_id.id
+ payment_rate = tmp / currency_obj.browse(cr, uid, voucher_currency_id, context=ctx).rate
+ vals = self.onchange_payment_rate_currency(cr, uid, ids, currency_id, payment_rate, payment_rate_currency_id, date, amount, company_id, context=context)
+ vals['value'].update({'payment_rate': payment_rate})
+ for key in vals.keys():
+ res[key].update(vals[key])
return res
- def onchange_journal(self, cr, uid, ids, journal_id, line_ids, tax_id, partner_id, date, amount, ttype, context=None):
+ def onchange_journal(self, cr, uid, ids, journal_id, line_ids, tax_id, partner_id, date, amount, ttype, company_id, context=None):
if not journal_id:
return False
journal_pool = self.pool.get('account.journal')
@@ -620,11 +732,6 @@ class account_voucher(osv.osv):
currency_id = False
if journal.currency:
currency_id = journal.currency.id
- payment_rate = self.pool.get('res.currency').browse(cr, uid, currency_id, context={'date': date}).rate
- vals['value'].update({'payment_rate': payment_rate})
- res = self.onchange_rate(cr, uid, ids, payment_rate, amount, context=context)
- for key in res.keys():
- vals[key].update(res[key])
vals['value'].update({'currency_id': currency_id})
res = self.onchange_partner_id(cr, uid, ids, partner_id, journal_id, amount, currency_id, ttype, date, context)
for key in res.keys():
@@ -696,8 +803,8 @@ class account_voucher(osv.osv):
Select the context to use accordingly if it needs to be multicurrency or not.
:param voucher_id: Id of the actual voucher
- :return: The returned context will be the same as given in parameter if the voucher currency is the same
- than the company currency, otherwise it's a copy of the parameter with an extra key 'date' containing
+ :return: The returned context will be the same as given in parameter if the voucher currency is the same
+ than the company currency, otherwise it's a copy of the parameter with an extra key 'date' containing
the date of the voucher.
:rtype: dict
"""
@@ -726,13 +833,13 @@ class account_voucher(osv.osv):
voucher_brw = self.pool.get('account.voucher').browse(cr,uid,voucher_id,context)
debit = credit = 0.0
# TODO: is there any other alternative then the voucher type ??
- # ANSWER: We can have payment and receipt "In Advance".
+ # ANSWER: We can have payment and receipt "In Advance".
# TODO: Make this logic available.
# -for sale, purchase we have but for the payment and receipt we do not have as based on the bank/cash journal we can not know its payment or receipt
if voucher_brw.type in ('purchase', 'payment'):
- credit = voucher_brw.amount / voucher_brw.payment_rate
+ credit = voucher_brw.paid_amount_in_company_currency
elif voucher_brw.type in ('sale', 'receipt'):
- debit = voucher_brw.amount / voucher_brw.payment_rate
+ debit = voucher_brw.paid_amount_in_company_currency
if debit < 0: credit = -debit; debit = 0.0
if credit < 0: debit = -credit; credit = 0.0
sign = debit - credit < 0 and -1 or 1
@@ -769,7 +876,7 @@ class account_voucher(osv.osv):
elif voucher_brw.journal_id.sequence_id:
name = seq_obj.next_by_id(cr, uid, voucher_brw.journal_id.sequence_id.id)
else:
- raise osv.except_osv(_('Error !'),
+ raise osv.except_osv(_('Error !'),
_('Please define a sequence on the journal !'))
if not voucher_brw.reference:
ref = name.replace('/','')
@@ -788,9 +895,10 @@ class account_voucher(osv.osv):
def _get_exchange_lines(self, cr, uid, line, move_id, amount_residual, company_currency, current_currency, context=None):
'''
- Prepare the two lines due to currency rate difference.
+ Prepare the two lines in company currency due to currency rate difference.
- :param line: browse record of the voucher.line for which we want to create currency rate difference accounting entries
+ :param line: browse record of the voucher.line for which we want to create currency rate difference accounting
+ entries
:param move_id: Account move wher the move lines will be.
:param amount_residual: Amount to be posted.
:param company_currency: id of currency of the company to which the voucher belong
@@ -798,9 +906,17 @@ class account_voucher(osv.osv):
:return: the account move line and its counterpart to create, depicted as mapping between fieldname and value
:rtype: tuple of dict
'''
- if not line.voucher_id.exchange_acc_id.id:
- raise osv.except_osv(_('Error!'), _('You must provide an account for the exchange difference.'))
-
+ if amount_residual > 0:
+ account_id = line.voucher_id.company_id.expense_currency_exchange_account_id
+ if not account_id:
+ raise osv.except_osv(_('Warning'),_("Unable to create accounting entry for currency rate difference. You have to configure the field 'Income Currency Rate' on the company! "))
+ else:
+ account_id = line.voucher_id.company_id.income_currency_exchange_account_id
+ if not account_id:
+ raise osv.except_osv(_('Warning'),_("Unable to create accounting entry for currency rate difference. You have to configure the field 'Expense Currency Rate' on the company! "))
+ # Even if the amount_currency is never filled, we need to pass the foreign currency because otherwise
+ # the receivable/payable account may have a secondary currency, which render this field mandatory
+ account_currency_id = company_currency <> current_currency and current_currency or False
move_line = {
'journal_id': line.voucher_id.journal_id.id,
'period_id': line.voucher_id.period_id.id,
@@ -808,7 +924,7 @@ class account_voucher(osv.osv):
'account_id': line.account_id.id,
'move_id': move_id,
'partner_id': line.voucher_id.partner_id.id,
- 'currency_id': company_currency <> current_currency and current_currency or False,
+ 'currency_id': account_currency_id,
'amount_currency': 0.0,
'quantity': 1,
'credit': amount_residual > 0 and amount_residual or 0.0,
@@ -819,11 +935,11 @@ class account_voucher(osv.osv):
'journal_id': line.voucher_id.journal_id.id,
'period_id': line.voucher_id.period_id.id,
'name': _('change')+': '+(line.name or '/'),
- 'account_id': line.voucher_id.exchange_acc_id.id,
+ 'account_id': account_id.id,
'move_id': move_id,
'amount_currency': 0.0,
'partner_id': line.voucher_id.partner_id.id,
- 'currency_id': company_currency <> current_currency and current_currency or False,
+ 'currency_id': account_currency_id,
'quantity': 1,
'debit': amount_residual > 0 and amount_residual or 0.0,
'credit': amount_residual < 0 and -amount_residual or 0.0,
@@ -831,10 +947,35 @@ class account_voucher(osv.osv):
}
return (move_line, move_line_counterpart)
+ def _convert_amount(self, cr, uid, amount, voucher_id, context=None):
+ '''
+ This function convert the amount given in company currency. It takes either the rate in the voucher (if the
+ payment_rate_currency_id is relevant) either the rate encoded in the system.
+
+ :param amount: float. The amount to convert
+ :param voucher: id of the voucher on which we want the conversion
+ :param context: to context to use for the conversion. It may contain the key 'date' set to the voucher date
+ field in order to select the good rate to use.
+ :return: the amount in the currency of the voucher's company
+ :rtype: float
+ '''
+ currency_obj = self.pool.get('res.currency')
+ voucher = self.browse(cr, uid, voucher_id, context=context)
+ res = amount
+ if voucher.payment_rate_currency_id.id == voucher.company_id.currency_id.id:
+ # the rate specified on the voucher is for the company currency
+ rate_between_voucher_and_base = voucher.currency_id.rate or 1.0
+ rate_between_base_and_company = voucher.payment_rate or 1.0
+ res = currency_obj.round(cr, uid, voucher.company_id.currency_id, (amount / rate_between_voucher_and_base * rate_between_base_and_company))
+ else:
+ # the rate specified on the voucher is not relevant, we use all the rates in the system
+ res = currency_obj.compute(cr, uid, voucher.currency_id.id, voucher.company_id.currency_id.id, amount, context=context)
+ return res
+
def voucher_move_line_create(self, cr, uid, voucher_id, line_total, move_id, company_currency, current_currency, context=None):
'''
Create one account move line, on the given account move, per voucher line where amount is not 0.0.
- It returns Tuple with tot_line what is total of difference between debit and credit and
+ It returns Tuple with tot_line what is total of difference between debit and credit and
a list of lists with ids to be reconciled with this format (total_deb_cred,list_of_lists).
:param voucher_id: Voucher id what we are working with
@@ -843,25 +984,30 @@ class account_voucher(osv.osv):
:param company_currency: id of currency of the company to which the voucher belong
:param current_currency: id of currency of the voucher
:return: Tuple build as (remaining amount not allocated on voucher lines, list of account_move_line created in this method)
- :rtype: tuple(int, list of int)
+ :rtype: tuple(float, list of int)
'''
+ if context is None:
+ context = {}
move_line_obj = self.pool.get('account.move.line')
currency_obj = self.pool.get('res.currency')
tot_line = line_total
rec_lst_ids = []
- voucher_brw = self.pool.get('account.voucher').browse(cr,uid,voucher_id,context)
+ voucher_brw = self.pool.get('account.voucher').browse(cr, uid, voucher_id, context)
+ ctx = context.copy()
+ ctx.update({'date': voucher_brw.date})
for line in voucher_brw.line_ids:
#create one move line per voucher line where amount is not 0.0
if not line.amount:
continue
- #we check if the voucher line is fully paid or not and create a move line to balance the payment and initial invoice if needed
+ # convert the amount set on the voucher line into the currency of the voucher's company
+ amount = self._convert_amount(cr, uid, line.untax_amount or line.amount, voucher_brw.id, context=ctx)
+ # if the amount encoded in voucher is equal to the amount unreconciled, we need to compute the
+ # currency rate difference
if line.amount == line.amount_unreconciled:
- amount = (line.untax_amount or line.amount) / voucher_brw.payment_rate
- amount_residual = line.move_line_id.amount_residual - amount #residual amount in company currency
+ currency_rate_difference = line.move_line_id.amount_residual - amount
else:
- amount = (line.untax_amount or line.amount) / voucher_brw.payment_rate
- amount_residual = 0.0
+ currency_rate_difference = 0.0
move_line = {
'journal_id': voucher_brw.journal_id.id,
'period_id': voucher_brw.period_id.id,
@@ -869,7 +1015,7 @@ class account_voucher(osv.osv):
'account_id': line.account_id.id,
'move_id': move_id,
'partner_id': voucher_brw.partner_id.id,
- 'currency_id': company_currency <> current_currency and current_currency or False,
+ 'currency_id': line.move_line_id and (company_currency <> line.move_line_id.currency_id.id and line.move_line_id.currency_id.id) or False,
'analytic_account_id': line.account_analytic_id and line.account_analytic_id.id or False,
'quantity': 1,
'credit': 0.0,
@@ -900,18 +1046,58 @@ class account_voucher(osv.osv):
if not (tax_data.base_code_id and tax_data.tax_code_id):
raise osv.except_osv(_('No Account Base Code and Account Tax Code!'),_("You have to configure account base code and account tax code on the '%s' tax!") % (tax_data.name))
- sign = (move_line['debit'] - move_line['credit']) < 0 and -1 or 1
- move_line['amount_currency'] = company_currency <> current_currency and sign * line.amount or False
+ # compute the amount in foreign currency
+ foreign_currency_diff = 0.0
+ amount_currency = False
+ if line.move_line_id:
+ voucher_currency = voucher_brw.currency_id and voucher_brw.currency_id.id or voucher_brw.journal_id.company_id.currency_id.id
+ # We want to set it on the account move line as soon as the original line had a foreign currency
+ if line.move_line_id.currency_id and line.move_line_id.currency_id.id != company_currency:
+ # we compute the amount in that foreign currency.
+ if line.move_line_id.currency_id.id == current_currency:
+ # if the voucher and the voucher line share the same currency, there is no computation to do
+ sign = (move_line['debit'] - move_line['credit']) < 0 and -1 or 1
+ amount_currency = sign * (line.amount)
+ elif line.move_line_id.currency_id.id == voucher_brw.payment_rate_currency_id.id:
+ # if the rate is specified on the voucher, we must use it
+ voucher_rate = currency_obj.browse(cr, uid, voucher_currency, context=ctx).rate
+ amount_currency = (move_line['debit'] - move_line['credit']) * voucher_brw.payment_rate * voucher_rate
+ else:
+ # otherwise we use the rates of the system (giving the voucher date in the context)
+ amount_currency = currency_obj.compute(cr, uid, company_currency, line.move_line_id.currency_id.id, move_line['debit']-move_line['credit'], context=ctx)
+ if line.amount == line.amount_unreconciled and line.move_line_id.currency_id.id == voucher_currency:
+ foreign_currency_diff = line.move_line_id.amount_residual_currency + amount_currency
+
+ move_line['amount_currency'] = amount_currency
voucher_line = move_line_obj.create(cr, uid, move_line)
rec_ids = [voucher_line, line.move_line_id.id]
- if amount_residual:
- # Change difference entry
- exch_lines = self._get_exchange_lines(cr, uid, line, move_id, amount_residual, company_currency, current_currency, context=context)
+ if not currency_obj.is_zero(cr, uid, voucher_brw.company_id.currency_id, currency_rate_difference):
+ # Change difference entry in company currency
+ exch_lines = self._get_exchange_lines(cr, uid, line, move_id, currency_rate_difference, company_currency, current_currency, context=context)
new_id = move_line_obj.create(cr, uid, exch_lines[0],context)
move_line_obj.create(cr, uid, exch_lines[1], context)
rec_ids.append(new_id)
+ if line.move_line_id and line.move_line_id.currency_id and not currency_obj.is_zero(cr, uid, line.move_line_id.currency_id, foreign_currency_diff):
+ # Change difference entry in voucher currency
+ move_line_foreign_currency = {
+ 'journal_id': line.voucher_id.journal_id.id,
+ 'period_id': line.voucher_id.period_id.id,
+ 'name': _('change')+': '+(line.name or '/'),
+ 'account_id': line.account_id.id,
+ 'move_id': move_id,
+ 'partner_id': line.voucher_id.partner_id.id,
+ 'currency_id': line.move_line_id.currency_id.id,
+ 'amount_currency': -1 * foreign_currency_diff,
+ 'quantity': 1,
+ 'credit': 0.0,
+ 'debit': 0.0,
+ 'date': line.voucher_id.date,
+ }
+ new_id = move_line_obj.create(cr, uid, move_line_foreign_currency, context=context)
+ rec_ids.append(new_id)
+
if line.move_line_id.id:
rec_lst_ids.append(rec_ids)
@@ -958,6 +1144,7 @@ class account_voucher(osv.osv):
'debit': diff < 0 and -diff or 0.0,
'amount_currency': company_currency <> current_currency and voucher_brw.writeoff_amount or False,
'currency_id': company_currency <> current_currency and current_currency or False,
+ 'analytic_account_id': voucher_brw.analytic_id and voucher_brw.analytic_id.id or False,
}
return move_line
@@ -999,28 +1186,32 @@ class account_voucher(osv.osv):
continue
company_currency = self._get_company_currency(cr, uid, voucher.id, context)
current_currency = self._get_current_currency(cr, uid, voucher.id, context)
+ # we select the context to use accordingly if it's a multicurrency case or not
context = self._sel_context(cr, uid, voucher.id, context)
- #Create the account move record.
+ # But for the operations made by _convert_amount, we always need to give the date in the context
+ ctx = context.copy()
+ ctx.update({'date': voucher.date})
+ # Create the account move record.
move_id = move_pool.create(cr, uid, self.account_move_get(cr, uid, voucher.id, context=context), context=context)
# Get the name of the account_move just created
name = move_pool.browse(cr, uid, move_id, context=context).name
- #Create the first line of the voucher
+ # Create the first line of the voucher
move_line_id = move_line_pool.create(cr, uid, self.first_move_line_get(cr,uid,voucher.id, move_id, company_currency, current_currency, context), context)
move_line_brw = move_line_pool.browse(cr, uid, move_line_id, context=context)
line_total = move_line_brw.debit - move_line_brw.credit
rec_list_ids = []
if voucher.type == 'sale':
- line_total = line_total - (voucher.tax_amount / voucher.payment_rate)
+ line_total = line_total - self._convert_amount(cr, uid, voucher.tax_amount, voucher.id, context=ctx)
elif voucher.type == 'purchase':
- line_total = line_total + (voucher.tax_amount / voucher.payment_rate)
- #create one move line per voucher line where amount is not 0.0
+ line_total = line_total + self._convert_amount(cr, uid, voucher.tax_amount, voucher.id, context=ctx)
+ # Create one move line per voucher line where amount is not 0.0
line_total, rec_list_ids = self.voucher_move_line_create(cr, uid, voucher.id, line_total, move_id, company_currency, current_currency, context)
- #create the writeoff line if needed
+ # Create the writeoff line if needed
ml_writeoff = self.writeoff_move_line_get(cr, uid, voucher.id, line_total, move_id, name, company_currency, current_currency, context)
if ml_writeoff:
ml_writeoff_id = move_line_pool.create(cr, uid, ml_writeoff, context)
- #We post the voucher.
+ # We post the voucher.
self.write(cr, uid, [voucher.id], {
'move_id': move_id,
'state': 'posted',
@@ -1028,10 +1219,10 @@ class account_voucher(osv.osv):
})
if voucher.journal_id.entry_posted:
move_pool.post(cr, uid, [move_id], context={})
- #We automatically reconcile the account move lines.
+ # We automatically reconcile the account move lines.
for rec_ids in rec_list_ids:
if len(rec_ids) >= 2:
- move_line_pool.reconcile_partial(cr, uid, rec_ids, writeoff_acc_id=voucher.exchange_acc_id.id, writeoff_period_id=voucher.period_id.id, writeoff_journal_id=voucher.journal_id.id)
+ move_line_pool.reconcile_partial(cr, uid, rec_ids, writeoff_acc_id=voucher.writeoff_acc_id.id, writeoff_period_id=voucher.period_id.id, writeoff_journal_id=voucher.journal_id.id)
return True
def copy(self, cr, uid, id, default={}, context=None):
@@ -1083,13 +1274,28 @@ class account_voucher_line(osv.osv):
rs_data[line.id] = res
return rs_data
+ def _currency_id(self, cr, uid, ids, name, args, context=None):
+ '''
+ This function returns the currency id of a voucher line. It's either the currency of the
+ associated move line (if any) or the currency of the voucher or the company currency.
+ '''
+ res = {}
+ for line in self.browse(cr, uid, ids, context=context):
+ move_line = line.move_line_id
+ if move_line:
+ res[line.id] = move_line.currency_id and move_line.currency_id.id or move_line.company_id.currency_id.id
+ else:
+ res[line.id] = line.voucher_id.currency_id and line.voucher_id.currency_id.id or line.voucher_id.company_id.currency_id.id
+ return res
+
_columns = {
'voucher_id':fields.many2one('account.voucher', 'Voucher', required=1, ondelete='cascade'),
'name':fields.char('Description', size=256),
'account_id':fields.many2one('account.account','Account', required=True),
'partner_id':fields.related('voucher_id', 'partner_id', type='many2one', relation='res.partner', string='Partner'),
'untax_amount':fields.float('Untax Amount'),
- 'amount':fields.float('Amount', digits_compute=dp.get_precision('Account')),
+ 'amount':fields.float('Allocation', digits_compute=dp.get_precision('Account')),
+ 'reconcile': fields.boolean('Full Reconcile'),
'type':fields.selection([('dr','Debit'),('cr','Credit')], 'Dr/Cr'),
'account_analytic_id': fields.many2one('account.analytic.account', 'Analytic Account'),
'move_line_id': fields.many2one('account.move.line', 'Journal Item'),
@@ -1098,11 +1304,24 @@ class account_voucher_line(osv.osv):
'amount_original': fields.function(_compute_balance, multi='dc', type='float', string='Original Amount', store=True),
'amount_unreconciled': fields.function(_compute_balance, multi='dc', type='float', string='Open Balance', store=True),
'company_id': fields.related('voucher_id','company_id', relation='res.company', type='many2one', string='Company', store=True, readonly=True),
+ 'currency_id': fields.function(_currency_id, string='Currency', type='many2one', relation='res.currency', readonly=True),
}
_defaults = {
- 'name': ''
+ 'name': '',
}
+ def onchange_reconcile(self, cr, uid, ids, reconcile, amount, amount_unreconciled, context=None):
+ vals = { 'amount': 0.0}
+ if reconcile:
+ vals = { 'amount': amount_unreconciled}
+ return {'value': vals}
+
+ def onchange_amount(self, cr, uid, ids, amount, amount_unreconciled, context=None):
+ vals = {}
+ if amount:
+ vals['reconcile'] = (amount == amount_unreconciled)
+ return {'value': vals}
+
def onchange_move_line_id(self, cr, user, ids, move_line_id, context=None):
"""
Returns a dict that contains new values and context
@@ -1121,10 +1340,10 @@ class account_voucher_line(osv.osv):
ttype = 'dr'
else:
ttype = 'cr'
- account_id = move_line.account_id.id
res.update({
- 'account_id':account_id,
- 'type': ttype
+ 'account_id': move_line.account_id.id,
+ 'type': ttype,
+ 'currency_id': move_line.currency_id and move_line.currency_id.id or move_line.company_id.currency_id.id,
})
return {
'value':res,
@@ -1261,6 +1480,7 @@ def resolve_o2m_operations(cr, uid, target_osv, operations, fields, context):
result = operation[2]
elif operation[0] == 1:
result = target_osv.read(cr, uid, operation[1], fields, context=context)
+ if not result: result = {}
result.update(operation[2])
elif operation[0] == 4:
result = target_osv.read(cr, uid, operation[1], fields, context=context)
@@ -1268,4 +1488,19 @@ def resolve_o2m_operations(cr, uid, target_osv, operations, fields, context):
results.append(result)
return results
+class res_company(osv.osv):
+ _inherit = "res.company"
+ _columns = {
+ 'income_currency_exchange_account_id': fields.many2one(
+ 'account.account',
+ string="Income Currency Rate",
+ domain="[('type', '=', 'other')]",),
+ 'expense_currency_exchange_account_id': fields.many2one(
+ 'account.account',
+ string="Expense Currency Rate",
+ domain="[('type', '=', 'other')]",),
+ }
+
+res_company()
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_voucher/account_voucher_report.xml b/addons/account_voucher/account_voucher_report.xml
index 8af204efbbe..97de2b89f3a 100644
--- a/addons/account_voucher/account_voucher_report.xml
+++ b/addons/account_voucher/account_voucher_report.xml
@@ -11,13 +11,14 @@
header = "False"
menu="True"/> -->
-
+
diff --git a/addons/account_voucher/account_voucher_view.xml b/addons/account_voucher/account_voucher_view.xml
index 4e218e04714..cbe35b5fc5f 100644
--- a/addons/account_voucher/account_voucher_view.xml
+++ b/addons/account_voucher/account_voucher_view.xml
@@ -259,5 +259,19 @@
+
+
+ res.company.form.inherit
+
+ res.company
+ form
+
+
+
+
+
+
+
+
diff --git a/addons/account_voucher/i18n/hr.po b/addons/account_voucher/i18n/hr.po
index 3b1a5db220d..5904967f99a 100644
--- a/addons/account_voucher/i18n/hr.po
+++ b/addons/account_voucher/i18n/hr.po
@@ -7,19 +7,19 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
-"PO-Revision-Date: 2011-03-03 13:20+0000\n"
+"PO-Revision-Date: 2011-12-08 17:08+0000\n"
"Last-Translator: Goran Kliska \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 05:33+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-09 04:46+0000\n"
+"X-Generator: Launchpad (build 14450)\n"
#. module: account_voucher
#: view:account.voucher.unreconcile:0
msgid "Unreconciliation transactions"
-msgstr ""
+msgstr "Transakcije poništavanja zatvaranja"
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:247
@@ -30,12 +30,12 @@ msgstr "Otpis"
#. module: account_voucher
#: view:account.voucher:0
msgid "Payment Ref"
-msgstr ""
+msgstr "Oznaka plaćanja"
#. module: account_voucher
#: view:account.voucher:0
msgid "Open Customer Journal Entries"
-msgstr ""
+msgstr "Otvori temeljnice kupaca"
#. module: account_voucher
#: view:sale.receipt.report:0
@@ -85,7 +85,7 @@ msgstr ""
#: view:account.voucher:0
#: model:ir.actions.act_window,name:account_voucher.act_pay_bills
msgid "Bill Payment"
-msgstr ""
+msgstr "Plaćanje računa"
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:746
@@ -105,7 +105,7 @@ msgstr "Uvoz stavki"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_voucher_unreconcile
msgid "Account voucher unreconcile"
-msgstr "Poništi zatvaranja plaćanja"
+msgstr "Poništi zatvaranja"
#. module: account_voucher
#: selection:sale.receipt.report,month:0
@@ -120,11 +120,14 @@ msgid ""
"automatically and you can record the customer payment related to this sales "
"receipt."
msgstr ""
+"Kada prodate proizvod kupci dužni ste mu izdati račun. Potvrdom računa "
+"kreiraju se knjigovodstvene stavke dugovanja kupca i tada možete "
+"evidentirati plaćanje kupca vezano na ovu prodaju."
#. module: account_voucher
#: view:account.voucher:0
msgid "Pay Bill"
-msgstr ""
+msgstr "Plati račun"
#. module: account_voucher
#: field:account.voucher,company_id:0
@@ -132,66 +135,66 @@ msgstr ""
#: view:sale.receipt.report:0
#: field:sale.receipt.report,company_id:0
msgid "Company"
-msgstr "Tvrtka"
+msgstr "Organizacija"
#. module: account_voucher
#: view:account.voucher:0
msgid "Set to Draft"
-msgstr ""
+msgstr "Postavi na nacrt"
#. module: account_voucher
#: help:account.voucher,reference:0
msgid "Transaction reference number."
-msgstr ""
+msgstr "Transaction reference number."
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_view_account_voucher_unreconcile
msgid "Unreconcile entries"
-msgstr ""
+msgstr "Otvori stavke"
#. module: account_voucher
#: view:account.voucher:0
msgid "Voucher Statistics"
-msgstr ""
+msgstr "Statistike vaučera"
#. module: account_voucher
#: view:account.voucher:0
msgid "Validate"
-msgstr ""
+msgstr "Potvrdi"
#. module: account_voucher
#: view:sale.receipt.report:0
#: field:sale.receipt.report,day:0
msgid "Day"
-msgstr ""
+msgstr "Dan"
#. module: account_voucher
#: view:account.voucher:0
msgid "Search Vouchers"
-msgstr ""
+msgstr "Traži vaučere"
#. module: account_voucher
#: selection:account.voucher,type:0
#: selection:sale.receipt.report,type:0
msgid "Purchase"
-msgstr ""
+msgstr "Nabava"
#. module: account_voucher
#: field:account.voucher,account_id:0
#: field:account.voucher.line,account_id:0
#: field:sale.receipt.report,account_id:0
msgid "Account"
-msgstr ""
+msgstr "Konto"
#. module: account_voucher
#: field:account.voucher,line_dr_ids:0
msgid "Debits"
-msgstr ""
+msgstr "Dugovanja"
#. module: account_voucher
#: view:account.statement.from.invoice.lines:0
msgid "Ok"
-msgstr ""
+msgstr "U redu"
#. module: account_voucher
#: model:ir.actions.act_window,help:account_voucher.action_sale_receipt_report_all
@@ -200,6 +203,8 @@ msgid ""
"customer as well as payment delays. The tool search can also be used to "
"personalise your Invoices reports and so, match this analysis to your needs."
msgstr ""
+"Pregled fakturiranih iznosa i kašnjenja plaćanja. Za prilagodbu izvještaja "
+"vašim potrebama koristite funkcionalnosti traženja i grupiranja."
#. module: account_voucher
#: field:account.voucher,date_due:0
@@ -207,12 +212,12 @@ msgstr ""
#: view:sale.receipt.report:0
#: field:sale.receipt.report,date_due:0
msgid "Due Date"
-msgstr ""
+msgstr "Datum dospijeća"
#. module: account_voucher
#: field:account.voucher,narration:0
msgid "Notes"
-msgstr ""
+msgstr "Bilješke"
#. module: account_voucher
#: model:ir.actions.act_window,help:account_voucher.action_vendor_receipt
@@ -223,22 +228,25 @@ msgid ""
"to you automatically the reconciliation of this payment with the open "
"invoices or sales receipts."
msgstr ""
+"Uplate kupaca evidentiraju primljena plaćanja kupaca. Upišite kupca, način "
+"plaćanja=dnevnik i iznos plaćanja. OpenERP će predložiti zatvaranje plaćanja "
+"s otvorenim računom(ima) ili drugim otvorenim stavkama tog partnera."
#. module: account_voucher
#: selection:account.voucher,type:0
#: selection:sale.receipt.report,type:0
msgid "Sale"
-msgstr ""
+msgstr "Prodaja"
#. module: account_voucher
#: field:account.voucher.line,move_line_id:0
msgid "Journal Item"
-msgstr ""
+msgstr "Stavka dnevnika"
#. module: account_voucher
#: field:account.voucher,reference:0
msgid "Ref #"
-msgstr ""
+msgstr "Ref #"
#. module: account_voucher
#: field:account.voucher.line,amount:0
@@ -249,28 +257,28 @@ msgstr ""
#. module: account_voucher
#: view:account.voucher:0
msgid "Payment Options"
-msgstr ""
+msgstr "Opcije plaćanja"
#. module: account_voucher
#: view:account.voucher:0
msgid "Other Information"
-msgstr ""
+msgstr "Ostali podaci"
#. module: account_voucher
#: selection:account.voucher,state:0
#: selection:sale.receipt.report,state:0
msgid "Cancelled"
-msgstr ""
+msgstr "Otkazani"
#. module: account_voucher
#: field:account.statement.from.invoice,date:0
msgid "Date payment"
-msgstr ""
+msgstr "Datum plaćanja"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_bank_statement_line
msgid "Bank Statement Line"
-msgstr ""
+msgstr "Redak bankovnog izvoda"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_purchase_receipt
@@ -282,12 +290,12 @@ msgstr ""
#: view:account.voucher:0
#: view:account.voucher.unreconcile:0
msgid "Unreconcile"
-msgstr ""
+msgstr "Otvori stavke"
#. module: account_voucher
#: field:account.voucher,tax_id:0
msgid "Tax"
-msgstr ""
+msgstr "Porez"
#. module: account_voucher
#: report:voucher.print:0
@@ -298,32 +306,32 @@ msgstr ""
#: view:sale.receipt.report:0
#: field:sale.receipt.report,nbr:0
msgid "# of Voucher Lines"
-msgstr ""
+msgstr "# linija vaučera"
#. module: account_voucher
#: field:account.voucher.line,account_analytic_id:0
msgid "Analytic Account"
-msgstr ""
+msgstr "Konto analitike"
#. module: account_voucher
#: view:account.voucher:0
msgid "Payment Information"
-msgstr ""
+msgstr "Informacije uplate"
#. module: account_voucher
#: view:account.statement.from.invoice:0
msgid "Go"
-msgstr ""
+msgstr "Go"
#. module: account_voucher
#: view:account.voucher:0
msgid "Paid Amount"
-msgstr ""
+msgstr "Plaćeni iznos"
#. module: account_voucher
#: view:account.bank.statement:0
msgid "Import Invoices"
-msgstr ""
+msgstr "Uvoz računa"
#. module: account_voucher
#: report:voucher.print:0
@@ -334,7 +342,7 @@ msgstr ""
#: selection:account.voucher,type:0
#: selection:sale.receipt.report,type:0
msgid "Receipt"
-msgstr ""
+msgstr "Receipt"
#. module: account_voucher
#: report:voucher.print:0
@@ -349,7 +357,7 @@ msgstr ""
#. module: account_voucher
#: view:account.voucher:0
msgid "Sales Lines"
-msgstr ""
+msgstr "Stavke prodaje"
#. module: account_voucher
#: report:voucher.print:0
@@ -360,14 +368,14 @@ msgstr ""
#: view:account.voucher:0
#: field:account.voucher,period_id:0
msgid "Period"
-msgstr ""
+msgstr "Period"
#. module: account_voucher
#: view:account.voucher:0
#: field:account.voucher,state:0
#: view:sale.receipt.report:0
msgid "State"
-msgstr ""
+msgstr "Stanje"
#. module: account_voucher
#: model:ir.module.module,shortdesc:account_voucher.module_meta_information
@@ -378,18 +386,18 @@ msgstr ""
#: view:sale.receipt.report:0
#: field:sale.receipt.report,type:0
msgid "Type"
-msgstr ""
+msgstr "Vrsta"
#. module: account_voucher
#: field:account.voucher.unreconcile,remove:0
msgid "Want to remove accounting entries too ?"
-msgstr ""
+msgstr "Želite li ukloniti i knjigovodstvene unose?"
#. module: account_voucher
#: view:account.voucher:0
#: model:ir.actions.act_window,name:account_voucher.act_journal_voucher_open
msgid "Voucher Entries"
-msgstr ""
+msgstr "Stavke vaučera"
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:645
@@ -400,24 +408,24 @@ msgstr ""
#. module: account_voucher
#: view:account.voucher:0
msgid "Supplier Voucher"
-msgstr ""
+msgstr "Vaučer dobavljača"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_review_voucher_list
msgid "Vouchers Entries"
-msgstr ""
+msgstr "Stavke vaučera"
#. module: account_voucher
#: field:account.voucher,name:0
msgid "Memo"
-msgstr ""
+msgstr "Memo"
#. module: account_voucher
#: view:account.voucher:0
#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt
msgid "Sales Receipt"
-msgstr ""
+msgstr "Izdani vaučeri"
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:596
@@ -428,30 +436,30 @@ msgstr ""
#. module: account_voucher
#: view:account.voucher:0
msgid "Bill Information"
-msgstr ""
+msgstr "Bill Information"
#. module: account_voucher
#: selection:sale.receipt.report,month:0
msgid "July"
-msgstr ""
+msgstr "Srpanj"
#. module: account_voucher
#: view:account.voucher.unreconcile:0
msgid "Unreconciliation"
-msgstr ""
+msgstr "Poništavanje zatvaranja IOS-a"
#. module: account_voucher
#: view:sale.receipt.report:0
#: field:sale.receipt.report,due_delay:0
msgid "Avg. Due Delay"
-msgstr ""
+msgstr "Pros. dugovanje"
#. module: account_voucher
#: view:account.invoice:0
#: code:addons/account_voucher/invoice.py:32
#, python-format
msgid "Pay Invoice"
-msgstr ""
+msgstr "Plaćanje"
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:746
@@ -462,12 +470,12 @@ msgstr ""
#. module: account_voucher
#: field:account.voucher,tax_amount:0
msgid "Tax Amount"
-msgstr ""
+msgstr "Iznos poreza"
#. module: account_voucher
#: view:account.voucher:0
msgid "Voucher Entry"
-msgstr ""
+msgstr "Stavka vaučera"
#. module: account_voucher
#: view:account.voucher:0
@@ -476,82 +484,82 @@ msgstr ""
#: view:sale.receipt.report:0
#: field:sale.receipt.report,partner_id:0
msgid "Partner"
-msgstr ""
+msgstr "Partner"
#. module: account_voucher
#: field:account.voucher,payment_option:0
msgid "Payment Difference"
-msgstr ""
+msgstr "Razlika plaćanja"
#. module: account_voucher
#: constraint:account.bank.statement.line:0
msgid ""
"The amount of the voucher must be the same amount as the one on the "
"statement line"
-msgstr ""
+msgstr "Iznos vaučera mora biti jednak iznosu stavke izvoda banke/blagajne."
#. module: account_voucher
#: view:account.voucher:0
msgid "To Review"
-msgstr ""
+msgstr "Za provjeru"
#. module: account_voucher
#: view:account.voucher:0
msgid "Expense Lines"
-msgstr ""
+msgstr "Redak troška"
#. module: account_voucher
#: field:account.statement.from.invoice,line_ids:0
#: field:account.statement.from.invoice.lines,line_ids:0
msgid "Invoices"
-msgstr ""
+msgstr "Računi"
#. module: account_voucher
#: selection:sale.receipt.report,month:0
msgid "December"
-msgstr ""
+msgstr "Prosinac"
#. module: account_voucher
#: field:account.voucher,line_ids:0
#: view:account.voucher.line:0
#: model:ir.model,name:account_voucher.model_account_voucher_line
msgid "Voucher Lines"
-msgstr ""
+msgstr "Linije vaučera"
#. module: account_voucher
#: view:sale.receipt.report:0
#: field:sale.receipt.report,month:0
msgid "Month"
-msgstr ""
+msgstr "Mjesec"
#. module: account_voucher
#: field:account.voucher,currency_id:0
#: field:sale.receipt.report,currency_id:0
msgid "Currency"
-msgstr ""
+msgstr "Valuta"
#. module: account_voucher
#: view:account.statement.from.invoice.lines:0
msgid "Payable and Receivables"
-msgstr ""
+msgstr "Payable and Receivables"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
#: selection:sale.receipt.report,pay_now:0
msgid "Pay Later or Group Funds"
-msgstr ""
+msgstr "Pay Later or Group Funds"
#. module: account_voucher
#: view:sale.receipt.report:0
#: field:sale.receipt.report,user_id:0
msgid "Salesman"
-msgstr ""
+msgstr "Prodavač"
#. module: account_voucher
#: view:sale.receipt.report:0
#: field:sale.receipt.report,delay_to_pay:0
msgid "Avg. Delay To Pay"
-msgstr ""
+msgstr "Pros. kašnjenje"
#. module: account_voucher
#: view:account.voucher:0
@@ -560,7 +568,7 @@ msgstr ""
#: selection:sale.receipt.report,state:0
#: report:voucher.print:0
msgid "Draft"
-msgstr ""
+msgstr "Nacrt"
#. module: account_voucher
#: field:account.voucher,writeoff_acc_id:0
@@ -576,7 +584,7 @@ msgstr ""
#: view:sale.receipt.report:0
#: field:sale.receipt.report,price_total_tax:0
msgid "Total With Tax"
-msgstr ""
+msgstr "Ukupno s porezom"
#. module: account_voucher
#: report:voucher.print:0
@@ -586,7 +594,7 @@ msgstr ""
#. module: account_voucher
#: selection:sale.receipt.report,month:0
msgid "August"
-msgstr ""
+msgstr "Kolovoz"
#. module: account_voucher
#: model:ir.actions.act_window,help:account_voucher.action_vendor_payment
@@ -596,16 +604,19 @@ msgid ""
"the payment, OpenERP will propose to reconcile your payment with the open "
"supplier invoices or bills."
msgstr ""
+"Nalozi za plaćanje omogućuju upravljanje plaćanjima obveza. Nakon odabira "
+"dobavljača, načina plaćanja i iznosa OpenERP će ponuditi zatvaranje "
+"otvorenih računa dobavljača, odnosno svih otvorenih stavki (IOS-a) partnera."
#. module: account_voucher
#: view:account.voucher:0
msgid "Total Amount"
-msgstr ""
+msgstr "Ukupni iznos"
#. module: account_voucher
#: selection:sale.receipt.report,month:0
msgid "June"
-msgstr ""
+msgstr "Lipanj"
#. module: account_voucher
#: field:account.voucher.line,type:0
@@ -620,30 +631,30 @@ msgstr ""
#. module: account_voucher
#: view:account.voucher:0
msgid "Payment Terms"
-msgstr ""
+msgstr "Uvjeti plaćanja"
#. module: account_voucher
#: view:account.voucher:0
msgid "Are you sure to unreconcile this record ?"
-msgstr ""
+msgstr "Sigurno želite otvoriti ovaj zapis?"
#. module: account_voucher
#: field:account.voucher,date:0
#: field:account.voucher.line,date_original:0
#: field:sale.receipt.report,date:0
msgid "Date"
-msgstr ""
+msgstr "Datum"
#. module: account_voucher
#: selection:sale.receipt.report,month:0
msgid "November"
-msgstr ""
+msgstr "Studeni"
#. module: account_voucher
#: view:account.voucher:0
#: view:sale.receipt.report:0
msgid "Extended Filters..."
-msgstr ""
+msgstr "Prošireni filtri..."
#. module: account_voucher
#: report:voucher.print:0
@@ -653,49 +664,49 @@ msgstr ""
#. module: account_voucher
#: field:account.bank.statement.line,amount_reconciled:0
msgid "Amount reconciled"
-msgstr ""
+msgstr "Zatvoreni iznos"
#. module: account_voucher
#: field:account.voucher,analytic_id:0
msgid "Write-Off Analytic Account"
-msgstr ""
+msgstr "Write-Off Analytic Account"
#. module: account_voucher
#: selection:account.voucher,pay_now:0
#: selection:sale.receipt.report,pay_now:0
msgid "Pay Directly"
-msgstr ""
+msgstr "Pay Directly"
#. module: account_voucher
#: selection:sale.receipt.report,month:0
msgid "October"
-msgstr ""
+msgstr "Listopad"
#. module: account_voucher
#: field:account.voucher,pre_line:0
msgid "Previous Payments ?"
-msgstr ""
+msgstr "Predhodna plaćanja ?"
#. module: account_voucher
#: selection:sale.receipt.report,month:0
msgid "January"
-msgstr ""
+msgstr "Siječanj"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_voucher_list
#: model:ir.ui.menu,name:account_voucher.menu_encode_entries_by_voucher
msgid "Journal Vouchers"
-msgstr ""
+msgstr "Dnevnik vaučera"
#. module: account_voucher
#: view:account.voucher:0
msgid "Compute Tax"
-msgstr ""
+msgstr "Izračunaj porez"
#. module: account_voucher
#: selection:account.voucher.line,type:0
msgid "Credit"
-msgstr ""
+msgstr "Potražuje"
#. module: account_voucher
#: code:addons/account_voucher/account_voucher.py:645
@@ -706,7 +717,7 @@ msgstr ""
#. module: account_voucher
#: view:account.voucher:0
msgid "Open Supplier Journal Entries"
-msgstr ""
+msgstr "Otvori temeljnice dobavljača"
#. module: account_voucher
#: report:voucher.print:0
@@ -717,28 +728,28 @@ msgstr ""
#: model:ir.actions.act_window,name:account_voucher.action_vendor_payment
#: model:ir.ui.menu,name:account_voucher.menu_action_vendor_payment
msgid "Supplier Payment"
-msgstr ""
+msgstr "Plaćanja dobavljačima"
#. module: account_voucher
#: view:account.voucher:0
msgid "Post"
-msgstr ""
+msgstr "Post"
#. module: account_voucher
#: view:account.voucher:0
msgid "Invoices and outstanding transactions"
-msgstr ""
+msgstr "Računi i otvorene stavke"
#. module: account_voucher
#: view:sale.receipt.report:0
#: field:sale.receipt.report,price_total:0
msgid "Total Without Tax"
-msgstr ""
+msgstr "Uk. prije poreza"
#. module: account_voucher
#: view:account.voucher:0
msgid "Bill Date"
-msgstr ""
+msgstr "Datum računa"
#. module: account_voucher
#: help:account.voucher,state:0
@@ -752,55 +763,61 @@ msgid ""
"\n"
"* The 'Cancelled' state is used when user cancel voucher."
msgstr ""
+" * Vaučer je u stanju \"Nacrt\" za vrijeme upisa podataka i stavki vaučera "
+"dok se ne potvrdi ili otkaže. \n"
+" * U 'Pro-forma' stanju vaučeru još uvijek nije dodijeljen broj. \n"
+" * Stanje 'Knjižen' označava vaučer koji je dobio broj i za koji je izrađena "
+"temeljnica \n"
+" * U stanju 'Otkazan' su nevažeći vaučeri"
#. module: account_voucher
#: view:account.voucher:0
#: model:ir.model,name:account_voucher.model_account_voucher
msgid "Accounting Voucher"
-msgstr ""
+msgstr "Knjigovodstveni vaučer"
#. module: account_voucher
#: field:account.voucher,number:0
msgid "Number"
-msgstr ""
+msgstr "Broj"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_bank_statement
msgid "Bank Statement"
-msgstr ""
+msgstr "Izvod banke"
#. module: account_voucher
#: selection:sale.receipt.report,month:0
msgid "September"
-msgstr ""
+msgstr "Rujan"
#. module: account_voucher
#: view:account.voucher:0
msgid "Sales Information"
-msgstr ""
+msgstr "Informacije o prodaji"
#. module: account_voucher
#: model:ir.actions.act_window,name:account_voucher.action_sale_receipt_report_all
#: model:ir.ui.menu,name:account_voucher.menu_action_sale_receipt_report_all
#: view:sale.receipt.report:0
msgid "Sales Receipt Analysis"
-msgstr ""
+msgstr "Analiza izdanih vaučera"
#. module: account_voucher
#: field:account.voucher.line,voucher_id:0
#: model:res.request.link,name:account_voucher.req_link_voucher
msgid "Voucher"
-msgstr ""
+msgstr "Vaučer"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_invoice
msgid "Invoice"
-msgstr ""
+msgstr "Račun"
#. module: account_voucher
#: view:account.voucher:0
msgid "Voucher Items"
-msgstr ""
+msgstr "Sadržaj vaučera"
#. module: account_voucher
#: view:account.statement.from.invoice:0
@@ -808,20 +825,20 @@ msgstr ""
#: view:account.voucher:0
#: view:account.voucher.unreconcile:0
msgid "Cancel"
-msgstr ""
+msgstr "Odustani"
#. module: account_voucher
#: selection:account.voucher,state:0
#: view:sale.receipt.report:0
#: selection:sale.receipt.report,state:0
msgid "Pro-forma"
-msgstr ""
+msgstr "Pro-forma"
#. module: account_voucher
#: view:account.voucher:0
#: field:account.voucher,move_ids:0
msgid "Journal Items"
-msgstr ""
+msgstr "Stavke glavne knjige"
#. module: account_voucher
#: view:account.voucher:0
@@ -829,28 +846,28 @@ msgstr ""
#: model:ir.actions.act_window,name:account_voucher.action_vendor_receipt
#: model:ir.ui.menu,name:account_voucher.menu_action_vendor_receipt
msgid "Customer Payment"
-msgstr ""
+msgstr "Plaćanja kupaca"
#. module: account_voucher
#: view:account.statement.from.invoice:0
#: model:ir.actions.act_window,name:account_voucher.action_view_account_statement_from_invoice
msgid "Import Invoices in Statement"
-msgstr ""
+msgstr "Uvezi račune na nalog"
#. module: account_voucher
#: view:account.voucher:0
msgid "Pay"
-msgstr ""
+msgstr "Pay"
#. module: account_voucher
#: selection:account.voucher.line,type:0
msgid "Debit"
-msgstr ""
+msgstr "Duguje"
#. module: account_voucher
#: view:account.voucher:0
msgid "Are you sure to confirm this record ?"
-msgstr ""
+msgstr "Are you sure to confirm this record ?"
#. module: account_voucher
#: selection:account.voucher,payment_option:0
@@ -860,12 +877,12 @@ msgstr ""
#. module: account_voucher
#: view:account.voucher:0
msgid "Payment Method"
-msgstr ""
+msgstr "Način plaćanja"
#. module: account_voucher
#: field:account.voucher.line,name:0
msgid "Description"
-msgstr ""
+msgstr "Opis"
#. module: account_voucher
#: report:voucher.print:0
@@ -875,7 +892,7 @@ msgstr ""
#. module: account_voucher
#: selection:sale.receipt.report,month:0
msgid "May"
-msgstr ""
+msgstr "Svibanj"
#. module: account_voucher
#: field:account.statement.from.invoice,journal_ids:0
@@ -884,23 +901,23 @@ msgstr ""
#: view:sale.receipt.report:0
#: field:sale.receipt.report,journal_id:0
msgid "Journal"
-msgstr ""
+msgstr "Dnevnik"
#. module: account_voucher
#: view:account.voucher:0
msgid "Internal Notes"
-msgstr ""
+msgstr "Interne bilješke"
#. module: account_voucher
#: view:account.voucher:0
#: field:account.voucher,line_cr_ids:0
msgid "Credits"
-msgstr ""
+msgstr "Potraživanja"
#. module: account_voucher
#: field:account.voucher.line,amount_original:0
msgid "Original Amount"
-msgstr ""
+msgstr "Originalni iznos"
#. module: account_voucher
#: report:voucher.print:0
@@ -916,7 +933,7 @@ msgstr ""
#: field:sale.receipt.report,pay_now:0
#: selection:sale.receipt.report,type:0
msgid "Payment"
-msgstr ""
+msgstr "Plaćanje"
#. module: account_voucher
#: view:account.voucher:0
@@ -925,22 +942,22 @@ msgstr ""
#: selection:sale.receipt.report,state:0
#: report:voucher.print:0
msgid "Posted"
-msgstr ""
+msgstr "Proknjiženo"
#. module: account_voucher
#: view:account.voucher:0
msgid "Customer"
-msgstr ""
+msgstr "Kupac"
#. module: account_voucher
#: selection:sale.receipt.report,month:0
msgid "February"
-msgstr ""
+msgstr "Veljača"
#. module: account_voucher
#: view:account.voucher:0
msgid "Supplier Invoices and Outstanding transactions"
-msgstr ""
+msgstr "Ulazni računi i otvorene stavke"
#. module: account_voucher
#: field:account.voucher,comment:0
@@ -950,38 +967,38 @@ msgstr ""
#. module: account_voucher
#: selection:sale.receipt.report,month:0
msgid "April"
-msgstr ""
+msgstr "Travanj"
#. module: account_voucher
#: field:account.voucher,type:0
msgid "Default Type"
-msgstr ""
+msgstr "Uobičajeni tip"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_account_statement_from_invoice
#: model:ir.model,name:account_voucher.model_account_statement_from_invoice_lines
msgid "Entries by Statement from Invoices"
-msgstr ""
+msgstr "Stavke po izvodu iz računa"
#. module: account_voucher
#: field:account.voucher,move_id:0
msgid "Account Entry"
-msgstr ""
+msgstr "Temeljnica"
#. module: account_voucher
#: field:sale.receipt.report,state:0
msgid "Voucher State"
-msgstr ""
+msgstr "Stanje vaučera"
#. module: account_voucher
#: help:account.voucher,date:0
msgid "Effective date for accounting entries"
-msgstr ""
+msgstr "Effective date for accounting entries"
#. module: account_voucher
#: selection:account.voucher,payment_option:0
msgid "Keep Open"
-msgstr ""
+msgstr "Ostavi otvoreno"
#. module: account_voucher
#: view:account.voucher.unreconcile:0
@@ -989,31 +1006,36 @@ msgid ""
"If you unreconciliate transactions, you must also verify all the actions "
"that are linked to those transactions because they will not be disable"
msgstr ""
+"Ako želite poništiti zatvaranja transakcija, morate također provjeriti sve "
+"radnje koje su povezane sa tim transakcijama jer neće biti onemogućene"
#. module: account_voucher
#: field:account.voucher.line,untax_amount:0
msgid "Untax Amount"
-msgstr ""
+msgstr "Osnovica"
#. module: account_voucher
#: model:ir.model,name:account_voucher.model_sale_receipt_report
msgid "Sales Receipt Statistics"
-msgstr ""
+msgstr "Statistika izdanih vaučera"
#. module: account_voucher
#: view:sale.receipt.report:0
#: field:sale.receipt.report,year:0
msgid "Year"
-msgstr ""
+msgstr "Godina"
#. module: account_voucher
#: view:account.voucher:0
#: field:account.voucher.line,amount_unreconciled:0
msgid "Open Balance"
-msgstr ""
+msgstr "Otvoreni saldo"
#. module: account_voucher
#: view:account.voucher:0
#: field:account.voucher,amount:0
msgid "Total"
-msgstr ""
+msgstr "Ukupno"
+
+#~ msgid "Dr/Cr"
+#~ msgstr "Dr/Cr"
diff --git a/addons/account_voucher/security/ir.model.access.csv b/addons/account_voucher/security/ir.model.access.csv
index a8d9c7f580b..eac7fc13818 100644
--- a/addons/account_voucher/security/ir.model.access.csv
+++ b/addons/account_voucher/security/ir.model.access.csv
@@ -1,9 +1,7 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_account_voucher_user","account.voucher","model_account_voucher","account.group_account_user",1,1,1,1
-"access_account_voucher_line_accountant","account.voucher.line.accountant","model_account_voucher_line","account.group_account_user",1,1,1,1
-"access_account_voucher_manager","account.voucher","model_account_voucher","account.group_account_manager",1,0,0,0
-"access_account_voucher_line_manager","account.voucher.line","model_account_voucher_line","account.group_account_manager",1,0,0,0
-"access_account_voucher_invoice","account.voucher invoice","model_account_voucher","account.group_account_invoice",1,1,1,1
-"access_account_voucher_line_invoice","account.voucher.line invoice","model_account_voucher_line","account.group_account_invoice",1,1,1,1
-"access_sale_receipt_report_manager","account.sale.receipt.report","model_sale_receipt_report","account.group_account_manager",1,1,1,1
-"access_sale_receipt_report_user","account.sale.receipt.report","model_sale_receipt_report","account.group_account_user",1,0,0,0
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_account_voucher_manager,account.voucher,model_account_voucher,account.group_account_manager,1,0,0,0
+access_account_voucher_line_manager,account.voucher.line,model_account_voucher_line,account.group_account_manager,1,0,0,0
+access_account_voucher_invoice,account.voucher invoice,model_account_voucher,account.group_account_invoice,1,1,1,1
+access_account_voucher_line_invoice,account.voucher.line invoice,model_account_voucher_line,account.group_account_invoice,1,1,1,1
+access_sale_receipt_report_manager,account.sale.receipt.report,model_sale_receipt_report,account.group_account_manager,1,1,1,1
+access_sale_receipt_report_user,account.sale.receipt.report,model_sale_receipt_report,account.group_account_user,1,0,0,0
diff --git a/addons/account_voucher/static/src/img/icon.png b/addons/account_voucher/static/src/img/icon.png
new file mode 100644
index 00000000000..afad1331e2e
Binary files /dev/null and b/addons/account_voucher/static/src/img/icon.png differ
diff --git a/addons/account_voucher/test/account_voucher.yml b/addons/account_voucher/test/account_voucher.yml
index ce34733dda7..7e5482aa931 100644
--- a/addons/account_voucher/test/account_voucher.yml
+++ b/addons/account_voucher/test/account_voucher.yml
@@ -5,7 +5,6 @@
account_id: account.cash
amount: 1000.0
company_id: base.main_company
- currency_id: base.EUR
journal_id: account.bank_journal
name: Voucher for Axelor
narration: Basic Pc
@@ -48,7 +47,7 @@
-
Now I create a Vendor Voucher
-
- !record {model: account.voucher, id: account_voucher_voucheraxelor0}:
+ !record {model: account.voucher, id: account_voucher_voucheraxelor0, view: False}:
account_id: account.cash
amount: 1000.0
company_id: base.main_company
diff --git a/addons/account_voucher/test/account_voucher_report.yml b/addons/account_voucher/test/account_voucher_report.yml
index 39e9c2144a2..85432f747aa 100644
--- a/addons/account_voucher/test/account_voucher_report.yml
+++ b/addons/account_voucher/test/account_voucher_report.yml
@@ -1,10 +1,9 @@
-
Demo for Account Voucher
-
- !record {model: account.voucher, id: account_voucher_voucheraxelor0}:
+ !record {model: account.voucher, id: account_voucher_voucheraxelor0again}:
account_id: account.cash
company_id: base.main_company
- currency_id: base.EUR
journal_id: account.bank_journal
name: Voucher Axelor
narration: Basic PC
@@ -20,6 +19,6 @@
-
!python {model: account.voucher}: |
import netsvc, tools, os
- (data, format) = netsvc.LocalService('report.voucher.cash_receipt.drcr').create(cr, uid, [ref("account_voucher_voucheraxelor0")], {}, {})
+ (data, format) = netsvc.LocalService('report.voucher.cash_receipt.drcr').create(cr, uid, [ref("account_voucher_voucheraxelor0again")], {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'account_voucher-report.'+format), 'wb+').write(data)
diff --git a/addons/account_voucher/test/case1_usd_usd.yml b/addons/account_voucher/test/case1_usd_usd.yml
index 6685e64f298..3432d3cf27b 100644
--- a/addons/account_voucher/test/case1_usd_usd.yml
+++ b/addons/account_voucher/test/case1_usd_usd.yml
@@ -1,6 +1,15 @@
-
In order to check the Account_voucher module with multi-currency in OpenERP,
I create 2 Invoices in USD and make 2 Payments in USD based on the currency rating on that particular date
+-
+ I set the income and expense currency accounts on the main company
+-
+ !python {model: res.company}: |
+ from datetime import datetime
+ vals = {
+ 'income_currency_exchange_account_id': ref('account.o_expense'),
+ 'expense_currency_exchange_account_id': ref('account.o_expense')}
+ self.write(cr, uid, ref('base.main_company'), vals)
-
I create currency USD in OpenERP for January of 1.333333 Rate
-
@@ -34,6 +43,16 @@
name: !eval "'%s-04-01' %(datetime.now().year)"
rate: 1.052632
+-
+ I create a cash account with currency USD
+-
+ !record {model: account.account, id: account_cash_usd_id}:
+ currency_id: base.USD
+ name: "cash account in usd"
+ code: "Xcash usd"
+ type: 'liquidity'
+ user_type: "account.account_type_cash_moves"
+
-
I create a bank journal with USD as currency
-
@@ -43,24 +62,12 @@
type: bank
analytic_journal_id: account.sit
sequence_id: account.sequence_bank_journal
- default_debit_account_id: account.cash
- default_credit_account_id: account.cash
+ default_debit_account_id: account_cash_usd_id
+ default_credit_account_id: account_cash_usd_id
currency: base.USD
company_id: base.main_company
view_id: account.account_journal_bank_view
--
- I create new partner Mark Strauss.
--
- !record {model: res.partner, id: res_partner_strauss0}:
- address:
- - city: paris
- country_id: base.fr
- name: Mark Strauss
- street: 1 rue Rockfeller
- type: invoice
- zip: '75016'
- name: Mr. Mark Strauss
-
I create the first invoice on 1st January for 200 USD
-
@@ -80,7 +87,7 @@
product_id: product.product_product_pc1
uos_id: product.product_uom_unit
journal_id: account.sales_journal
- partner_id: res_partner_strauss0
+ partner_id: base.res_partner_seagate
reference_type: none
-
I Validate invoice by clicking on Validate button
@@ -115,7 +122,7 @@
product_id: product.product_product_pc1
uos_id: product.product_uom_unit
journal_id: account.sales_journal
- partner_id: res_partner_strauss0
+ partner_id: base.res_partner_seagate
reference_type: none
-
I Validate invoice by clicking on Validate button
@@ -133,45 +140,47 @@
assert (move_line.debit - move_line.credit == 80), "Invoice move is not correct for debtors account"
-
- I create the first voucher of payment
-
+ I set the context that will be used for the encoding of all the vouchers of this file
+-
+ !context
+ 'type': 'receipt'
+-
+ I create the first voucher of payment with values 240 USD, journal USD,
+-
+ !record {model: account.voucher, id: account_voucher_1_case1, view: view_vendor_receipt_form}:
+ account_id: account.cash
+ amount: 240.0
+ company_id: base.main_company
+ journal_id: bank_journal_USD
+ name: 'First payment: Case 1 USD/USD'
+ partner_id: base.res_partner_seagate
+ period_id: account.period_3
+ date: !eval time.strftime("%Y-03-01")
+ payment_option: 'with_writeoff'
+ writeoff_acc_id: account.a_expense
+ comment: 'Write Off'
+
+-
+ I fill amounts 180 for the invoice of 200$ and 70 for the invoice of 100$>
-
!python {model: account.voucher}: |
import netsvc, time
vals = {}
- res = self.onchange_partner_id(cr, uid, [], ref("res_partner_strauss0"), ref('bank_journal_USD'), 240.00, 2, ttype='receipt', date=False)
- vals = {
- 'account_id': ref('account.cash'),
- 'amount': 240.00,
- 'company_id': ref('base.main_company'),
- 'currency_id': ref('base.USD'),
- 'journal_id': ref('bank_journal_USD'),
- 'partner_id': ref('res_partner_strauss0'),
- 'period_id': ref('account.period_3'),
- 'type': 'receipt',
- 'date': time.strftime("%Y-%m-%d"),
- 'payment_option': 'with_writeoff',
- 'writeoff_acc_id': ref('account.a_expense'),
- 'comment': 'Write Off',
- 'name': 'First payment',
- }
- vals.update(self.onchange_date(cr, uid, [], time.strftime('%Y-03-01'), ref('base.USD'), 240)['value'])
- if not res['value']['line_cr_ids']:
- res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}]
- for item in res['value']['line_cr_ids']:
- if item['amount_unreconciled'] == 200.00:
- item['amount'] = 180.00
+ voucher_id = self.browse(cr, uid, ref('account_voucher_1_case1'))
+ data = []
+ for item in voucher_id.line_cr_ids:
+ if item.amount_unreconciled == 200.00:
+ data += [(item.id, 180.0)]
else:
- item['amount'] = 70.00
- vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']]
- id = self.create(cr, uid, vals)
- voucher_id = self.browse(cr, uid, id)
+ data += [(item.id, 70.0)]
+ for line_id, amount in data:
+ self.pool.get('account.voucher.line').write(cr, uid, [line_id], {'amount': amount})
assert (voucher_id.state=='draft'), "Voucher is not in draft state"
-
I check that writeoff amount computed is 10.0
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_strauss0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 1 USD/USD'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
assert (voucher_id.writeoff_amount == 10.0), "Writeoff amount is not 10.0"
-
@@ -179,14 +188,14 @@
-
!python {model: account.voucher}: |
import netsvc
- voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_strauss0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 1 USD/USD'), ('partner_id', '=', ref('base.res_partner_seagate'))])
wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr)
-
I check that the move of my first voucher is valid
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_strauss0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 1 USD/USD'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
move_line_obj = self.pool.get('account.move.line')
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
@@ -200,7 +209,7 @@
I check that my write-off is correct. 9 debit and 10 amount_currency
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_strauss0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 1 USD/USD'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
move_line_obj = self.pool.get('account.move.line')
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
@@ -230,47 +239,41 @@
move_line = move_line_obj.browse(cr, uid, move_lines[0])
assert (move_line.amount_residual_currency == 30.0) , "Residual amount is not correct for first Invoice"
-
- I create the second voucher of payment
-
-
+ I create the second voucher of payment with values 45 USD, journal USD,
+-
+ !record {model: account.voucher, id: account_voucher_2_case1}:
+ account_id: account.cash
+ amount: 45.0
+ company_id: base.main_company
+ journal_id: bank_journal_USD
+ name: 'Second payment: Case 1'
+ partner_id: base.res_partner_seagate
+ period_id: account.period_3
+ date: !eval time.strftime("%Y-04-01")
+ payment_option: 'with_writeoff'
+ writeoff_acc_id: account.a_expense
+ comment: 'Write Off'
+-
+ I fill amounts 20 for the invoice of 200$ and 30 for the invoice of 100$
-
!python {model: account.voucher}: |
import netsvc, time
vals = {}
- res = self.onchange_partner_id(cr, uid, [], ref("res_partner_strauss0"), ref('bank_journal_USD'), 45.00, 2, ttype='receipt', date=False)
- vals = {
- 'account_id': ref('account.cash'),
- 'amount': 45.00,
- 'exchange_acc_id': ref('account.o_expense'),
- 'company_id': ref('base.main_company'),
- 'currency_id': ref('base.USD'),
- 'journal_id': ref('bank_journal_USD'),
- 'partner_id': ref('res_partner_strauss0'),
- 'period_id': ref('account.period_3'),
- 'type': 'receipt',
- 'date': time.strftime("%Y-%m-%d"),
- 'payment_option': 'with_writeoff',
- 'writeoff_acc_id': ref('account.a_expense'),
- 'comment': 'Write Off',
- 'name': 'Second payment',
- }
- vals.update(self.onchange_date(cr, uid, [], time.strftime('%Y-04-01'), ref('base.USD'), 45.0)['value'])
- if not res['value']['line_cr_ids']:
- res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}]
- for item in res['value']['line_cr_ids']:
- if item['amount_unreconciled'] == 20.00:
- item['amount'] = 20.00
+ voucher_id = self.browse(cr, uid, ref('account_voucher_2_case1'))
+ data = []
+ for item in voucher_id.line_cr_ids:
+ if item.amount_unreconciled == 20.00:
+ data += [(item.id, 20.0)]
else:
- item['amount'] = 30.00
- vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']]
- id = self.create(cr, uid, vals)
- voucher_id = self.browse(cr, uid, id)
+ data += [(item.id, 30.0)]
+ for line_id, amount in data:
+ self.pool.get('account.voucher.line').write(cr, uid, [line_id], {'amount': amount})
assert (voucher_id.state=='draft'), "Voucher is not in draft state"
-
I check that writeoff amount computed is 5.0
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_strauss0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 1'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
assert (voucher_id.writeoff_amount == 5.0), "Writeoff amount is not 5.0"
-
@@ -278,14 +281,14 @@
-
!python {model: account.voucher}: |
import netsvc
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_strauss0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 1'), ('partner_id', '=', ref('base.res_partner_seagate'))])
wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr)
-
I check that the move of my second voucher is valid
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_strauss0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 1'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
move_line_obj = self.pool.get('account.move.line')
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
@@ -303,7 +306,7 @@
I check that my writeoff is correct. 4.75 debit and 5 amount_currency
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_strauss0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 1'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
move_line_obj = self.pool.get('account.move.line')
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
diff --git a/addons/account_voucher/test/case2_suppl_usd_eur.yml b/addons/account_voucher/test/case2_suppl_usd_eur.yml
index 424783d8a7b..0ad523b8004 100644
--- a/addons/account_voucher/test/case2_suppl_usd_eur.yml
+++ b/addons/account_voucher/test/case2_suppl_usd_eur.yml
@@ -1,6 +1,15 @@
-
In order to check the Account_voucher module with multi-currency in OpenERP,
I create 2 Invoices in USD and make 2 Payments one in USD and another in EUR, based on the currency rating on that particular date
+-
+ I set the income and expense currency accounts on the main company
+-
+ !python {model: res.company}: |
+ from datetime import datetime
+ vals = {
+ 'income_currency_exchange_account_id': ref('account.o_expense'),
+ 'expense_currency_exchange_account_id': ref('account.o_expense')}
+ self.write(cr, uid, ref('base.main_company'), vals)
-
I create a bank journal with EUR as currency
-
@@ -29,18 +38,6 @@
currency: base.USD
company_id: base.main_company
view_id: account.account_journal_bank_view
--
- I create a new partner Robert Clements
--
- !record {model: res.partner, id: res_partner_clements0}:
- address:
- - city: marseille
- country_id: base.fr
- name: Robert
- street: 1 rue Rockfeller
- type: invoice
- zip: '13016'
- name: Mr.Robert Clements
-
I create the first invoice on 1st January for 200 USD
-
@@ -61,7 +58,7 @@
product_id: product.product_product_pc1
uos_id: product.product_uom_unit
journal_id: account.sales_journal
- partner_id: res_partner_clements0
+ partner_id: base.res_partner_seagate
reference_type: none
check_total : 200
-
@@ -98,7 +95,7 @@
product_id: product.product_product_pc1
uos_id: product.product_uom_unit
journal_id: account.sales_journal
- partner_id: res_partner_clements0
+ partner_id: base.res_partner_seagate
reference_type: none
check_total : 100.0
-
@@ -116,51 +113,54 @@
move_line = move_line_obj.browse(cr, uid, move_lines[0])
assert (move_line.debit - move_line.credit == -80), "Invoice move is incorrect for debtors account"
-
- I create the first voucher of payment
-
+ I set the context that will be used for the encoding of all the vouchers of this file
+-
+ !context
+ 'type': 'payment'
+-
+ I create the first voucher of payment with values 240 EUR, journal EUR
+-
+ !record {model: account.voucher, id: account_voucher_1_case2_suppl, view: view_vendor_payment_form}:
+ account_id: account.cash
+ amount: 240.0
+ company_id: base.main_company
+ journal_id: bank_journal_EUR
+ name: 'First payment: Case 2 SUPPL USD/EUR',
+ partner_id: base.res_partner_seagate
+ period_id: account.period_3
+ date: !eval time.strftime("%Y-03-01")
+ payment_option: 'with_writeoff'
+ writeoff_acc_id: account.a_expense
+ comment: 'Write Off'
+
+-
+ I fill amounts 180 for the invoice of 200$ and 70 for the invoice of 100$
-
!python {model: account.voucher}: |
import netsvc, time
vals = {}
- res = self.onchange_partner_id(cr, uid, [], ref("res_partner_clements0"), ref('bank_journal_EUR'), 240.0, 2, ttype='payment', date=False)
- vals = {
- 'account_id': ref('account.cash'),
- 'amount': 240.0,
- 'company_id': ref('base.main_company'),
- 'currency_id': ref('base.EUR'),
- 'journal_id': ref('bank_journal_EUR'),
- 'partner_id': ref('res_partner_clements0'),
- 'period_id': ref('account.period_3'),
- 'type': 'payment',
- 'date': time.strftime("%Y-03-01"),
- 'payment_option': 'with_writeoff',
- 'writeoff_acc_id': ref('account.a_expense'),
- 'comment': 'Write Off',
- 'name': 'First payment',
- }
- if not res['value']['line_dr_ids']:
- res['value']['line_dr_ids'] = [{'type': 'dr', 'account_id': ref('account.a_pay'),}]
- for item in res['value']['line_dr_ids']:
- if item['amount_unreconciled'] == 200.00:
- item['amount'] = 180.00
+ voucher_id = self.browse(cr, uid, ref('account_voucher_1_case2_suppl'))
+ data = []
+ for item in voucher_id.line_cr_ids:
+ if item.amount_unreconciled == 200.00:
+ data += [(item.id, 180.0)]
else:
- item['amount'] = 70.00
- vals['line_dr_ids'] = [(0,0,i) for i in res['value']['line_dr_ids']]
- id = self.create(cr, uid, vals)
- voucher_id = self.browse(cr, uid, id)
+ data += [(item.id, 70.0)]
+ for line_id, amount in data:
+ self.pool.get('account.voucher.line').write(cr, uid, [line_id], {'amount': amount})
assert (voucher_id.state=='draft'), "Voucher is not in draft state"
-
I check that writeoff amount computed is -15.0
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_clements0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 2 SUPPL USD/EUR'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
assert (voucher_id.writeoff_amount == -15.0), "Writeoff amount is not -15.0"
-
I check that currency rate difference is 34.0
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_clements0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 2 SUPPL USD/EUR'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
assert (voucher_id.currency_rate_difference == 34.0), "Currency rate difference is not 34.0"
-
@@ -168,14 +168,14 @@
-
!python {model: account.voucher}: |
import netsvc
- voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_clements0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 2 SUPPL USD/EUR'), ('partner_id', '=', ref('base.res_partner_seagate'))])
wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr)
-
I check that the move of my voucher is valid
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_clements0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 2 SUPPL USD/EUR'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
move_line_obj = self.pool.get('account.move.line')
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
@@ -191,7 +191,7 @@
I check that my writeoff is correct. -15 in credit with no amount_currency
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_clements0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 2 SUPPL USD/EUR'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
move_line_obj = self.pool.get('account.move.line')
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
@@ -213,7 +213,7 @@
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)])
move_line = move_line_obj.browse(cr, uid, move_lines[0])
assert (move_line.amount_residual_currency == 20.0 and move_line.amount_residual == 15) , "Residual amount is not correct for first Invoice"
--
+-
I check the residual amuont of Invoice2, should be 30 in residual currency and 24 in amount_residual
-
!python {model: account.invoice}: |
@@ -222,53 +222,50 @@
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)])
move_line = move_line_obj.browse(cr, uid, move_lines[0])
assert (move_line.amount_residual_currency == 30 and move_line.amount_residual == 24) , "Residual amount is not correct for second Invoice"
--
- I create the second voucher of payment
-
+-
+ I create the second voucher of payment with values 45 USD, journal USD,
+-
+ !record {model: account.voucher, id: account_voucher_2_case2_suppl, view: view_vendor_payment_form}:
+ account_id: account.cash
+ amount: 45.0
+ company_id: base.main_company
+ journal_id: bank_journal_USD
+ partner_id: base.res_partner_seagate
+ period_id: account.period_3
+ date: !eval time.strftime("%Y-04-01")
+ payment_option: 'with_writeoff'
+ writeoff_acc_id: account.a_expense
+ comment: 'Write Off'
+ name: 'Second payment: Case 2 SUPPL USD/EUR'
+
+-
+ I fill amounts 20 for the invoice of 200$ and 30 for the invoice of 100$>
-
!python {model: account.voucher}: |
import netsvc, time
vals = {}
- res = self.onchange_partner_id(cr, uid, [], ref("res_partner_clements0"), ref('bank_journal_EUR'), 45.0, 2, ttype='payment', date=False)
- vals = {
- 'account_id': ref('account.cash'),
- 'amount': 45.0,
- 'company_id': ref('base.main_company'),
- 'currency_id': ref('base.USD'),
- 'journal_id': ref('bank_journal_USD'),
- 'partner_id': ref('res_partner_clements0'),
- 'period_id': ref('account.period_3'),
- 'type': 'payment',
- 'date': time.strftime("%Y-%m-%d"),
- 'payment_option': 'with_writeoff',
- 'writeoff_acc_id': ref('account.a_expense'),
- 'comment': 'Write Off',
- 'name': 'Second payment',
- }
- vals.update(self.onchange_date(cr, uid, [], time.strftime('%Y-04-01'), ref('base.USD'), 45.0)['value'])
- if not res['value']['line_dr_ids']:
- res['value']['line_dr_ids'] = [{'type': 'dr', 'account_id': ref('account.a_pay'),}]
- for item in res['value']['line_dr_ids']:
- if item['amount_unreconciled'] == 20.00:
- item['amount'] = 20.00
+ voucher_id = self.browse(cr, uid, ref('account_voucher_2_case2_suppl'))
+ data = []
+ for item in voucher_id.line_cr_ids:
+ if item.amount_unreconciled == 20.00:
+ data += [(item.id, 20.0)]
else:
- item['amount'] = 30.00
- vals['line_dr_ids'] = [(0,0,i) for i in res['value']['line_dr_ids']]
- id = self.create(cr, uid, vals)
- voucher_id = self.browse(cr, uid, id)
+ data += [(item.id, 30.0)]
+ for line_id, amount in data:
+ self.pool.get('account.voucher.line').write(cr, uid, [line_id], {'amount': amount})
assert (voucher_id.state=='draft'), "Voucher is not in draft state"
-
I check that writeoff amount computed is -5.0
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_clements0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 2 SUPPL USD/EUR'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
assert (voucher_id.writeoff_amount == 5.0), "Writeoff amount is not 5.0"
-
I check that currency rate difference is 8.50
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_clements0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 2 SUPPL USD/EUR'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
assert (voucher_id.currency_rate_difference == 8.50), "Currency rate difference is not 8.50"
-
@@ -276,14 +273,14 @@
-
!python {model: account.voucher}: |
import netsvc
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_clements0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 2 SUPPL USD/EUR'), ('partner_id', '=', ref('base.res_partner_seagate'))])
wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr)
-
I check that my voucher state is posted
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_clements0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 2 SUPPL USD/EUR'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
assert voucher_id.state == 'posted', "Voucher state is not posted"
-
@@ -296,7 +293,7 @@
I check that my writeoff is correct. 4.75 in credit and 5 in amount_currency
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_clements0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 2 SUPPL USD/EUR'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
move_line_obj = self.pool.get('account.move.line')
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
diff --git a/addons/account_voucher/test/case2_usd_eur_debtor_in_eur.yml b/addons/account_voucher/test/case2_usd_eur_debtor_in_eur.yml
index e1cc87f427e..ac77aef622d 100644
--- a/addons/account_voucher/test/case2_usd_eur_debtor_in_eur.yml
+++ b/addons/account_voucher/test/case2_usd_eur_debtor_in_eur.yml
@@ -1,6 +1,15 @@
-
In order to check the Account_voucher module with multi-currency in OpenERP,
I create 2 Invoices in USD and make 2 Payments one in USD and another in EUR, based on the currency rating on that particular date
+-
+ I set the income and expense currency accounts on the main company
+-
+ !python {model: res.company}: |
+ from datetime import datetime
+ vals = {
+ 'income_currency_exchange_account_id': ref('account.o_expense'),
+ 'expense_currency_exchange_account_id': ref('account.o_expense')}
+ self.write(cr, uid, ref('base.main_company'), vals)
-
I modify the debtor account in order to make sure there is no currency_id linked
-
@@ -49,7 +58,6 @@
sequence_id: account.sequence_bank_journal
default_debit_account_id: account.cash
default_credit_account_id: account.cash
- currency: base.EUR
company_id: base.main_company
view_id: account.account_journal_bank_view
-
@@ -61,23 +69,11 @@
type: bank
analytic_journal_id: account.sit
sequence_id: account.sequence_bank_journal
- default_debit_account_id: account.cash
- default_credit_account_id: account.cash
+ default_debit_account_id: account_cash_usd_id
+ default_credit_account_id: account_cash_usd_id
currency: base.USD
company_id: base.main_company
view_id: account.account_journal_bank_view
--
- I create a new partner Michael Geller
--
- !record {model: res.partner, id: res_partner_michael0}:
- address:
- - city: paris
- country_id: base.fr
- name: Michael
- street: 1 rue Rockfeller
- type: invoice
- zip: '75016'
- name: Mr.Michael Geller
-
I create the first invoice on 1st January for 200 USD
-
@@ -97,7 +93,7 @@
product_id: product.product_product_pc1
uos_id: product.product_uom_unit
journal_id: account.sales_journal
- partner_id: res_partner_michael0
+ partner_id: base.res_partner_seagate
reference_type: none
-
I Validate invoice by clicking on Validate button
@@ -132,7 +128,7 @@
product_id: product.product_product_pc1
uos_id: product.product_uom_unit
journal_id: account.sales_journal
- partner_id: res_partner_michael0
+ partner_id: base.res_partner_seagate
reference_type: none
-
I Validate invoice by clicking on Validate button
@@ -149,69 +145,60 @@
move_line = move_line_obj.browse(cr, uid, move_lines[0])
assert (move_line.debit - move_line.credit == 80), "Invoice move is incorrect for debtors account"
-
- I create the first voucher of payment
-
+ I set the context that will be used for the encoding of all the vouchers of this file
+-
+ !context
+ 'type': 'receipt'
+-
+ I create the first voucher of payment with values 200 EUR, journal EUR
+-
+ !record {model: account.voucher, id: account_voucher_1_case2a, view: view_vendor_receipt_form}:
+ account_id: account.cash
+ amount: 200.0
+ company_id: base.main_company
+ journal_id: bank_journal_EUR
+ partner_id: base.res_partner_seagate
+ period_id: account.period_3
+ date: !eval time.strftime("%Y-03-01")
+ payment_option: 'with_writeoff'
+ writeoff_acc_id: account.a_expense
+ comment: 'Write Off'
+ name: 'First payment: Case 2 USD/EUR DR EUR'
+
+-
+ I fill amounts 130 for the invoice of 200$ and 70 for the invoice of 100$
-
!python {model: account.voucher}: |
import netsvc, time
vals = {}
- res = self.onchange_partner_id(cr, uid, [], ref("res_partner_michael0"), ref('bank_journal_EUR'), 240.0, False, ttype='receipt', date=False)
- vals = {
- 'account_id': ref('account.cash'),
- 'amount': 200.0,
- 'company_id': ref('base.main_company'),
- 'currency_id': False,
- 'journal_id': ref('bank_journal_EUR'),
- 'partner_id': ref('res_partner_michael0'),
- 'period_id': ref('account.period_3'),
- 'type': 'receipt',
- 'date': time.strftime("%Y-03-01"),
- 'payment_option': 'with_writeoff',
- 'writeoff_acc_id': ref('account.a_expense'),
- 'comment': 'Write Off',
- 'name': 'First payment',
- }
- if not res['value']['line_cr_ids']:
- res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}]
- for item in res['value']['line_cr_ids']:
- if item['amount_unreconciled'] == 150.00:
- item['amount'] = 130.00
+ voucher_id = self.browse(cr, uid, ref('account_voucher_1_case2a'))
+ data = []
+ for item in voucher_id.line_cr_ids:
+ if item.amount_unreconciled == 150.00:
+ data += [(item.id, 130.0)]
else:
- item['amount'] = 70.00
- vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']]
- id = self.create(cr, uid, vals)
- voucher_id = self.browse(cr, uid, id)
+ data += [(item.id, 70.0)]
+ for line_id, amount in data:
+ self.pool.get('account.voucher.line').write(cr, uid, [line_id], {'amount': amount})
assert (voucher_id.state=='draft'), "Voucher is not in draft state"
-
I confirm the voucher
-
!python {model: account.voucher}: |
import netsvc
- voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michael0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 2 USD/EUR DR EUR'), ('partner_id', '=', ref('base.res_partner_seagate'))])
wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr)
-
I check that the move of my voucher is valid
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michael0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 2 USD/EUR DR EUR'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
move_line_obj = self.pool.get('account.move.line')
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
for move_line in move_line_obj.browse(cr, uid, move_lines):
assert move_line.state == 'valid', "Voucher move is not valid"
--
- I check that my debtor account is correct
--
- I check that the debtor account has 2 new lines with 0 in amount_currency columns and their credit columns are 130 and 70
--
- !python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michael0'))])
- voucher_id = self.browse(cr, uid, voucher[0])
- move_line_obj = self.pool.get('account.move.line')
- move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
- for move_line in move_line_obj.browse(cr, uid, move_lines):
- assert move_line.amount_currency == 0.00, "A line has the 'amount_currency' column filled"
-
I check the residual amount of Invoice1, should be 55.56 in residual currency and 20 in amount_residual
-
@@ -220,7 +207,6 @@
move_line_obj = self.pool.get('account.move.line')
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)])
move_line = move_line_obj.browse(cr, uid, move_lines[0])
- print move_line.amount_residual, move_line.amount_residual_currency
assert (move_line.amount_residual_currency == 55.56 and move_line.amount_residual == 20) , "Residual amount is not correct for first Invoice"
-
I check the residual amuont of Invoice2, should be 22.22 in residual currency and 10 in amount_residual
@@ -231,47 +217,43 @@
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)])
move_line = move_line_obj.browse(cr, uid, move_lines[0])
assert (move_line.amount_residual_currency == 22.22 and move_line.amount_residual == 10) , "Residual amount is not correct for second Invoice"
--
- I create the second voucher of payment
-
+-
+ I create the second voucher of payment with values 80 USD, journal USD
+-
+ !record {model: account.voucher, id: account_voucher_2_case2a, view: view_vendor_receipt_form}:
+ account_id: account.cash
+ amount: 80
+ company_id: base.main_company
+ journal_id: bank_journal_USD
+ partner_id: base.res_partner_seagate
+ period_id: account.period_3
+ date: !eval time.strftime("%Y-04-01")
+ payment_option: 'with_writeoff'
+ writeoff_acc_id: account.a_expense
+ comment: 'Write Off'
+ name: 'Second payment: Case 2 SUPPL USD/EUR DR EUR'
+
+-
+ and I fully reconcile the 2 previous invoices
-
!python {model: account.voucher}: |
import netsvc, time
vals = {}
- res = self.onchange_partner_id(cr, uid, [], ref("res_partner_michael0"), ref('bank_journal_USD'), 80.0, 2, ttype='receipt', date=False)
- vals = {
- 'account_id': ref('account.cash'),
- 'amount': 80.0,
- 'company_id': ref('base.main_company'),
- 'currency_id': ref('base.USD'),
- 'journal_id': ref('bank_journal_USD'),
- 'partner_id': ref('res_partner_michael0'),
- 'period_id': ref('account.period_3'),
- 'type': 'receipt',
- 'date': time.strftime("%Y-%m-%d"),
- 'payment_option': 'with_writeoff',
- 'writeoff_acc_id': ref('account.a_expense'),
- 'exchange_acc_id': ref('account.o_expense'),
- 'comment': 'Write Off',
- 'name': 'Second payment',
- }
- vals.update(self.onchange_date(cr, uid, [], time.strftime('%Y-04-01'), ref('base.USD'), 80.0)['value'])
- if not res['value']['line_cr_ids']:
- res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}]
- for item in res['value']['line_cr_ids']:
- if item['amount_unreconciled'] == 55.56:
- item['amount'] = 55.56
+ voucher_id = self.browse(cr, uid, ref('account_voucher_2_case2a'))
+ data = []
+ for item in voucher_id.line_cr_ids:
+ if item.amount_unreconciled == 55.56:
+ data += [(item.id, 55.56)]
else:
- item['amount'] = 22.22
- vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']]
- id = self.create(cr, uid, vals)
- voucher_id = self.browse(cr, uid, id)
+ data += [(item.id, 22.22)]
+ for line_id, amount in data:
+ self.pool.get('account.voucher.line').write(cr, uid, [line_id], {'amount': amount})
assert (voucher_id.state=='draft'), "Voucher is not in draft state"
-
I check that writeoff amount computed is 2.22
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michael0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 2 SUPPL USD/EUR DR EUR'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
assert (round(voucher_id.writeoff_amount, 2) == 2.22), "Writeoff amount is not 2.22$"
-
@@ -279,14 +261,14 @@
-
!python {model: account.voucher}: |
import netsvc
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michael0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 2 SUPPL USD/EUR DR EUR'), ('partner_id', '=', ref('base.res_partner_seagate'))])
wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr)
-
I check that my voucher state is posted
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michael0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 2 SUPPL USD/EUR DR EUR'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
assert voucher_id.state == 'posted', "Voucher state is not posted"
-
@@ -299,7 +281,7 @@
I check that my writeoff is correct. 2.11 in credit and 2.22 in amount_currency
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michael0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 2 SUPPL USD/EUR DR EUR'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
move_line_obj = self.pool.get('account.move.line')
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
diff --git a/addons/account_voucher/test/case2_usd_eur_debtor_in_usd.yml b/addons/account_voucher/test/case2_usd_eur_debtor_in_usd.yml
index 355098dc7d6..a3a32a32082 100644
--- a/addons/account_voucher/test/case2_usd_eur_debtor_in_usd.yml
+++ b/addons/account_voucher/test/case2_usd_eur_debtor_in_usd.yml
@@ -1,6 +1,15 @@
-
In order to check the Account_voucher module with multi-currency in OpenERP,
I create 2 Invoices in USD and make 2 Payments one in USD and another in EUR, based on the currency rating on that particular date
+-
+ I set the income and expense currency accounts on the main company
+-
+ !python {model: res.company}: |
+ from datetime import datetime
+ vals = {
+ 'income_currency_exchange_account_id': ref('account.o_expense'),
+ 'expense_currency_exchange_account_id': ref('account.o_expense')}
+ self.write(cr, uid, ref('base.main_company'), vals)
-
I modify the debtor account in order to set the currency_id = USD
-
@@ -49,7 +58,6 @@
sequence_id: account.sequence_bank_journal
default_debit_account_id: account.cash
default_credit_account_id: account.cash
- currency: base.EUR
company_id: base.main_company
view_id: account.account_journal_bank_view
-
@@ -61,23 +69,11 @@
type: bank
analytic_journal_id: account.sit
sequence_id: account.sequence_bank_journal
- default_debit_account_id: account.cash
- default_credit_account_id: account.cash
+ default_debit_account_id: account_cash_usd_id
+ default_credit_account_id: account_cash_usd_id
currency: base.USD
company_id: base.main_company
view_id: account.account_journal_bank_view
--
- I create a new partner Michal Gallette
--
- !record {model: res.partner, id: res_partner_michal1}:
- address:
- - city: paris
- country_id: base.fr
- name: Michal
- street: 1 rue Rockfeller
- type: invoice
- zip: '75016'
- name: Mr.Michal Gallette
-
I create the first invoice on 1st January for 200 USD
-
@@ -97,7 +93,7 @@
product_id: product.product_product_pc1
uos_id: product.product_uom_unit
journal_id: account.sales_journal
- partner_id: res_partner_michal1
+ partner_id: base.res_partner_seagate
reference_type: none
-
I Validate invoice by clicking on Validate button
@@ -132,7 +128,7 @@
product_id: product.product_product_pc1
uos_id: product.product_uom_unit
journal_id: account.sales_journal
- partner_id: res_partner_michal1
+ partner_id: base.res_partner_seagate
reference_type: none
-
I Validate invoice by clicking on Validate button
@@ -149,52 +145,55 @@
move_line = move_line_obj.browse(cr, uid, move_lines[0])
assert (move_line.debit - move_line.credit == 80), "Invoice move is incorrect for debtors account"
-
- I create the first voucher of payment
-
+ I set the context that will be used for the encoding of all the vouchers of this file
+-
+ !context
+ 'type': 'receipt'
+-
+ I create the first voucher of payment with values 200 EUR, journal EUR
+-
+ !record {model: account.voucher, id: account_voucher_1_case2b, view: view_vendor_receipt_form}:
+ account_id: account.cash
+ amount: 200.0
+ company_id: base.main_company
+ journal_id: bank_journal_EUR
+ partner_id: base.res_partner_seagate
+ period_id: account.period_3
+ date: !eval time.strftime("%Y-03-01")
+ payment_option: 'with_writeoff'
+ writeoff_acc_id: account.a_expense
+ comment: 'Write Off'
+ name: 'First payment: Case 2 USD/EUR DR USD'
+
+-
+ I fill amounts 130 for the invoice of 200$ and 70 for the invoice of 100$>
-
!python {model: account.voucher}: |
import netsvc, time
vals = {}
- res = self.onchange_partner_id(cr, uid, [], ref("res_partner_michal1"), ref('bank_journal_EUR'), 200.0, False, ttype='receipt', date=False)
- vals = {
- 'account_id': ref('account.cash'),
- 'amount': 200.0,
- 'company_id': ref('base.main_company'),
- 'currency_id': ref('base.EUR'),
- 'journal_id': ref('bank_journal_EUR'),
- 'partner_id': ref('res_partner_michal1'),
- 'period_id': ref('account.period_3'),
- 'type': 'receipt',
- 'date': time.strftime("%Y-03-01"),
- 'payment_option': 'with_writeoff',
- 'writeoff_acc_id': ref('account.a_expense'),
- 'comment': 'Write Off',
- 'name': 'First payment',
- }
- if not res['value']['line_cr_ids']:
- res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}]
- for item in res['value']['line_cr_ids']:
- if item['amount_unreconciled'] == 150.00:
- item['amount'] = 130.00
+ voucher_id = self.browse(cr, uid, ref('account_voucher_1_case2b'))
+ data = []
+ for item in voucher_id.line_cr_ids:
+ if item.amount_unreconciled == 150.00:
+ data += [(item.id, 130.0)]
else:
- item['amount'] = 70.00
- vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']]
- id = self.create(cr, uid, vals)
- voucher_id = self.browse(cr, uid, id)
+ data += [(item.id, 70.0)]
+ for line_id, amount in data:
+ self.pool.get('account.voucher.line').write(cr, uid, [line_id], {'amount': amount})
assert (voucher_id.state=='draft'), "Voucher is not in draft state"
-
I confirm the voucher
-
!python {model: account.voucher}: |
import netsvc
- voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michal1'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 2 USD/EUR DR USD'), ('partner_id', '=', ref('base.res_partner_seagate'))])
wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr)
-
I check that the move of my voucher is valid
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michal1'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 2 USD/EUR DR USD'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
move_line_obj = self.pool.get('account.move.line')
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
@@ -206,7 +205,7 @@
I check that the debtor account has 2 new lines with 144.44 and 77.78 in amount_currency columns and their credit columns are 130 and 70
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michal1'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 2 USD/EUR DR USD'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
move_line_obj = self.pool.get('account.move.line')
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
@@ -224,8 +223,8 @@
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)])
move_line = move_line_obj.browse(cr, uid, move_lines[0])
assert (move_line.amount_residual_currency == 55.56 and move_line.amount_residual == 20) , "Residual amount is not correct for first Invoice"
-- toto
- I check the residual amuont of Invoice2, should be 22.22 in residual currency and 10 in amount_residual
+-
+ I check the residual amount of Invoice2, should be 22.22 in residual currency and 10 in amount_residual
-
!python {model: account.invoice}: |
invoice_id = self.browse(cr, uid, ref("account_second_invoice_feb_michal"))
@@ -233,47 +232,43 @@
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)])
move_line = move_line_obj.browse(cr, uid, move_lines[0])
assert (move_line.amount_residual_currency == 22.22 and move_line.amount_residual == 10) , "Residual amount is not correct for second Invoice"
--
- I create the second voucher of payment
-
+-
+ I create the second voucher of payment with values 80 USD, journal USD
+-
+ !record {model: account.voucher, id: account_voucher_2_case2b, view: view_vendor_receipt_form}:
+ account_id: account.cash
+ amount: 80.0
+ company_id: base.main_company
+ journal_id: bank_journal_USD
+ partner_id: base.res_partner_seagate
+ period_id: account.period_3
+ date: !eval time.strftime("%Y-04-01")
+ payment_option: 'with_writeoff'
+ writeoff_acc_id: account.a_expense
+ comment: 'Write Off'
+ name: 'Second payment: Case 2 SUPPL USD/EUR DR USD'
+
+-
+ and I fully reconcil the 2 previous invoices
-
!python {model: account.voucher}: |
import netsvc, time
vals = {}
- res = self.onchange_partner_id(cr, uid, [], ref("res_partner_michal1"), ref('bank_journal_USD'), 80.0, ref('base.USD'), ttype='receipt', date=False)
- vals = {
- 'account_id': ref('account.cash'),
- 'amount': 80.0,
- 'company_id': ref('base.main_company'),
- 'currency_id': ref('base.USD'),
- 'journal_id': ref('bank_journal_USD'),
- 'partner_id': ref('res_partner_michal1'),
- 'period_id': ref('account.period_3'),
- 'type': 'receipt',
- 'date': time.strftime("%Y-%m-%d"),
- 'payment_option': 'with_writeoff',
- 'writeoff_acc_id': ref('account.a_expense'),
- 'exchange_acc_id': ref('account.o_expense'),
- 'comment': 'Write Off',
- 'name': 'Second payment',
- }
- vals.update(self.onchange_date(cr, uid, [], time.strftime('%Y-04-01'), ref('base.USD'), 80.0)['value'])
- if not res['value']['line_cr_ids']:
- res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}]
- for item in res['value']['line_cr_ids']:
- if item['amount_unreconciled'] == 55.56:
- item['amount'] = 55.56
+ voucher_id = self.browse(cr, uid, ref('account_voucher_2_case2b'))
+ data = []
+ for item in voucher_id.line_cr_ids:
+ if item.amount_unreconciled == 55.56:
+ data += [(item.id, 55.56)]
else:
- item['amount'] = 22.22
- vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']]
- id = self.create(cr, uid, vals)
- voucher_id = self.browse(cr, uid, id)
+ data += [(item.id, 22.22)]
+ for line_id, amount in data:
+ self.pool.get('account.voucher.line').write(cr, uid, [line_id], {'amount': amount})
assert (voucher_id.state=='draft'), "Voucher is not in draft state"
-
I check that writeoff amount computed is 2.22
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michal1'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 2 SUPPL USD/EUR DR USD'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
assert (round(voucher_id.writeoff_amount, 2) == 2.22), "Writeoff amount is not 2.22$"
-
@@ -281,14 +276,14 @@
-
!python {model: account.voucher}: |
import netsvc
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michal1'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 2 SUPPL USD/EUR DR USD'), ('partner_id', '=', ref('base.res_partner_seagate'))])
wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr)
-
I check that my voucher state is posted
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michal1'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 2 SUPPL USD/EUR DR USD'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
assert voucher_id.state == 'posted', "Voucher state is not posted"
-
@@ -301,7 +296,7 @@
I check that my writeoff is correct. 2.11 in credit and 2.22 in amount_currency
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michal1'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 2 SUPPL USD/EUR DR USD'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
move_line_obj = self.pool.get('account.move.line')
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
@@ -333,8 +328,8 @@
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)])
move_line = move_line_obj.browse(cr, uid, move_lines[0])
assert (move_line.amount_residual_currency == 0.0 and move_line.amount_residual == 0.0 and invoice_id.state == 'paid') , "Residual amount is not correct for first Invoice"
--
- I check the residual amuont of invoice 2, should be 0 in residual currency and 0 in amount_residual and paid
+-
+ I check the residual amount of invoice 2, should be 0 in residual currency and 0 in amount_residual and paid
-
!python {model: account.invoice}: |
invoice_id = self.browse(cr, uid, ref("account_second_invoice_feb_michal"))
diff --git a/addons/account_voucher/test/case3_eur_eur.yml b/addons/account_voucher/test/case3_eur_eur.yml
index 9ed498442fb..a2fc39e1844 100644
--- a/addons/account_voucher/test/case3_eur_eur.yml
+++ b/addons/account_voucher/test/case3_eur_eur.yml
@@ -26,21 +26,8 @@
sequence_id: account.sequence_bank_journal
default_debit_account_id: account.cash
default_credit_account_id: account.cash
- currency: base.EUR
company_id: base.main_company
view_id: account.account_journal_bank_view
--
- I create a new partner Peter Lawson.
--
- !record {model: res.partner, id: res_partner_peter0}:
- address:
- - city: paris
- country_id: base.fr
- name: Peter
- street: 1 rue Rockfeller
- type: invoice
- zip: '75016'
- name: Mr.Peter Lawson
-
I create the first invoice on 1st January for 150 EUR
-
@@ -60,7 +47,7 @@
product_id: product.product_product_pc1
uos_id: product.product_uom_unit
journal_id: account.sales_journal
- partner_id: res_partner_peter0
+ partner_id: base.res_partner_seagate
reference_type: none
-
I Validate invoice by clicking on Validate button
@@ -95,7 +82,7 @@
product_id: product.product_product_pc1
uos_id: product.product_uom_unit
journal_id: account.sales_journal
- partner_id: res_partner_peter0
+ partner_id: base.res_partner_seagate
reference_type: none
-
I Validate invoice by clicking on Validate button
@@ -112,44 +99,47 @@
move_line = move_line_obj.browse(cr, uid, move_lines[0])
assert (move_line.debit - move_line.credit == 80.00), "Invoice move is incorrect for debtors account"
-
- I create the first voucher of payment
-
+ I set the context that will be used for the encoding of all the vouchers of this file
+-
+ !context
+ 'type': 'receipt'
+-
+ I create the first voucher of payment with values 120 EUR, journal EUR
+-
+ !record {model: account.voucher, id: account_voucher_1_case3, view: view_vendor_receipt_form}:
+ account_id: account.cash
+ amount: 120.0
+ company_id: base.main_company
+ journal_id: bank_journal_EUR
+ partner_id: base.res_partner_seagate
+ period_id: account.period_3
+ date: !eval time.strftime("%Y-03-01")
+ payment_option: 'with_writeoff'
+ writeoff_acc_id: account.a_expense
+ comment: 'Write Off'
+ name: 'First payment: Case 3'
+
+-
+ I fill amounts 100 for the invoice of 150€ and 20 for the invoice of 80€
-
!python {model: account.voucher}: |
import netsvc, time
vals = {}
- res = self.onchange_partner_id(cr, uid, [], ref("res_partner_peter0"), ref('bank_journal_EUR'), 120.00, False, ttype='receipt', date=False)
- vals = {
- 'account_id': ref('account.cash'),
- 'amount': 120.00,
- 'company_id': ref('base.main_company'),
- 'currency_id': ref('base.EUR'),
- 'journal_id': ref('bank_journal_EUR'),
- 'partner_id': ref('res_partner_peter0'),
- 'period_id': ref('account.period_3'),
- 'type': 'receipt',
- 'date': time.strftime("%Y-03-01"),
- 'payment_option': 'with_writeoff',
- 'writeoff_acc_id': ref('account.a_expense'),
- 'comment': 'Write Off',
- 'name': 'First payment',
- }
- if not res['value']['line_cr_ids']:
- res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}]
- for item in res['value']['line_cr_ids']:
- if item['amount_unreconciled'] == 150.00:
- item['amount'] = 100.00
+ voucher_id = self.browse(cr, uid, ref('account_voucher_1_case3'))
+ data = []
+ for item in voucher_id.line_cr_ids:
+ if item.amount_unreconciled == 150.00:
+ data += [(item.id, 100.0)]
else:
- item['amount'] = 20.00
- vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']]
- id = self.create(cr, uid, vals)
- voucher_id = self.browse(cr, uid, id)
+ data += [(item.id, 20.0)]
+ for line_id, amount in data:
+ self.pool.get('account.voucher.line').write(cr, uid, [line_id], {'amount': amount})
assert (voucher_id.state=='draft'), "Voucher is not in draft state"
-
I check that writeoff amount computed is 0.00
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'First payment'),('partner_id', '=', ref('res_partner_peter0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 3'),('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
assert (voucher_id.writeoff_amount == 0.00), "Writeoff amount is not 0.00"
-
@@ -157,14 +147,14 @@
-
!python {model: account.voucher}: |
import netsvc
- voucher = self.search(cr, uid, [('name', '=', 'First payment'),('partner_id', '=', ref('res_partner_peter0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 3'),('partner_id', '=', ref('base.res_partner_seagate'))])
wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr)
-
I check that the move of my first voucher is valid
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'First payment'),('partner_id', '=', ref('res_partner_peter0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 3'),('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
move_line_obj = self.pool.get('account.move.line')
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
@@ -176,7 +166,7 @@
I check that the debtor account has 2 new lines with 0.00 and 0.00 in amount_currency columns and their credit are 20 and 100 respectively
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'First payment'),('partner_id', '=', ref('res_partner_peter0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 3'),('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
move_line_obj = self.pool.get('account.move.line')
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
@@ -194,7 +184,7 @@
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)])
move_line = move_line_obj.browse(cr, uid, move_lines[0])
assert (move_line.amount_residual_currency == 50.0 and move_line.amount_residual == 50.0) , "Residual amount is not correct for first Invoice"
--
+-
I check the residual amuont of Invoice2 is 60
-
!python {model: account.invoice}: |
@@ -204,44 +194,42 @@
move_line = move_line_obj.browse(cr, uid, move_lines[0])
assert (move_line.amount_residual_currency == 60.0 and move_line.amount_residual == 60.0) , "Residual amount is not correct for second Invoice"
-
- I create the second voucher of payment and check to let open the debtor overpaid amount.
-
+ I create the second voucher of payment with values 120€, journal EUR, and check to let open the debtor overpaid amount
+-
+ !record {model: account.voucher, id: account_voucher_2_case3, view: view_vendor_receipt_form}:
+ account_id: account.cash
+ amount: 120.0
+ company_id: base.main_company
+ journal_id: bank_journal_EUR
+ partner_id: base.res_partner_seagate
+ period_id: account.period_3
+ date: !eval time.strftime("%Y-04-01")
+ payment_option: 'with_writeoff'
+ writeoff_acc_id: account.a_expense
+ comment: 'Write Off'
+ name: 'Second payment: Case 3'
+
+-
+ I fill amounts 50 for the invoice of 150€ and 70 for the invoice of 80€
-
!python {model: account.voucher}: |
import netsvc, time
vals = {}
- res = self.onchange_partner_id(cr, uid, [], ref("res_partner_peter0"), ref('bank_journal_EUR'), 120.00, False, ttype='receipt', date=False)
- vals = {
- 'account_id': ref('account.cash'),
- 'amount': 120.00,
- 'company_id': ref('base.main_company'),
- 'currency_id': ref('base.EUR'),
- 'journal_id': ref('bank_journal_EUR'),
- 'partner_id': ref('res_partner_peter0'),
- 'period_id': ref('account.period_3'),
- 'type': 'receipt',
- 'date': time.strftime("%Y-04-01"),
- 'payment_option': 'with_writeoff',
- 'writeoff_acc_id': ref('account.a_expense'),
- 'comment': 'Write Off',
- 'name': 'Second payment',
- }
- if not res['value']['line_cr_ids']:
- res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}]
- for item in res['value']['line_cr_ids']:
- if item['amount_unreconciled'] == 50.00:
- item['amount'] = 50.00
- elif item['amount_unreconciled'] == 60.00:
- item['amount'] = 70.00
- vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']]
- id = self.create(cr, uid, vals)
- voucher_id = self.browse(cr, uid, id)
+ voucher_id = self.browse(cr, uid, ref('account_voucher_2_case3'))
+ data = []
+ for item in voucher_id.line_cr_ids:
+ if item.amount_unreconciled == 50.00:
+ data += [(item.id, 50.0)]
+ elif item.amount_unreconciled == 60.00:
+ data += [(item.id, 70.00)]
+ for line_id, amount in data:
+ self.pool.get('account.voucher.line').write(cr, uid, [line_id], {'amount': amount})
assert (voucher_id.state=='draft'), "Voucher is not in draft state"
-
I check that writeoff amount computed is 0.00
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'),('partner_id', '=', ref('res_partner_peter0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 3'),('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
assert (voucher_id.writeoff_amount == 0.00), "Writeoff amount is not 0"
-
@@ -249,14 +237,14 @@
-
!python {model: account.voucher}: |
import netsvc
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_peter0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 3'), ('partner_id', '=', ref('base.res_partner_seagate'))])
wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr)
-
I check that the move of my second voucher is valid
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_peter0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 3'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
move_line_obj = self.pool.get('account.move.line')
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
@@ -268,7 +256,7 @@
I check that the debtor account has 2 new lines with 0.00 and 0.00 in amount_currency columns and their credit are 70 and 50
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_peter0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'Second payment: Case 3'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
move_line_obj = self.pool.get('account.move.line')
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
diff --git a/addons/account_voucher/test/case4_cad_chf.yml b/addons/account_voucher/test/case4_cad_chf.yml
index 557e20dec1a..f31a7393a8e 100644
--- a/addons/account_voucher/test/case4_cad_chf.yml
+++ b/addons/account_voucher/test/case4_cad_chf.yml
@@ -1,6 +1,15 @@
-
In order to check the Account_voucher module with multi-currency in OpenERP,
I create an invoice in CAD and make its Payment in CHF based on the currency rating on that particular date.
+-
+ I set the income and expense currency accounts on the main company
+-
+ !python {model: res.company}: |
+ from datetime import datetime
+ vals = {
+ 'income_currency_exchange_account_id': ref('account.o_expense'),
+ 'expense_currency_exchange_account_id': ref('account.o_expense')}
+ self.write(cr, uid, ref('base.main_company'), vals)
-
I create currency CAD in OpenERP for January of 1.338800 Rate
-
@@ -29,6 +38,16 @@
currency_id: base.CHF
name: !eval "'%s-03-01' %(datetime.now().year)"
rate: 1.25000
+-
+ I create a cash account with currency CHF
+-
+ !record {model: account.account, id: account_cash_chf_id}:
+ currency_id: base.CHF
+ name: "cash account in chf"
+ code: "Xcash chf"
+ type: 'liquidity'
+ user_type: "account.account_type_cash_moves"
+
-
I create a bank journal with CHF as currency
-
@@ -38,23 +57,11 @@
type: bank
analytic_journal_id: account.sit
sequence_id: account.sequence_bank_journal
- default_debit_account_id: account.cash
- default_credit_account_id: account.cash
+ default_debit_account_id: account_cash_chf_id
+ default_credit_account_id: account_cash_chf_id
currency: base.CHF
company_id: base.main_company
view_id: account.account_journal_bank_view
--
- I create a new partner John Armani.
--
- !record {model: res.partner, id: res_partner_john0}:
- address:
- - city: paris
- country_id: base.fr
- name: John
- street: 1 rue Rockfeller
- type: invoice
- zip: '75016'
- name: Mr.John Armani
-
I create the first invoice on 1st January for 200 CAD
-
@@ -74,7 +81,7 @@
product_id: product.product_product_pc1
uos_id: product.product_uom_unit
journal_id: account.sales_journal
- partner_id: res_partner_john0
+ partner_id: base.res_partner_seagate
reference_type: none
-
I Validate invoice by clicking on Validate button
@@ -91,44 +98,46 @@
move_line = move_line_obj.browse(cr, uid, move_lines[0])
assert (move_line.debit - move_line.credit == 149.39), "Invoice move is incorrect for debtors account"
-
- I create the first voucher of payment
-
+ I set the context that will be used for the encoding of all the vouchers of this file
+-
+ !context
+ 'type': 'receipt'
+-
+ I create the first voucher of payment with values 200 CHF, journal CHF
+-
+ !record {model: account.voucher, id: account_voucher_1_case4, view: view_vendor_receipt_form}:
+ account_id: account.cash
+ amount: 200
+ company_id: base.main_company
+ journal_id: bank_journal_CHF
+ partner_id: base.res_partner_seagate
+ period_id: account.period_3
+ date: !eval time.strftime("%Y-03-01")
+ payment_option: 'with_writeoff'
+ writeoff_acc_id: account.a_expense
+ comment: 'Write Off'
+ name: 'First payment: Case 4'
+-
+ I completly pay the invoice of 200 CAD
-
!python {model: account.voucher}: |
import netsvc, time
vals = {}
- res = self.onchange_partner_id(cr, uid, [], ref("res_partner_john0"), ref('bank_journal_CHF'), 200.00, ref('base.CHF'), ttype='receipt', date=False)
- vals = {
- 'account_id': ref('account.cash'),
- 'amount': 200.00,
- 'company_id': ref('base.main_company'),
- 'currency_id': ref('base.CHF'),
- 'journal_id': ref('bank_journal_CHF'),
- 'partner_id': ref('res_partner_john0'),
- 'period_id': ref('account.period_3'),
- 'type': 'receipt',
- 'date': time.strftime("%Y-%m-%d"),
- 'payment_option': 'with_writeoff',
- 'writeoff_acc_id': ref('account.a_expense'),
- 'exchange_acc_id': ref('account.o_expense'),
- 'comment': 'Write Off',
- 'name': 'First payment',
- }
- vals.update(self.onchange_date(cr, uid, [], time.strftime('%Y-03-01'), ref('base.CHF'), 200.0)['value'])
- if not res['value']['line_cr_ids']:
- res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}]
- for item in res['value']['line_cr_ids']:
- if item['amount_unreconciled'] == 186.74:
- item['amount'] = 186.74
- vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']]
- id = self.create(cr, uid, vals)
- voucher_id = self.browse(cr, uid, id)
+ voucher_id = self.browse(cr, uid, ref('account_voucher_1_case4'))
+ data = []
+ for item in voucher_id.line_cr_ids:
+ if item.amount_unreconciled == 186.74:
+ data += [(item.id, 186.74)]
+ else:
+ data += [(item.id, 0.0)]
+ for line_id, amount in data:
+ self.pool.get('account.voucher.line').write(cr, uid, [line_id], {'amount': amount})
assert (voucher_id.state=='draft'), "Voucher is not in draft state"
-
I check that writeoff amount computed is 13.26
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_john0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 4'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
assert (round(voucher_id.writeoff_amount,2) == 13.26), "Writeoff amount is not 13.26 CHF"
-
@@ -136,14 +145,14 @@
-
!python {model: account.voucher}: |
import netsvc
- voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_john0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 4'), ('partner_id', '=', ref('base.res_partner_seagate'))])
wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr)
-
I check that the move of my voucher is valid
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_john0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 4'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
move_line_obj = self.pool.get('account.move.line')
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
@@ -153,21 +162,21 @@
-
I check that my debtor account is correct
-
- I check that the debtor account has 1 new line with -186.74 as amount_currency columns and 149.39 of credit and currency is CHF.
+ I check that the debtor account has 1 new line with -298.78 as amount_currency columns and 149.39 of credit and currency is CAD.
-
I check that my currency rate difference is correct. 0 in debit with no amount_currency
-
I check that my writeoff is correct. 11.05 credit and 13.26 amount_currency
-
!python {model: account.voucher}: |
- voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_john0'))])
+ voucher = self.search(cr, uid, [('name', '=', 'First payment: Case 4'), ('partner_id', '=', ref('base.res_partner_seagate'))])
voucher_id = self.browse(cr, uid, voucher[0])
move_line_obj = self.pool.get('account.move.line')
move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)])
for move_line in move_line_obj.browse(cr, uid, move_lines):
if move_line.amount_currency == 200:
assert move_line.debit == 160.00, "Bank account has wrong entry."
- elif move_line.amount_currency == -186.74:
+ elif move_line.amount_currency == -298.78:
assert move_line.credit == 149.39, "Debtor account has wrong entry."
elif move_line.debit == 0.00 and move_line.credit == 0.00:
assert move_line.amount_currency == 0.00, "Incorrect Currency Difference."
diff --git a/addons/account_voucher/test/sales_receipt.yml b/addons/account_voucher/test/sales_receipt.yml
index d3fd720ec6d..7ea4f7d1c55 100644
--- a/addons/account_voucher/test/sales_receipt.yml
+++ b/addons/account_voucher/test/sales_receipt.yml
@@ -5,7 +5,6 @@
account_id: account.a_recv
amount: 30000.0
company_id: base.main_company
- currency_id: base.EUR
journal_id: account.sales_journal
line_cr_ids:
- account_id: account.a_sale
diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml
index 2c9b2edee6e..5cf9b42be0b 100644
--- a/addons/account_voucher/voucher_payment_receipt_view.xml
+++ b/addons/account_voucher/voucher_payment_receipt_view.xml
@@ -75,13 +75,13 @@
[[ o['partner'] and o['partner'].name or False]]
- [[o['partner'] and o['partner'].address[0].street or False]]
- [[o['partner'] and o['partner'].address[0].zip or False]][[o['partner'] and o['partner'].address[0].city or False]]
- [[o['partner'] and o['partner'].address[0].country_id.name or False]]
+ [[o['partner'] and o['partner'].address and display_address(o['partner'].address[0]) ]]
diff --git a/addons/auction/report/deposit_seller.rml b/addons/auction/report/deposit_seller.rml
index 3adc1152067..518f1f441df 100644
--- a/addons/auction/report/deposit_seller.rml
+++ b/addons/auction/report/deposit_seller.rml
@@ -84,9 +84,7 @@
[[o.bord_vnd_id.partner_id.title]]
[[o.bord_vnd_id.partner_id.name]]
- [[o.bord_vnd_id.partner_id.address[0].street]]
- [[o.bord_vnd_id.partner_id.address[0].zip]],[[o.bord_vnd_id.partner_id.address[0].city]]
- [[o.bord_vnd_id.partner_id.address[0].country_id.name]]
+ [[o.bord_vnd_id.partner_id.address and display_address(o.bord_vnd_id.partner_id.address[0]) ]]
diff --git a/addons/auction/report/photo_shadow.py b/addons/auction/report/photo_shadow.py
index 4aea8e31ba6..919fa701e23 100644
--- a/addons/auction/report/photo_shadow.py
+++ b/addons/auction/report/photo_shadow.py
@@ -27,7 +27,7 @@ def convert(from_file, to_file):
__convert(from_file, to_file, size=95)
def __convert(from_file, to_file, size=95):
- import Image, ImageDraw, ImageFilter
+ from PIL import Image, ImageDraw, ImageFilter
im = Image.open(from_file)
if float(im.size[1]/im.size[0])>2:
im = im.resize((im.size[0]*size/im.size[1], size))
diff --git a/addons/auction/report/report_auction.py b/addons/auction/report/report_auction.py
index 012ea3c891e..af5d76b6076 100644
--- a/addons/auction/report/report_auction.py
+++ b/addons/auction/report/report_auction.py
@@ -209,3 +209,5 @@ class report_object_encoded(osv.osv):
report_object_encoded()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auction/report/seller_form_report.rml b/addons/auction/report/seller_form_report.rml
index c2d724eb259..d9cc1adaadf 100644
--- a/addons/auction/report/seller_form_report.rml
+++ b/addons/auction/report/seller_form_report.rml
@@ -74,9 +74,7 @@
[[ o['partner'] and o['partner'].name or False]]
- [[o['partner'] and o['partner'].address[0].street or False]]
- [[o['partner'] and o['partner'].address[0].zip or False]][[o['partner'] and o['partner'].address[0].city or False]]
- [[o['partner'] and o['partner'].address[0].country_id.name or False]]
+ [[ o['partner'] and o['partner'].address and display_address(o['partner'].address[0])
diff --git a/addons/auction/security/ir.model.access.csv b/addons/auction/security/ir.model.access.csv
index 94c9c1f83aa..351ca866f6d 100644
--- a/addons/auction/security/ir.model.access.csv
+++ b/addons/auction/security/ir.model.access.csv
@@ -1,35 +1,35 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_auction_artists","auction.artists","model_auction_artists","group_auction_manager",1,1,1,1
-"access_auction_dates_user","auction.dates user","model_auction_dates","group_auction_user",1,0,0,0
-"access_auction_dates_manager","auction.dates manager","model_auction_dates","group_auction_manager",1,1,1,1
-"access_auction_deposit_manager","auction.deposit manager","model_auction_deposit","group_auction_manager",1,1,1,1
-"access_auction_deposit_user","auction.deposit user","model_auction_deposit","group_auction_user",1,0,0,0
-"access_auction_deposit_cost","auction.deposit.cost","model_auction_deposit_cost","group_auction_manager",1,1,1,1
-"access_auction_lot_category","auction.lot.category","model_auction_lot_category","group_auction_user",1,0,0,0
-"access_auction_lot_category_manager","auction.lot.category manager","model_auction_lot_category","group_auction_manager",1,1,1,1
-"access_auction_lots","auction.lots","model_auction_lots","group_auction_user",1,1,1,0
-"access_auction_lots_manager","auction.lots manager","model_auction_lots","group_auction_manager",1,0,0,0
-"access_auction_bid","auction.bid","model_auction_bid","group_auction_user",1,1,1,1
-"access_auction_bid_manager","auction.bid manager","model_auction_bid","group_auction_manager",1,0,0,0
-"access_auction_bid_line","auction.bid.line","model_auction_bid_line","group_auction_user",1,1,1,1
-"access_auction_bid_line_manager","auction.bid.line manager","model_auction_bid_line","group_auction_manager",1,0,0,0
-"access_auction_lot_history","auction.lot.history","model_auction_lot_history","group_auction_user",1,1,1,1
-"access_auction_lot_history_manager","auction.lot.history manager","model_auction_lot_history","group_auction_manager",1,0,0,0
-"access_report_auction","report.auction","model_report_auction","group_auction_manager",1,1,1,1
-"access_report_auction_object_date","report.auction.object.date","model_report_auction_object_date","group_auction_manager",1,1,1,1
-"access_report_auction_adjudication","report.auction.adjudication","model_report_auction_adjudication","group_auction_manager",1,1,1,1
-"access_report_object_encoded","report.object.encoded","model_report_object_encoded","group_auction_manager",1,1,1,1
-"access_aie_category","aie.category","model_aie_category","group_auction_manager",1,1,1,1
-"access_auction_account_tax_user","account.tax user","account.model_account_tax","group_auction_user",1,0,0,0
-"access_auction_account_tax","account.tax manager","account.model_account_tax","group_auction_manager",1,1,1,0
-"access_auction_account_fiscalyear","account.fiscalyear manager","account.model_account_fiscalyear","group_auction_manager",1,1,1,0
-"access_auction_account_journal","account.journal manager","account.model_account_journal","group_auction_manager",1,1,1,0
-"access_auction_account_invoice","account.invoice manager","account.model_account_invoice","group_auction_manager",1,1,1,0
-"access_auction_account_invoice_line","account.invoice.line manager","account.model_account_invoice_line","group_auction_manager",1,1,1,0
-"access_auction_account_invoice_tax","account.invoice.tax manager","account.model_account_invoice_tax","group_auction_manager",1,1,1,0
-"access_auction_account_analytic_journal","account.analytic.journal manager","account.model_account_analytic_journal","group_auction_manager",1,1,1,0
-"access_auction_account_period","account.period manager","account.model_account_period","group_auction_manager",1,1,1,0
-"access_auction_account_move","account.move manager","account.model_account_move","group_auction_manager",1,1,1,0
-"access_auction_account_move_line","account.move.line manager","account.model_account_move_line","group_auction_manager",1,1,1,0
-"access_auction_account_journal_period","account.journal.period manager","account.model_account_journal_period","group_auction_manager",1,1,1,0
-"access_auction_account_analytic_line","account.analytic.line manager","account.model_account_analytic_line","group_auction_manager",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_auction_artists,auction.artists,model_auction_artists,group_auction_manager,1,1,1,1
+access_auction_dates_user,auction.dates user,model_auction_dates,group_auction_user,1,0,0,0
+access_auction_dates_manager,auction.dates manager,model_auction_dates,group_auction_manager,1,1,1,1
+access_auction_deposit_manager,auction.deposit manager,model_auction_deposit,group_auction_manager,1,1,1,1
+access_auction_deposit_user,auction.deposit user,model_auction_deposit,group_auction_user,1,0,0,0
+access_auction_deposit_cost,auction.deposit.cost,model_auction_deposit_cost,group_auction_manager,1,1,1,1
+access_auction_lot_category,auction.lot.category,model_auction_lot_category,group_auction_user,1,0,0,0
+access_auction_lot_category_manager,auction.lot.category manager,model_auction_lot_category,group_auction_manager,1,1,1,1
+access_auction_lots,auction.lots,model_auction_lots,group_auction_user,1,1,1,0
+access_auction_lots_manager,auction.lots manager,model_auction_lots,group_auction_manager,1,0,0,0
+access_auction_bid,auction.bid,model_auction_bid,group_auction_user,1,1,1,1
+access_auction_bid_manager,auction.bid manager,model_auction_bid,group_auction_manager,1,0,0,0
+access_auction_bid_line,auction.bid.line,model_auction_bid_line,group_auction_user,1,1,1,1
+access_auction_bid_line_manager,auction.bid.line manager,model_auction_bid_line,group_auction_manager,1,0,0,0
+access_auction_lot_history,auction.lot.history,model_auction_lot_history,group_auction_user,1,1,1,1
+access_auction_lot_history_manager,auction.lot.history manager,model_auction_lot_history,group_auction_manager,1,0,0,0
+access_report_auction,report.auction,model_report_auction,group_auction_manager,1,1,1,1
+access_report_auction_object_date,report.auction.object.date,model_report_auction_object_date,group_auction_manager,1,1,1,1
+access_report_auction_adjudication,report.auction.adjudication,model_report_auction_adjudication,group_auction_manager,1,1,1,1
+access_report_object_encoded,report.object.encoded,model_report_object_encoded,group_auction_manager,1,1,1,1
+access_aie_category,aie.category,model_aie_category,group_auction_manager,1,1,1,1
+access_auction_account_tax_user,account.tax user,account.model_account_tax,group_auction_user,1,0,0,0
+access_auction_account_tax,account.tax manager,account.model_account_tax,group_auction_manager,1,1,1,0
+access_auction_account_fiscalyear,account.fiscalyear manager,account.model_account_fiscalyear,group_auction_manager,1,1,1,0
+access_auction_account_journal,account.journal manager,account.model_account_journal,group_auction_manager,1,1,1,0
+access_auction_account_invoice,account.invoice manager,account.model_account_invoice,group_auction_manager,1,1,1,0
+access_auction_account_invoice_line,account.invoice.line manager,account.model_account_invoice_line,group_auction_manager,1,1,1,0
+access_auction_account_invoice_tax,account.invoice.tax manager,account.model_account_invoice_tax,group_auction_manager,1,1,1,0
+access_auction_account_analytic_journal,account.analytic.journal manager,account.model_account_analytic_journal,group_auction_manager,1,1,1,0
+access_auction_account_period,account.period manager,account.model_account_period,group_auction_manager,1,1,1,0
+access_auction_account_move,account.move manager,account.model_account_move,group_auction_manager,1,1,1,0
+access_auction_account_move_line,account.move.line manager,account.model_account_move_line,group_auction_manager,1,1,1,0
+access_auction_account_journal_period,account.journal.period manager,account.model_account_journal_period,group_auction_manager,1,1,1,0
+access_auction_account_analytic_line,account.analytic.line manager,account.model_account_analytic_line,group_auction_manager,1,1,1,1
diff --git a/addons/auction/test/auction.yml b/addons/auction/test/auction.yml
index 72014f985ef..f970ffe86dd 100644
--- a/addons/auction/test/auction.yml
+++ b/addons/auction/test/auction.yml
@@ -34,21 +34,8 @@
-
!record {model: account.journal, id: account.sales_journal}:
analytic_journal_id: account.cose_journal_sale
--
- I'm creating new Seller "Mr. Pinakin" with him email "info@mycustomer.com".
--
- !record {model: res.partner, id: res_partner_mrpinakin0}:
- address:
- - city: Namur
- country_id: base.be
- phone: (+32).10.45.18.77
- street: 23, street ways
- type: default
- zip: '2324324'
- email: 'info@mycustomer.com'
- name: Mr. Pinakin
--
+-
I'm creating new Buyer "Mr. Patel" with his email "info@myinfobid.com".
-
!record {model: res.partner, id: res_partner_mrpatel0}:
@@ -61,21 +48,7 @@
email: 'info@myinfobid.com'
name: Mr. Patel
--
- I'm creating new Buyer "Mr. Johnson" with his email "info@mrkjohnson.com".
--
- !record {model: res.partner, id: res_partner_mrkjohnson0}:
- address:
- - city: paris
- country_id: base.fr
- name: Mark Johnson
- street: 1 rue Rockfeller
- type: invoice
- zip: '75016'
- email: 'info@mrkjohnson.com'
- name: Mr. Mark Johnson
-
--
+-
I'm creating new Buyer "Mr. Rahi" with his email "info@poalrahi.com".
-
!record {model: res.partner, id: res_partner_poalrahi0}:
@@ -140,7 +113,7 @@
date_dep: !eval "'%s-08-01' %(datetime.now().year)"
method: keep
name: AD/006
- partner_id: res_partner_mrpinakin0
+ partner_id: base.res_partner_maxtor
specific_cost_ids:
- account: auction.auction_expense
amount: 200.0
@@ -149,7 +122,7 @@
I create a new object wooden-chair which is to be auctioned.
-
!record {model: auction.lots, id: auction_lots_woodenchair0}:
- ach_uid: res_partner_mrkjohnson0
+ ach_uid: base.res_partner_seagate
artist_id: auction_artists_vincentvangogh0
auction_id: auction_dates_antiquefurnitureexhibition0
bord_vnd_id: auction_deposit_ad0
@@ -199,12 +172,12 @@
price: 3200.0
-
- I create another bid for an object "wooden-chair" bid by a Mr.Johnson
+ I create another bid for an object "wooden-chair" bid by a Mr.Seagate
-
!record {model: auction.bid, id: auction_bid_bid2}:
auction_id: auction_dates_antiquefurnitureexhibition0
name: bid/003
- partner_id: res_partner_mrkjohnson0
+ partner_id: base.res_partner_seagate
-
I create a bid line.
-
@@ -215,7 +188,7 @@
lot_id: auction.auction_lots_woodenchair0
price: 4000.0
-
- Mr. MarkJohnson bid are selected as the Finalist Bid with 4000 Euro
+ Mr. Seagate bids are selected as the Finalist Bid with 4000 Euro
-
I check that buyer price and seller price gets bound with the value
-
@@ -250,7 +223,7 @@
-
!record {model: auction.lots.make.invoice.buyer, id: auction_lots_make_invoice_buyer_0}:
amount: 3090.0
- buyer_id: res_partner_mrkjohnson0
+ buyer_id: base.res_partner_seagate
number: !eval "'%s/003' %(datetime.now().year)"
objects: 1
-
diff --git a/addons/auction/wizard/auction_lots_able.py b/addons/auction/wizard/auction_lots_able.py
index 8604d691456..37d8374aad4 100644
--- a/addons/auction/wizard/auction_lots_able.py
+++ b/addons/auction/wizard/auction_lots_able.py
@@ -44,3 +44,5 @@ class auction_lots_able(osv.osv_memory):
return {'type': 'ir.actions.act_window_close'}
auction_lots_able()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auction/wizard/auction_lots_cancel.py b/addons/auction/wizard/auction_lots_cancel.py
index 3974241a071..7157ac8abea 100644
--- a/addons/auction/wizard/auction_lots_cancel.py
+++ b/addons/auction/wizard/auction_lots_cancel.py
@@ -53,4 +53,5 @@ class auction_lots_cancel(osv.osv):
_columns = {
}
-auction_lots_cancel()
\ No newline at end of file
+auction_lots_cancel()
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auction/wizard/auction_lots_enable.py b/addons/auction/wizard/auction_lots_enable.py
index 290664ba697..c4c8792f76a 100644
--- a/addons/auction/wizard/auction_lots_enable.py
+++ b/addons/auction/wizard/auction_lots_enable.py
@@ -41,3 +41,5 @@ class auction_lots_enable(osv.osv_memory):
return {'type': 'ir.actions.act_window_close'}
auction_lots_enable()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auction/wizard/auction_lots_make_invoice.py b/addons/auction/wizard/auction_lots_make_invoice.py
index 3a87a202b74..19c39dc2c04 100644
--- a/addons/auction/wizard/auction_lots_make_invoice.py
+++ b/addons/auction/wizard/auction_lots_make_invoice.py
@@ -89,3 +89,5 @@ class auction_lots_make_invoice(osv.osv_memory):
}
auction_lots_make_invoice()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auction/wizard/auction_lots_make_invoice_buyer.py b/addons/auction/wizard/auction_lots_make_invoice_buyer.py
index dc39ccbb717..253a5b317ff 100644
--- a/addons/auction/wizard/auction_lots_make_invoice_buyer.py
+++ b/addons/auction/wizard/auction_lots_make_invoice_buyer.py
@@ -89,3 +89,5 @@ class auction_lots_make_invoice_buyer(osv.osv_memory):
}
auction_lots_make_invoice_buyer()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auction/wizard/auction_pay_sel.py b/addons/auction/wizard/auction_pay_sel.py
index 77484bbe988..42ea08e8094 100644
--- a/addons/auction/wizard/auction_pay_sel.py
+++ b/addons/auction/wizard/auction_pay_sel.py
@@ -55,3 +55,5 @@ class auction_pay_sel(osv.osv_memory):
return {'type': 'ir.actions.act_window_close'}
auction_pay_sel()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auction/wizard/auction_taken.py b/addons/auction/wizard/auction_taken.py
index 8ada436ae5d..38ac6dca2fe 100644
--- a/addons/auction/wizard/auction_taken.py
+++ b/addons/auction/wizard/auction_taken.py
@@ -51,3 +51,5 @@ class auction_taken(osv.osv_memory):
return {'lot_ids': []}
auction_taken()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auction/wizard/auction_transfer_unsold_object.py b/addons/auction/wizard/auction_transfer_unsold_object.py
index f593a36de2e..0e52199e566 100644
--- a/addons/auction/wizard/auction_transfer_unsold_object.py
+++ b/addons/auction/wizard/auction_transfer_unsold_object.py
@@ -84,4 +84,5 @@ class auction_transfer_unsold_object(osv.osv):
'state':'draft'})
return {'type': 'ir.actions.act_window_close'}
-auction_transfer_unsold_object()
\ No newline at end of file
+auction_transfer_unsold_object()
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/audittrail/__openerp__.py b/addons/audittrail/__openerp__.py
index 7d2a5955ac0..5bfd023ac39 100644
--- a/addons/audittrail/__openerp__.py
+++ b/addons/audittrail/__openerp__.py
@@ -23,7 +23,7 @@
{
'name': 'Audit Trail',
'version': '1.0',
- 'category': 'Hidden',
+ 'category': 'Tools',
'description': """
This module lets administrator track every user operation on all the objects of the system.
===========================================================================================
diff --git a/addons/audittrail/audittrail.py b/addons/audittrail/audittrail.py
index 80af2e7ea3a..302d6e146bd 100644
--- a/addons/audittrail/audittrail.py
+++ b/addons/audittrail/audittrail.py
@@ -43,22 +43,17 @@ class audittrail_rule(osv.osv):
"log_create": fields.boolean("Log Creates",help="Select this if you want to keep track of creation on any record of the object of this rule"),
"log_action": fields.boolean("Log Action",help="Select this if you want to keep track of actions on the object of this rule"),
"log_workflow": fields.boolean("Log Workflow",help="Select this if you want to keep track of workflow on any record of the object of this rule"),
- "state": fields.selection((("draft", "Draft"),
- ("subscribed", "Subscribed")),
- "State", required=True),
+ "state": fields.selection((("draft", "Draft"), ("subscribed", "Subscribed")), "State", required=True),
"action_id": fields.many2one('ir.actions.act_window', "Action ID"),
-
}
-
_defaults = {
- 'state': lambda *a: 'draft',
- 'log_create': lambda *a: 1,
- 'log_unlink': lambda *a: 1,
- 'log_write': lambda *a: 1,
+ 'state': 'draft',
+ 'log_create': 1,
+ 'log_unlink': 1,
+ 'log_write': 1,
}
-
_sql_constraints = [
- ('model_uniq', 'unique (object_id)', """There is a rule defined on this object\n You cannot define another one the same object!""")
+ ('model_uniq', 'unique (object_id)', """There is already a rule defined on this object\n You cannot define another: please edit the existing one.""")
]
__functions = {}
@@ -178,54 +173,33 @@ class audittrail_log_line(osv.osv):
class audittrail_objects_proxy(object_proxy):
""" Uses Object proxy for auditing changes on object of subscribed Rules"""
- def get_value_text(self, cr, uid, field_name, values, model, context=None):
+ def get_value_text(self, cr, uid, pool, resource_pool, method, field, value):
+ """
+ Gets textual values for the fields.
+ If the field is a many2one, it returns the name.
+ If it's a one2many or a many2many, it returns a list of name.
+ In other cases, it just returns the value.
+ :param cr: the current row, from the database cursor,
+ :param uid: the current user’s ID for security checks,
+ :param pool: current db's pooler object.
+ :param resource_pool: pooler object of the model which values are being changed.
+ :param field: for which the text value is to be returned.
+ :param value: value of the field.
+ :param recursive: True or False, True will repeat the process recursively
+ :return: string value or a list of values(for O2M/M2M)
"""
- Gets textual values for the fields
- e.g.: For field of type many2one it gives its name value instead of id
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param field_name: List of fields for text values
- @param values: Values for field to be converted into textual values
- @return: values: List of textual values for given fields
- """
- if not context:
- context = {}
- if field_name in('__last_update','id'):
- return values
- pool = pooler.get_pool(cr.dbname)
- field_pool = pool.get('ir.model.fields')
- model_pool = pool.get('ir.model')
- obj_pool = pool.get(model.model)
- if obj_pool._inherits:
- inherits_ids = model_pool.search(cr, uid, [('model', '=', obj_pool._inherits.keys()[0])])
- field_ids = field_pool.search(cr, uid, [('name', '=', field_name), ('model_id', 'in', (model.id, inherits_ids[0]))])
+ field_obj = (resource_pool._all_columns.get(field)).column
+ if field_obj._type in ('one2many','many2many'):
+ data = pool.get(field_obj._obj).name_get(cr, uid, value)
+ #return the modifications on x2many fields as a list of names
+ res = map(lambda x:x[1], data)
+ elif field_obj._type == 'many2one':
+ #return the modifications on a many2one field as its value returned by name_get()
+ res = value and value[1] or value
else:
- field_ids = field_pool.search(cr, uid, [('name', '=', field_name), ('model_id', '=', model.id)])
- field_id = field_ids and field_ids[0] or False
- assert field_id, _("'%s' field does not exist in '%s' model" %(field_name, model.model))
-
- field = field_pool.read(cr, uid, field_id)
- relation_model = field['relation']
- relation_model_pool = relation_model and pool.get(relation_model) or False
-
- if field['ttype'] == 'many2one':
- res = False
- relation_id = False
- if values and type(values) == tuple:
- relation_id = values[0]
- if relation_id and relation_model_pool:
- relation_model_object = relation_model_pool.read(cr, uid, relation_id, [relation_model_pool._rec_name])
- res = relation_model_object[relation_model_pool._rec_name]
- return res
-
- elif field['ttype'] in ('many2many','one2many'):
- res = []
- for relation_model_object in relation_model_pool.read(cr, uid, values, [relation_model_pool._rec_name]):
- res.append(relation_model_object[relation_model_pool._rec_name])
- return res
-
- return values
+ res = value
+ return res
def create_log_line(self, cr, uid, log_id, model, lines=[]):
"""
@@ -233,7 +207,7 @@ class audittrail_objects_proxy(object_proxy):
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
- @param model: Object who's values are being changed
+ @param model: Object which values are being changed
@param lines: List of values for line is to be created
"""
pool = pooler.get_pool(cr.dbname)
@@ -241,216 +215,273 @@ class audittrail_objects_proxy(object_proxy):
model_pool = pool.get('ir.model')
field_pool = pool.get('ir.model.fields')
log_line_pool = pool.get('audittrail.log.line')
- #start Loop
for line in lines:
- if line['name'] in('__last_update','id'):
- continue
+ field_obj = obj_pool._all_columns.get(line['name'])
+ assert field_obj, _("'%s' field does not exist in '%s' model" %(line['name'], model.model))
+ field_obj = field_obj.column
+ old_value = line.get('old_value', '')
+ new_value = line.get('new_value', '')
+ search_models = [model.id]
if obj_pool._inherits:
- inherits_ids = model_pool.search(cr, uid, [('model', '=', obj_pool._inherits.keys()[0])])
- field_ids = field_pool.search(cr, uid, [('name', '=', line['name']), ('model_id', 'in', (model.id, inherits_ids[0]))])
- else:
- field_ids = field_pool.search(cr, uid, [('name', '=', line['name']), ('model_id', '=', model.id)])
- field_id = field_ids and field_ids[0] or False
- assert field_id, _("'%s' field does not exist in '%s' model" %(line['name'], model.model))
-
- field = field_pool.read(cr, uid, field_id)
- old_value = 'old_value' in line and line['old_value'] or ''
- new_value = 'new_value' in line and line['new_value'] or ''
- old_value_text = 'old_value_text' in line and line['old_value_text'] or ''
- new_value_text = 'new_value_text' in line and line['new_value_text'] or ''
-
- if old_value_text == new_value_text:
- continue
- if field['ttype'] == 'many2one':
- if type(old_value) == tuple:
- old_value = old_value[0]
- if type(new_value) == tuple:
- new_value = new_value[0]
+ search_models += model_pool.search(cr, uid, [('model', 'in', obj_pool._inherits.keys())])
+ field_id = field_pool.search(cr, uid, [('name', '=', line['name']), ('model_id', 'in', search_models)])
+ if field_obj._type == 'many2one':
+ old_value = old_value and old_value[0] or old_value
+ new_value = new_value and new_value[0] or new_value
vals = {
"log_id": log_id,
- "field_id": field_id,
+ "field_id": field_id and field_id[0] or False,
"old_value": old_value,
"new_value": new_value,
- "old_value_text": old_value_text,
- "new_value_text": new_value_text,
- "field_description": field['field_description']
+ "old_value_text": line.get('old_value_text', ''),
+ "new_value_text": line.get('new_value_text', ''),
+ "field_description": field_obj.string
}
line_id = log_line_pool.create(cr, uid, vals)
- cr.commit()
- #End Loop
return True
- def log_fct(self, cr, uid, model, method, fct_src, *args):
+ def log_fct(self, cr, uid_orig, model, method, fct_src, *args):
"""
- Logging function: This function is performs logging oprations according to method
- @param db: the current database
- @param uid: the current user’s ID for security checks,
- @param object: Object who's values are being changed
- @param method: method to log: create, read, write, unlink
+ Logging function: This function is performing the logging operation
+ @param model: Object whose values are being changed
+ @param method: method to log: create, read, write, unlink, action or workflow action
@param fct_src: execute method of Object proxy
@return: Returns result as per method of Object proxy
"""
- uid_orig = uid
- uid = 1
- res2 = args
pool = pooler.get_pool(cr.dbname)
resource_pool = pool.get(model)
- log_pool = pool.get('audittrail.log')
model_pool = pool.get('ir.model')
-
- model_ids = model_pool.search(cr, uid, [('model', '=', model)])
+ model_ids = model_pool.search(cr, 1, [('model', '=', model)])
model_id = model_ids and model_ids[0] or False
assert model_id, _("'%s' Model does not exist..." %(model))
- model = model_pool.browse(cr, uid, model_id)
+ model = model_pool.browse(cr, 1, model_id)
- if method in ('create'):
- res_id = fct_src(cr, uid_orig, model.model, method, *args)
- resource = resource_pool.read(cr, uid, res_id, args[0].keys())
- vals = {
- "method": method,
- "object_id": model.id,
- "user_id": uid_orig,
- "res_id": resource['id'],
- }
- if 'id' in resource:
- del resource['id']
- log_id = log_pool.create(cr, uid, vals)
- lines = []
- for field in resource:
- line = {
- 'name': field,
- 'new_value': resource[field],
- 'new_value_text': self.get_value_text(cr, uid, field, resource[field], model)
- }
- lines.append(line)
- self.create_log_line(cr, uid, log_id, model, lines)
+ # fields to log. currently only used by log on read()
+ field_list = []
+ old_values = new_values = {}
- return res_id
-
- elif method in ('read'):
- res_ids = args[0]
- old_values = {}
+ if method == 'create':
res = fct_src(cr, uid_orig, model.model, method, *args)
- if type(res) == list:
- for v in res:
- old_values[v['id']] = v
- else:
- old_values[res['id']] = res
- for res_id in old_values:
- vals = {
- "method": method,
- "object_id": model.id,
- "user_id": uid_orig,
- "res_id": res_id,
-
- }
- log_id = log_pool.create(cr, uid, vals)
- lines = []
- for field in old_values[res_id]:
- line = {
- 'name': field,
- 'old_value': old_values[res_id][field],
- 'old_value_text': self.get_value_text(cr, uid, field, old_values[res_id][field], model)
- }
- lines.append(line)
-
- self.create_log_line(cr, uid, log_id, model, lines)
- return res
-
- elif method in ('unlink'):
- res_ids = args[0]
- old_values = {}
- for res_id in res_ids:
- old_values[res_id] = resource_pool.read(cr, uid, res_id)
-
- for res_id in res_ids:
- vals = {
- "method": method,
- "object_id": model.id,
- "user_id": uid_orig,
- "res_id": res_id,
-
- }
- log_id = log_pool.create(cr, uid, vals)
- lines = []
- for field in old_values[res_id]:
- if field in ('id'):
- continue
- line = {
- 'name': field,
- 'old_value': old_values[res_id][field],
- 'old_value_text': self.get_value_text(cr, uid, field, old_values[res_id][field], model)
- }
- lines.append(line)
-
- self.create_log_line(cr, uid, log_id, model, lines)
+ if res:
+ res_ids = [res]
+ new_values = self.get_data(cr, uid_orig, pool, res_ids, model, method)
+ elif method == 'read':
res = fct_src(cr, uid_orig, model.model, method, *args)
- return res
- else:
+ # build the res_ids and the old_values dict. Here we don't use get_data() to
+ # avoid performing an additional read()
+ res_ids = []
+ for record in res:
+ res_ids.append(record['id'])
+ old_values[(model.id, record['id'])] = {'value': record, 'text': record}
+ # log only the fields read
+ field_list = args[1]
+ elif method == 'unlink':
+ res_ids = args[0]
+ old_values = self.get_data(cr, uid_orig, pool, res_ids, model, method)
+ res = fct_src(cr, uid_orig, model.model, method, *args)
+ else: # method is write, action or workflow action
res_ids = []
- res = True
if args:
res_ids = args[0]
- old_values = {}
- fields = []
- if len(args)>1 and type(args[1]) == dict:
- fields = args[1].keys()
- if type(res_ids) in (long, int):
+ if isinstance(res_ids, (long, int)):
res_ids = [res_ids]
if res_ids:
- for resource in resource_pool.read(cr, uid, res_ids):
- resource_id = resource['id']
- if 'id' in resource:
- del resource['id']
- old_values_text = {}
- old_value = {}
- for field in resource.keys():
- old_value[field] = resource[field]
- old_values_text[field] = self.get_value_text(cr, uid, field, resource[field], model)
- old_values[resource_id] = {'text':old_values_text, 'value': old_value}
-
+ # store the old values into a dictionary
+ old_values = self.get_data(cr, uid_orig, pool, res_ids, model, method)
+ # process the original function, workflow trigger...
res = fct_src(cr, uid_orig, model.model, method, *args)
-
+ if method == 'copy':
+ res_ids = [res]
if res_ids:
- for resource in resource_pool.read(cr, uid, res_ids):
- resource_id = resource['id']
- if 'id' in resource:
- del resource['id']
- vals = {
- "method": method,
- "object_id": model.id,
- "user_id": uid_orig,
- "res_id": resource_id,
- }
+ # check the new values and store them into a dictionary
+ new_values = self.get_data(cr, uid_orig, pool, res_ids, model, method)
+ # compare the old and new values and create audittrail log if needed
+ self.process_data(cr, uid_orig, pool, res_ids, model, method, old_values, new_values, field_list)
+ return res
+ def get_data(self, cr, uid, pool, res_ids, model, method):
+ """
+ This function simply read all the fields of the given res_ids, and also recurisvely on
+ all records of a x2m fields read that need to be logged. Then it returns the result in
+ convenient structure that will be used as comparison basis.
- log_id = log_pool.create(cr, uid, vals)
- lines = []
- for field in resource.keys():
- line = {
- 'name': field,
- 'new_value': resource[field],
- 'old_value': old_values[resource_id]['value'][field],
- 'new_value_text': self.get_value_text(cr, uid, field, resource[field], model),
- 'old_value_text': old_values[resource_id]['text'][field]
- }
- lines.append(line)
+ :param cr: the current row, from the database cursor,
+ :param uid: the current user’s ID. This parameter is currently not used as every
+ operation to get data is made as super admin. Though, it could be usefull later.
+ :param pool: current db's pooler object.
+ :param res_ids: Id's of resource to be logged/compared.
+ :param model: Object whose values are being changed
+ :param method: method to log: create, read, unlink, write, actions, workflow actions
+ :return: dict mapping a tuple (model_id, resource_id) with its value and textual value
+ { (model_id, resource_id): { 'value': ...
+ 'textual_value': ...
+ },
+ }
+ """
+ data = {}
+ resource_pool = pool.get(model.model)
+ # read all the fields of the given resources in super admin mode
+ for resource in resource_pool.read(cr, 1, res_ids):
+ values = {}
+ values_text = {}
+ resource_id = resource['id']
+ # loop on each field on the res_ids we just have read
+ for field in resource:
+ if field in ('__last_update', 'id'):
+ continue
+ values[field] = resource[field]
+ # get the textual value of that field for this record
+ values_text[field] = self.get_value_text(cr, 1, pool, resource_pool, method, field, resource[field])
- self.create_log_line(cr, uid, log_id, model, lines)
- return res
+ field_obj = resource_pool._all_columns.get(field).column
+ if field_obj._type in ('one2many','many2many'):
+ # check if an audittrail rule apply in super admin mode
+ if self.check_rules(cr, 1, field_obj._obj, method):
+ # check if the model associated to a *2m field exists, in super admin mode
+ x2m_model_ids = pool.get('ir.model').search(cr, 1, [('model', '=', field_obj._obj)])
+ x2m_model_id = x2m_model_ids and x2m_model_ids[0] or False
+ assert x2m_model_id, _("'%s' Model does not exist..." %(field_obj._obj))
+ x2m_model = pool.get('ir.model').browse(cr, 1, x2m_model_id)
+ #recursive call on x2m fields that need to be checked too
+ data.update(self.get_data(cr, 1, pool, resource[field], x2m_model, method))
+ data[(model.id, resource_id)] = {'text':values_text, 'value': values}
+ return data
+
+ def prepare_audittrail_log_line(self, cr, uid, pool, model, resource_id, method, old_values, new_values, field_list=[]):
+ """
+ This function compares the old data (i.e before the method was executed) and the new data
+ (after the method was executed) and returns a structure with all the needed information to
+ log those differences.
+
+ :param cr: the current row, from the database cursor,
+ :param uid: the current user’s ID. This parameter is currently not used as every
+ operation to get data is made as super admin. Though, it could be usefull later.
+ :param pool: current db's pooler object.
+ :param model: model object which values are being changed
+ :param resource_id: ID of record to which values are being changed
+ :param method: method to log: create, read, unlink, write, actions, workflow actions
+ :param old_values: dict of values read before execution of the method
+ :param new_values: dict of values read after execution of the method
+ :param field_list: optional argument containing the list of fields to log. Currently only
+ used when performing a read, it could be usefull later on if we want to log the write
+ on specific fields only.
+
+ :return: dictionary with
+ * keys: tuples build as ID of model object to log and ID of resource to log
+ * values: list of all the changes in field values for this couple (model, resource)
+ return {
+ (model.id, resource_id): []
+ }
+
+ The reason why the structure returned is build as above is because when modifying an existing
+ record (res.partner, for example), we may have to log a change done in a x2many field (on
+ res.partner.address, for example)
+ """
+ key = (model.id, resource_id)
+ lines = {
+ key: []
+ }
+ # loop on all the fields
+ for field_name, field_definition in pool.get(model.model)._all_columns.items():
+ #if the field_list param is given, skip all the fields not in that list
+ if field_list and field_name not in field_list:
+ continue
+ field_obj = field_definition.column
+ if field_obj._type in ('one2many','many2many'):
+ # checking if an audittrail rule apply in super admin mode
+ if self.check_rules(cr, 1, field_obj._obj, method):
+ # checking if the model associated to a *2m field exists, in super admin mode
+ x2m_model_ids = pool.get('ir.model').search(cr, 1, [('model', '=', field_obj._obj)])
+ x2m_model_id = x2m_model_ids and x2m_model_ids[0] or False
+ assert x2m_model_id, _("'%s' Model does not exist..." %(field_obj._obj))
+ x2m_model = pool.get('ir.model').browse(cr, 1, x2m_model_id)
+ # the resource_ids that need to be checked are the sum of both old and previous values (because we
+ # need to log also creation or deletion in those lists).
+ x2m_old_values_ids = old_values.get(key, {'value': {}})['value'].get(field_name, [])
+ x2m_new_values_ids = new_values.get(key, {'value': {}})['value'].get(field_name, [])
+ # We use list(set(...)) to remove duplicates.
+ res_ids = list(set(x2m_old_values_ids + x2m_new_values_ids))
+ for res_id in res_ids:
+ lines.update(self.prepare_audittrail_log_line(cr, 1, pool, x2m_model, res_id, method, old_values, new_values, field_list))
+ # if the value value is different than the old value: record the change
+ if key not in old_values or key not in new_values or old_values[key]['value'][field_name] != new_values[key]['value'][field_name]:
+ data = {
+ 'name': field_name,
+ 'new_value': key in new_values and new_values[key]['value'].get(field_name),
+ 'old_value': key in old_values and old_values[key]['value'].get(field_name),
+ 'new_value_text': key in new_values and new_values[key]['text'].get(field_name),
+ 'old_value_text': key in old_values and old_values[key]['text'].get(field_name)
+ }
+ lines[key].append(data)
+ return lines
+
+ def process_data(self, cr, uid, pool, res_ids, model, method, old_values={}, new_values={}, field_list=[]):
+ """
+ This function processes and iterates recursively to log the difference between the old
+ data (i.e before the method was executed) and the new data and creates audittrail log
+ accordingly.
+
+ :param cr: the current row, from the database cursor,
+ :param uid: the current user’s ID,
+ :param pool: current db's pooler object.
+ :param res_ids: Id's of resource to be logged/compared.
+ :param model: model object which values are being changed
+ :param method: method to log: create, read, unlink, write, actions, workflow actions
+ :param old_values: dict of values read before execution of the method
+ :param new_values: dict of values read after execution of the method
+ :param field_list: optional argument containing the list of fields to log. Currently only
+ used when performing a read, it could be usefull later on if we want to log the write
+ on specific fields only.
+ :return: True
+ """
+ # loop on all the given ids
+ for res_id in res_ids:
+ # compare old and new values and get audittrail log lines accordingly
+ lines = self.prepare_audittrail_log_line(cr, uid, pool, model, res_id, method, old_values, new_values, field_list)
+
+ # if at least one modification has been found
+ for model_id, resource_id in lines:
+ vals = {
+ 'method': method,
+ 'object_id': model_id,
+ 'user_id': uid,
+ 'res_id': resource_id,
+ }
+ if (model_id, resource_id) not in old_values and method not in ('copy', 'read'):
+ # the resource was not existing so we are forcing the method to 'create'
+ # (because it could also come with the value 'write' if we are creating
+ # new record through a one2many field)
+ vals.update({'method': 'create'})
+ if (model_id, resource_id) not in new_values and method not in ('copy', 'read'):
+ # the resource is not existing anymore so we are forcing the method to 'unlink'
+ # (because it could also come with the value 'write' if we are deleting the
+ # record through a one2many field)
+ vals.update({'method': 'unlink'})
+ # create the audittrail log in super admin mode, only if a change has been detected
+ if lines[(model_id, resource_id)]:
+ log_id = pool.get('audittrail.log').create(cr, 1, vals)
+ model = pool.get('ir.model').browse(cr, uid, model_id)
+ self.create_log_line(cr, 1, log_id, model, lines[(model_id, resource_id)])
return True
def check_rules(self, cr, uid, model, method):
+ """
+ Checks if auditrails is installed for that db and then if one rule match
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID,
+ @param model: value of _name of the object which values are being changed
+ @param method: method to log: create, read, unlink,write,actions,workflow actions
+ @return: True or False
+ """
pool = pooler.get_pool(cr.dbname)
- # Check if auditrails is installed for that db and then if one rule match
if 'audittrail.rule' in pool.models:
model_ids = pool.get('ir.model').search(cr, 1, [('model', '=', model)])
model_id = model_ids and model_ids[0] or False
if model_id:
rule_ids = pool.get('audittrail.rule').search(cr, 1, [('object_id', '=', model_id), ('state', '=', 'subscribed')])
for rule in pool.get('audittrail.rule').read(cr, 1, rule_ids, ['user_id','log_read','log_write','log_create','log_unlink','log_action','log_workflow']):
- if len(rule['user_id'])==0 or uid in rule['user_id']:
+ if len(rule['user_id']) == 0 or uid in rule['user_id']:
if rule.get('log_'+method,0):
return True
elif method not in ('default_get','read','fields_view_get','fields_get','search','search_count','name_search','name_get','get','request_get', 'get_sc', 'unlink', 'write', 'create'):
@@ -460,18 +491,14 @@ class audittrail_objects_proxy(object_proxy):
def execute_cr(self, cr, uid, model, method, *args, **kw):
fct_src = super(audittrail_objects_proxy, self).execute_cr
if self.check_rules(cr,uid,model,method):
- res = self.log_fct(cr, uid, model, method, fct_src, *args)
- else:
- res = fct_src(cr, uid, model, method, *args)
- return res
+ return self.log_fct(cr, uid, model, method, fct_src, *args)
+ return fct_src(cr, uid, model, method, *args)
def exec_workflow_cr(self, cr, uid, model, method, *args, **argv):
fct_src = super(audittrail_objects_proxy, self).exec_workflow_cr
if self.check_rules(cr,uid,model,'workflow'):
- res = self.log_fct(cr, uid, model, method, fct_src, *args)
- else:
- res = fct_src(cr, uid, model, method, *args)
- return res
+ return self.log_fct(cr, uid, model, method, fct_src, *args)
+ return fct_src(cr, uid, model, method, *args)
audittrail_objects_proxy()
diff --git a/addons/audittrail/i18n/hr.po b/addons/audittrail/i18n/hr.po
index ce60dcea9cc..9d9a378c7fe 100644
--- a/addons/audittrail/i18n/hr.po
+++ b/addons/audittrail/i18n/hr.po
@@ -7,19 +7,19 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
-"PO-Revision-Date: 2009-09-08 13:23+0000\n"
+"PO-Revision-Date: 2011-12-08 17:09+0000\n"
"Last-Translator: Ivica Perić \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 05:32+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-09 04:45+0000\n"
+"X-Generator: Launchpad (build 14450)\n"
#. module: audittrail
#: model:ir.module.module,shortdesc:audittrail.module_meta_information
msgid "Audit Trail"
-msgstr ""
+msgstr "Audit Trail"
#. module: audittrail
#: code:addons/audittrail/audittrail.py:81
@@ -30,18 +30,18 @@ msgstr ""
#. module: audittrail
#: field:audittrail.log.line,log_id:0
msgid "Log"
-msgstr "Dnevnik izmjena"
+msgstr "Zapisnik"
#. module: audittrail
#: view:audittrail.rule:0
#: selection:audittrail.rule,state:0
msgid "Subscribed"
-msgstr "Pretplaćeno"
+msgstr "Pretplaćen"
#. module: audittrail
#: model:ir.model,name:audittrail.model_audittrail_rule
msgid "Audittrail Rule"
-msgstr ""
+msgstr "Audittrail Pravila"
#. module: audittrail
#: view:audittrail.view.log:0
@@ -54,7 +54,7 @@ msgstr "Dnevnik izmjena"
#: view:audittrail.log:0
#: view:audittrail.rule:0
msgid "Group By..."
-msgstr ""
+msgstr "Grupiraj po..."
#. module: audittrail
#: view:audittrail.rule:0
@@ -65,7 +65,7 @@ msgstr "Stanje"
#. module: audittrail
#: view:audittrail.rule:0
msgid "_Subscribe"
-msgstr ""
+msgstr "_Pretplati"
#. module: audittrail
#: view:audittrail.rule:0
@@ -89,6 +89,8 @@ msgid ""
"Select this if you want to keep track of read/open on any record of the "
"object of this rule"
msgstr ""
+"Select this if you want to keep track of read/open on any record of the "
+"object of this rule"
#. module: audittrail
#: field:audittrail.log,method:0
@@ -98,22 +100,22 @@ msgstr "Metoda"
#. module: audittrail
#: field:audittrail.view.log,from:0
msgid "Log From"
-msgstr ""
+msgstr "Logiraj od"
#. module: audittrail
#: field:audittrail.log.line,log:0
msgid "Log ID"
-msgstr ""
+msgstr "Log ID"
#. module: audittrail
#: field:audittrail.log,res_id:0
msgid "Resource Id"
-msgstr ""
+msgstr "Id resursa"
#. module: audittrail
#: help:audittrail.rule,user_id:0
msgid "if User is not added then it will applicable for all users"
-msgstr ""
+msgstr "if User is not added then it will applicable for all users"
#. module: audittrail
#: help:audittrail.rule,log_workflow:0
@@ -121,6 +123,8 @@ msgid ""
"Select this if you want to keep track of workflow on any record of the "
"object of this rule"
msgstr ""
+"Odaberite ovu opciju ukoliko želite pratiti tijek rada na bilo koji zapis "
+"predmeta iz ovog pravila"
#. module: audittrail
#: field:audittrail.rule,user_id:0
@@ -130,14 +134,14 @@ msgstr "Korisnici"
#. module: audittrail
#: view:audittrail.log:0
msgid "Log Lines"
-msgstr ""
+msgstr "Log Lines"
#. module: audittrail
#: view:audittrail.log:0
#: field:audittrail.log,object_id:0
#: field:audittrail.rule,object_id:0
msgid "Object"
-msgstr "Objekt"
+msgstr "Object"
#. module: audittrail
#: view:audittrail.rule:0
@@ -147,7 +151,7 @@ msgstr "Pravilo praćenja promjena"
#. module: audittrail
#: field:audittrail.view.log,to:0
msgid "Log To"
-msgstr ""
+msgstr "Log To"
#. module: audittrail
#: view:audittrail.log:0
@@ -157,13 +161,13 @@ msgstr "Tekst nove vrijednosti: "
#. module: audittrail
#: view:audittrail.rule:0
msgid "Search Audittrail Rule"
-msgstr ""
+msgstr "Search Audittrail Rule"
#. module: audittrail
#: model:ir.actions.act_window,name:audittrail.action_audittrail_rule_tree
#: model:ir.ui.menu,name:audittrail.menu_action_audittrail_rule_tree
msgid "Audit Rules"
-msgstr ""
+msgstr "Pravila revizije"
#. module: audittrail
#: view:audittrail.log:0
@@ -173,7 +177,7 @@ msgstr "Stara vrijednost : "
#. module: audittrail
#: field:audittrail.log,name:0
msgid "Resource Name"
-msgstr ""
+msgstr "Resource Name"
#. module: audittrail
#: view:audittrail.log:0
@@ -187,16 +191,18 @@ msgid ""
"Select this if you want to keep track of modification on any record of the "
"object of this rule"
msgstr ""
+"Select this if you want to keep track of modification on any record of the "
+"object of this rule"
#. module: audittrail
#: field:audittrail.rule,log_create:0
msgid "Log Creates"
-msgstr ""
+msgstr "Log Creates"
#. module: audittrail
#: help:audittrail.rule,object_id:0
msgid "Select object for which you want to generate log."
-msgstr ""
+msgstr "Select object for which you want to generate log."
#. module: audittrail
#: view:audittrail.log:0
@@ -206,7 +212,7 @@ msgstr "Tekst stare vrijednosti : "
#. module: audittrail
#: field:audittrail.rule,log_workflow:0
msgid "Log Workflow"
-msgstr ""
+msgstr "Log Workflow"
#. module: audittrail
#: model:ir.module.module,description:audittrail.module_meta_information
@@ -224,7 +230,7 @@ msgstr ""
#. module: audittrail
#: field:audittrail.rule,log_read:0
msgid "Log Reads"
-msgstr ""
+msgstr "Log Reads"
#. module: audittrail
#: code:addons/audittrail/audittrail.py:82
@@ -235,7 +241,7 @@ msgstr ""
#. module: audittrail
#: field:audittrail.log,line_ids:0
msgid "Log lines"
-msgstr "Retci dnevnika"
+msgstr "Reci dnevnika"
#. module: audittrail
#: field:audittrail.log.line,field_id:0
@@ -253,6 +259,8 @@ msgid ""
"Select this if you want to keep track of deletion on any record of the "
"object of this rule"
msgstr ""
+"Select this if you want to keep track of deletion on any record of the "
+"object of this rule"
#. module: audittrail
#: view:audittrail.log:0
@@ -263,47 +271,47 @@ msgstr "Korisnik"
#. module: audittrail
#: field:audittrail.rule,action_id:0
msgid "Action ID"
-msgstr ""
+msgstr "Action ID"
#. module: audittrail
#: view:audittrail.rule:0
msgid "Users (if User is not added then it will applicable for all users)"
-msgstr ""
+msgstr "Korisnici (ako se ne upišu - vrijedi za sve korisnike)"
#. module: audittrail
#: view:audittrail.rule:0
msgid "UnSubscribe"
-msgstr ""
+msgstr "UnSubscribe"
#. module: audittrail
#: field:audittrail.rule,log_unlink:0
msgid "Log Deletes"
-msgstr ""
+msgstr "Log Deletes"
#. module: audittrail
#: field:audittrail.log.line,field_description:0
msgid "Field Description"
-msgstr ""
+msgstr "Field Description"
#. module: audittrail
#: view:audittrail.log:0
msgid "Search Audittrail Log"
-msgstr ""
+msgstr "Search Audittrail Log"
#. module: audittrail
#: field:audittrail.rule,log_write:0
msgid "Log Writes"
-msgstr ""
+msgstr "Log Writes"
#. module: audittrail
#: view:audittrail.view.log:0
msgid "Open Logs"
-msgstr ""
+msgstr "Open Logs"
#. module: audittrail
#: field:audittrail.log.line,new_value_text:0
msgid "New value Text"
-msgstr ""
+msgstr "New value Text"
#. module: audittrail
#: field:audittrail.rule,name:0
@@ -313,28 +321,29 @@ msgstr "Naziv pravila"
#. module: audittrail
#: field:audittrail.log.line,new_value:0
msgid "New Value"
-msgstr ""
+msgstr "New Value"
#. module: audittrail
#: view:audittrail.log:0
msgid "AuditTrail Logs"
-msgstr ""
+msgstr "AuditTrail Logs"
#. module: audittrail
#: model:ir.model,name:audittrail.model_audittrail_log
msgid "Audittrail Log"
-msgstr ""
+msgstr "Audittrail Log"
#. module: audittrail
#: help:audittrail.rule,log_action:0
msgid ""
"Select this if you want to keep track of actions on the object of this rule"
msgstr ""
+"Select this if you want to keep track of actions on the object of this rule"
#. module: audittrail
#: view:audittrail.log:0
msgid "New Value : "
-msgstr ""
+msgstr "Nova vrijednost : "
#. module: audittrail
#: sql_constraint:audittrail.rule:0
@@ -351,22 +360,22 @@ msgstr "Tekst stare vrijednosti"
#. module: audittrail
#: view:audittrail.view.log:0
msgid "Cancel"
-msgstr "Otkaži"
+msgstr "Odustani"
#. module: audittrail
#: model:ir.model,name:audittrail.model_audittrail_view_log
msgid "View Log"
-msgstr ""
+msgstr "Pogledaj Log"
#. module: audittrail
#: model:ir.model,name:audittrail.model_audittrail_log_line
msgid "Log Line"
-msgstr ""
+msgstr "Redak Prijave"
#. module: audittrail
#: field:audittrail.rule,log_action:0
msgid "Log Action"
-msgstr ""
+msgstr "Log Action"
#. module: audittrail
#: help:audittrail.rule,log_create:0
@@ -374,6 +383,8 @@ msgid ""
"Select this if you want to keep track of creation on any record of the "
"object of this rule"
msgstr ""
+"Select this if you want to keep track of creation on any record of the "
+"object of this rule"
#~ msgid "Name"
#~ msgstr "Naziv"
diff --git a/addons/audittrail/security/ir.model.access.csv b/addons/audittrail/security/ir.model.access.csv
index 877cf622ad4..25bba6a00b1 100644
--- a/addons/audittrail/security/ir.model.access.csv
+++ b/addons/audittrail/security/ir.model.access.csv
@@ -1,4 +1,4 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_audittrail_rule_all_users","audittrail rule all","model_audittrail_rule","base.group_user",1,0,0,0
-"access_audittrail_log_all_users","audittrail log all","model_audittrail_log","base.group_user",1,0,1,0
-"access_audittrail_log_line_all_users","audittrail log line all","model_audittrail_log_line","base.group_user",1,0,1,0
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_audittrail_rule_all_users,audittrail rule all,model_audittrail_rule,base.group_user,1,0,0,0
+access_audittrail_log_all_users,audittrail log all,model_audittrail_log,base.group_user,1,0,1,0
+access_audittrail_log_line_all_users,audittrail log line all,model_audittrail_log_line,base.group_user,1,0,1,0
diff --git a/addons/audittrail/wizard/audittrail_view_log.py b/addons/audittrail/wizard/audittrail_view_log.py
index 65165c1d2d8..76284e75511 100644
--- a/addons/audittrail/wizard/audittrail_view_log.py
+++ b/addons/audittrail/wizard/audittrail_view_log.py
@@ -62,3 +62,5 @@ class audittrail_view_log(osv.osv_memory):
return result
audittrail_view_log()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auth_openid/__openerp__.py b/addons/auth_openid/__openerp__.py
index 040a96a3995..6fa802b94e3 100644
--- a/addons/auth_openid/__openerp__.py
+++ b/addons/auth_openid/__openerp__.py
@@ -21,9 +21,9 @@
{
- 'name': 'OpenID',
+ 'name': 'OpenID Authentification',
'version': '2.0',
- 'category': 'Hidden',
+ 'category': 'Tools',
'description': """Allow users to login through OpenID.""",
'author': 'OpenERP s.a.',
'maintainer': 'OpenERP s.a.',
diff --git a/addons/auth_openid/controllers/__init__.py b/addons/auth_openid/controllers/__init__.py
index 2d3be24431f..c5f359681b9 100644
--- a/addons/auth_openid/controllers/__init__.py
+++ b/addons/auth_openid/controllers/__init__.py
@@ -18,3 +18,5 @@
#
##############################################################################
import main
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auth_openid/controllers/main.py b/addons/auth_openid/controllers/main.py
index 78b8609e765..0c1274ba05a 100644
--- a/addons/auth_openid/controllers/main.py
+++ b/addons/auth_openid/controllers/main.py
@@ -223,3 +223,5 @@ class OpenIDController(openerpweb.Controller):
session = getattr(req.session, 'openid_session', {})
return {'status': session.get('status'), 'message': session.get('message')}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auth_openid/res_users.py b/addons/auth_openid/res_users.py
index 3278184474c..c9b5bfc7b26 100644
--- a/addons/auth_openid/res_users.py
+++ b/addons/auth_openid/res_users.py
@@ -92,3 +92,5 @@ class res_users(osv.osv):
res_users()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auth_openid/utils.py b/addons/auth_openid/utils.py
index 2761f3d0e1d..444b5eeaa05 100644
--- a/addons/auth_openid/utils.py
+++ b/addons/auth_openid/utils.py
@@ -44,3 +44,5 @@ def cursor(db):
finally:
cr.close()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_action_rule/__openerp__.py b/addons/base_action_rule/__openerp__.py
index 18af8d09459..56da3350347 100644
--- a/addons/base_action_rule/__openerp__.py
+++ b/addons/base_action_rule/__openerp__.py
@@ -20,9 +20,9 @@
##############################################################################
{
- 'name': 'Action Rule',
+ 'name': 'Automated Action Rules',
'version': '1.0',
- 'category': 'Hidden',
+ 'category': 'Sales Management',
'description': """
This module allows to implement action rules for any object.
============================================================
diff --git a/addons/base_action_rule/base_action_rule.py b/addons/base_action_rule/base_action_rule.py
index 4b3fe0a167d..2d239adada2 100644
--- a/addons/base_action_rule/base_action_rule.py
+++ b/addons/base_action_rule/base_action_rule.py
@@ -147,7 +147,7 @@ the rule to mark CC(mail to any other person defined in actions)."),
res['value'] = {'filter_id':False}
return res
- def pre_action(self, cr, uid, ids, model, context=None):
+ def post_action(self, cr, uid, ids, model, context=None):
# Searching for action rules
cr.execute("SELECT model.model, rule.id FROM base_action_rule rule \
LEFT JOIN ir_model model on (model.id = rule.model_id) \
@@ -156,7 +156,7 @@ the rule to mark CC(mail to any other person defined in actions)."),
# Check if any rule matching with current object
for obj_name, rule_id in res:
if not (model == obj_name):
- continue
+ continue # TODO add this condition in the WHERE clause above.
else:
obj = self.pool.get(obj_name)
# If the rule doesn't involve a time condition, run it immediately
@@ -166,31 +166,36 @@ the rule to mark CC(mail to any other person defined in actions)."),
return True
def _create(self, old_create, model, context=None):
- if context is None:
- context = {}
- def make_call_old(cr, uid, vals, context=context):
+ """
+ Return a wrapper around `old_create` calling both `old_create` and
+ `post_action`, in that order.
+ """
+ def wrapper(cr, uid, vals, context=context):
new_id = old_create(cr, uid, vals, context=context)
if not context.get('action'):
- self.pre_action(cr, uid, [new_id], model, context=context)
+ self.post_action(cr, uid, [new_id], model, context=context)
return new_id
- return make_call_old
-
+ return wrapper
+
def _write(self, old_write, model, context=None):
- if context is None:
- context = {}
- def make_call_old(cr, uid, ids, vals, context=context):
- if context is None:
- context = {}
+ """
+ Return a wrapper around `old_write` calling both `old_write` and
+ `post_action`, in that order.
+ """
+ def wrapper(cr, uid, ids, vals, context=context):
if isinstance(ids, (str, int, long)):
ids = [ids]
+ old_write(cr, uid, ids, vals, context=context)
if not context.get('action'):
- self.pre_action(cr, uid, ids, model, context=context)
- return old_write(cr, uid, ids, vals, context=context)
- return make_call_old
+ self.post_action(cr, uid, ids, model, context=context)
+ return True
+ return wrapper
def _register_hook(self, cr, uid, ids, context=None):
- if context is None:
- context = {}
+ """
+ Wrap every `create` and `write` methods of the models specified by
+ the rules (given by `ids`).
+ """
for action_rule in self.browse(cr, uid, ids, context=context):
model = action_rule.model_id.model
obj_pool = self.pool.get(model)
@@ -200,15 +205,16 @@ the rule to mark CC(mail to any other person defined in actions)."),
obj_pool.base_action_ruled = True
return True
+
def create(self, cr, uid, vals, context=None):
res_id = super(base_action_rule, self).create(cr, uid, vals, context=context)
self._register_hook(cr, uid, [res_id], context=context)
return res_id
def write(self, cr, uid, ids, vals, context=None):
- res = super(base_action_rule, self).write(cr, uid, ids, vals, context=context)
+ super(base_action_rule, self).write(cr, uid, ids, vals, context=context)
self._register_hook(cr, uid, ids, context=context)
- return res
+ return True
def _check(self, cr, uid, automatic=False, use_new_cursor=False, \
context=None):
diff --git a/addons/base_action_rule/i18n/pt.po b/addons/base_action_rule/i18n/pt.po
index 106ba16af9d..d894a6b799b 100644
--- a/addons/base_action_rule/i18n/pt.po
+++ b/addons/base_action_rule/i18n/pt.po
@@ -8,25 +8,26 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
-"PO-Revision-Date: 2010-12-15 20:31+0000\n"
-"Last-Translator: OpenERP Administrators \n"
+"PO-Revision-Date: 2011-11-23 12:16+0000\n"
+"Last-Translator: Paulino Ascenção \n"
"Language-Team: Portuguese \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 05:51+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-11-24 05:00+0000\n"
+"X-Generator: Launchpad (build 14336)\n"
#. module: base_action_rule
#: help:base.action.rule,act_mail_to_user:0
msgid ""
"Check this if you want the rule to send an email to the responsible person."
msgstr ""
+"Assinale aqui se pretender que a regra envie um e-mail à pessoa responsável."
#. module: base_action_rule
#: field:base.action.rule,act_remind_partner:0
msgid "Remind Partner"
-msgstr "Alertar parceiro"
+msgstr "Relembrar parceiro"
#. module: base_action_rule
#: field:base.action.rule,trg_partner_categ_id:0
@@ -259,7 +260,7 @@ msgstr "Chamar o método do objeto"
#. module: base_action_rule
#: field:base.action.rule,act_email_to:0
msgid "Email To"
-msgstr ""
+msgstr "E-mail para"
#. module: base_action_rule
#: help:base.action.rule,act_mail_to_watchers:0
@@ -369,12 +370,12 @@ msgstr "Erro: A mensagem não está bem formatada"
#. module: base_action_rule
#: view:base.action.rule:0
msgid "Email Actions"
-msgstr ""
+msgstr "Ações do e-mail"
#. module: base_action_rule
#: view:base.action.rule:0
msgid "Email Information"
-msgstr ""
+msgstr "Informação sobre o e-mail"
#. module: base_action_rule
#: model:ir.model,name:base_action_rule.model_base_action_rule
@@ -432,7 +433,7 @@ msgstr ""
#. module: base_action_rule
#: field:base.action.rule,act_email_cc:0
msgid "Add Watchers (Cc)"
-msgstr ""
+msgstr "Acdicionar observadores (CC)"
#. module: base_action_rule
#: view:base.action.rule:0
diff --git a/addons/base_action_rule/security/ir.model.access.csv b/addons/base_action_rule/security/ir.model.access.csv
index 4d2e612b384..92d3d55649f 100644
--- a/addons/base_action_rule/security/ir.model.access.csv
+++ b/addons/base_action_rule/security/ir.model.access.csv
@@ -1,3 +1,3 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_base_action_rule","base.action.rule","model_base_action_rule",,1,0,0,0
-"access_base_action_rule_config","base.action.rule config","model_base_action_rule",base.group_system,1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_base_action_rule,base.action.rule,model_base_action_rule,,1,0,0,0
+access_base_action_rule_config,base.action.rule config,model_base_action_rule,base.group_system,1,1,1,1
diff --git a/addons/base_calendar/__openerp__.py b/addons/base_calendar/__openerp__.py
index 0dd72a17038..c6ab9c4628e 100644
--- a/addons/base_calendar/__openerp__.py
+++ b/addons/base_calendar/__openerp__.py
@@ -20,7 +20,7 @@
##############################################################################
{
- "name" : "Basic Calendar Functionality",
+ "name" : "Calendar Layer",
"version" : "1.0",
"depends" : ["base", "mail"],
'complexity': "easy",
@@ -32,9 +32,12 @@ It supports:
- Calendar of events
- Alerts (create requests)
- Recurring events
- - Invitations to people""",
+ - Invitations to people
+
+If you need to manage your meetings, you should install the CRM module.
+ """,
"author" : "OpenERP SA",
- 'category': 'Hidden',
+ 'category': 'Hidden/Dependency',
'website': 'http://www.openerp.com',
"init_xml" : [
'base_calendar_data.xml'
diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py
index 45624a280f1..9ce32429e5b 100644
--- a/addons/base_calendar/base_calendar.py
+++ b/addons/base_calendar/base_calendar.py
@@ -1009,10 +1009,19 @@ class calendar_event(osv.osv):
else:
result[event] = ""
return result
-
-
-
-
+
+ def _rrule_write(self, obj, cr, uid, ids, field_name, field_value, args, context=None):
+ data = self._get_empty_rrule_data()
+ if field_value:
+ data['recurrency'] = True
+ for event in self.browse(cr, uid, ids, context=context):
+ rdate = rule_date or event.date
+ update_data = self._parse_rrule(field_value, dict(data), rdate)
+ data.update(update_data)
+ super(calendar_event, obj).write(cr, uid, ids, data, context=context)
+ return True
+
+
_columns = {
'id': fields.integer('ID', readonly=True),
'sequence': fields.integer('Sequence'),
@@ -1023,7 +1032,7 @@ class calendar_event(osv.osv):
'duration': fields.float('Duration', states={'done': [('readonly', True)]}),
'description': fields.text('Description', states={'done': [('readonly', True)]}),
'class': fields.selection([('public', 'Public'), ('private', 'Private'), \
- ('confidential', 'Confidential')], 'Mark as', states={'done': [('readonly', True)]}),
+ ('confidential', 'Public for Employees')], 'Mark as', states={'done': [('readonly', True)]}),
'location': fields.char('Location', size=264, help="Location of Event", states={'done': [('readonly', True)]}),
'show_as': fields.selection([('free', 'Free'), ('busy', 'Busy')], \
'Show as', states={'done': [('readonly', True)]}),
@@ -1036,7 +1045,7 @@ defines the list of date/time exceptions for a recurring calendar component."),
'exrule': fields.char('Exception Rule', size=352, help="Defines a \
rule or repeating pattern of time to exclude from the recurring rule."),
'rrule': fields.function(_get_rulestring, type='char', size=124, \
- store=True, string='Recurrent Rule'),
+ fnct_inv=_rrule_write, store=True, string='Recurrent Rule'),
'rrule_type': fields.selection([('none', ''), ('daily', 'Daily'), \
('weekly', 'Weekly'), ('monthly', 'Monthly'), \
('yearly', 'Yearly'),],
@@ -1079,7 +1088,6 @@ rule or repeating pattern of time to exclude from the recurring rule."),
'active': fields.boolean('Active', help="If the active field is set to \
true, it will allow you to hide the event alarm information without removing it."),
'recurrency': fields.boolean('Recurrent', help="Recurrent Meeting"),
- 'edit_all': fields.boolean('Edit All', help="Edit all Occurrences of recurrent Meeting."),
}
def default_organizer(self, cr, uid, context=None):
@@ -1102,83 +1110,68 @@ rule or repeating pattern of time to exclude from the recurring rule."),
'active': 1,
'user_id': lambda self, cr, uid, ctx: uid,
'organizer': default_organizer,
- 'edit_all' : False,
}
- def get_recurrent_ids(self, cr, uid, select, base_start_date, base_until_date, limit=100, context=None):
+ def get_recurrent_ids(self, cr, uid, select, domain, limit=100, context=None):
"""Gives virtual event ids for recurring events based on value of Recurrence Rule
This method gives ids of dates that comes between start date and end date of calendar views
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
- @param base_start_date: Get Start Date
- @param base_until_date: Get End Date
@param limit: The Number of Results to Return """
if not context:
context = {}
- virtual_id = context and context.get('virtual_id', False) or False
-
- if isinstance(select, (str, int, long)):
- ids = [select]
- else:
- ids = select
result = []
- if ids and virtual_id:
- for data in super(calendar_event, self).read(cr, uid, ids, context=context):
- start_date = base_start_date and datetime.strptime(base_start_date[:10]+ ' 00:00:00' , "%Y-%m-%d %H:%M:%S") or False
- until_date = base_until_date and datetime.strptime(base_until_date[:10]+ ' 23:59:59', "%Y-%m-%d %H:%M:%S") or False
- event_date = datetime.strptime(data['date'], "%Y-%m-%d %H:%M:%S")
+ for data in super(calendar_event, self).read(cr, uid, select, context=context):
+ if not data['rrule']:
+ result.append(data['id'])
+ continue
+ event_date = datetime.strptime(data['date'], "%Y-%m-%d %H:%M:%S")
# To check: If the start date is replace by event date .. the event date will be changed by that of calendar code
-
- if not data['rrule']:
- if start_date and (event_date < start_date):
- continue
- if until_date and (event_date > until_date):
- continue
- idval = data['id']
- result.append(idval)
- else:
- start_date = event_date
- exdate = data['exdate'] and data['exdate'].split(',') or []
- rrule_str = data['rrule']
- new_rrule_str = []
- rrule_until_date = False
- is_until = False
- for rule in rrule_str.split(';'):
- name, value = rule.split('=')
- if name == "UNTIL":
- is_until = True
- value = parser.parse(value)
- rrule_until_date = parser.parse(value.strftime("%Y-%m-%d %H:%M:%S"))
- if until_date and until_date >= rrule_until_date:
- until_date = rrule_until_date
- if until_date:
- value = until_date.strftime("%Y%m%d%H%M%S")
- else:
- value = value.strftime("%Y%m%d%H%M%S")
- new_rule = '%s=%s' % (name, value)
- new_rrule_str.append(new_rule)
- if not is_until and until_date:
- value = until_date.strftime("%Y%m%d%H%M%S")
- name = "UNTIL"
- new_rule = '%s=%s' % (name, value)
- new_rrule_str.append(new_rule)
- new_rrule_str = ';'.join(new_rrule_str)
- rdates = get_recurrent_dates(str(new_rrule_str), exdate, start_date, data['exrule'])
-
- for r_date in rdates:
- if start_date and r_date < start_date:
- continue
- if until_date and r_date > until_date:
- continue
- idval = real_id2base_calendar_id(data['id'], r_date.strftime("%Y-%m-%d %H:%M:%S"))
- result.append(idval)
- if result:
- ids = list(set(result))
+ if not data['rrule']:
+ continue
+
+ exdate = data['exdate'] and data['exdate'].split(',') or []
+ rrule_str = data['rrule']
+ new_rrule_str = []
+ rrule_until_date = False
+ is_until = False
+ for rule in rrule_str.split(';'):
+ name, value = rule.split('=')
+ if name == "UNTIL":
+ is_until = True
+ value = parser.parse(value)
+ rrule_until_date = parser.parse(value.strftime("%Y-%m-%d %H:%M:%S"))
+ value = value.strftime("%Y%m%d%H%M%S")
+ new_rule = '%s=%s' % (name, value)
+ new_rrule_str.append(new_rule)
+ new_rrule_str = ';'.join(new_rrule_str)
+ rdates = get_recurrent_dates(str(new_rrule_str), exdate, event_date, data['exrule'])
+ for r_date in rdates:
+ ok = True
+ for arg in domain:
+ if arg[0] in ('date', 'date_deadline'):
+ if (arg[1]=='='):
+ ok = ok and r_date.strftime('%Y-%m-%d')==arg[2]
+ if (arg[1]=='>'):
+ ok = ok and r_date.strftime('%Y-%m-%d')>arg[2]
+ if (arg[1]=='<'):
+ ok = ok and r_date.strftime('%Y-%m-%d')='):
+ ok = ok and r_date.strftime('%Y-%m-%d')>=arg[2]
+ if (arg[1]=='<='):
+ ok = ok and r_date.strftime('%Y-%m-%d')<=arg[2]
+ if not ok:
+ continue
+ idval = real_id2base_calendar_id(data['id'], r_date.strftime("%Y-%m-%d %H:%M:%S"))
+ result.append(idval)
+
if isinstance(select, (str, int, long)):
return ids and ids[0] or False
+ else:
+ ids = list(set(result))
return ids
def compute_rule_string(self, datas):
@@ -1243,17 +1236,17 @@ rule or repeating pattern of time to exclude from the recurring rule."),
'week_list' : False
}
- def _write_rrule(self, cr, uid, ids, field_value, rule_date=False, context=None):
- data = self._get_empty_rrule_data()
-
- if field_value:
- data['recurrency'] = True
- for event in self.browse(cr, uid, ids, context=context):
- rdate = rule_date or event.date
- update_data = self._parse_rrule(field_value, dict(data), rdate)
- data.update(update_data)
- #parse_rrule
- self.write(cr, uid, event.id, data, context=context)
+ #def _write_rrule(self, cr, uid, ids, field_value, rule_date=False, context=None):
+ # data = self._get_empty_rrule_data()
+ #
+ # if field_value:
+ # data['recurrency'] = True
+ # for event in self.browse(cr, uid, ids, context=context):
+ # rdate = rule_date or event.date
+ # update_data = self._parse_rrule(field_value, dict(data), rdate)
+ # data.update(update_data)
+ # #parse_rrule
+ # self.write(cr, uid, event.id, data, context=context)
def _parse_rrule(self, rule, data, date_start):
@@ -1311,9 +1304,9 @@ rule or repeating pattern of time to exclude from the recurring rule."),
return res
def search(self, cr, uid, args, offset=0, limit=0, order=None, context=None, count=False):
+ context = context or {}
args_without_date = []
- start_date = False
- until_date = False
+ filter_date = []
for arg in args:
if arg[0] == "id":
@@ -1323,17 +1316,18 @@ rule or repeating pattern of time to exclude from the recurring rule."),
elif arg[0] not in ('date', unicode('date'), 'date_deadline', unicode('date_deadline')):
args_without_date.append(arg)
else:
- if arg[1] in ('>', '>='):
- if start_date:
- continue
- start_date = arg[2]
- elif arg[1] in ('<', '<='):
- if until_date:
- continue
- until_date = arg[2]
+ if context.get('virtual_id', True):
+ args_without_date.append('|')
+ args_without_date.append(arg)
+ if context.get('virtual_id', True):
+ args_without_date.append(('recurrency','=',1))
+ filter_date.append(arg)
+
res = super(calendar_event, self).search(cr, uid, args_without_date, \
0, 0, order, context, count=False)
- res = self.get_recurrent_ids(cr, uid, res, start_date, until_date, limit, context=context)
+ if context.get('virtual_id', True):
+ res = self.get_recurrent_ids(cr, uid, res, args, limit, context=context)
+
if count:
return len(res)
elif limit:
@@ -1341,17 +1335,6 @@ rule or repeating pattern of time to exclude from the recurring rule."),
else:
return res
- def get_edit_all(self, cr, uid, id, vals=None):
- """
- return true if we have to edit all meeting from the same recurrent
- or only on occurency
- """
- meeting = self.read(cr,uid, id, ['edit_all', 'recurrency'] )
- if(vals and 'edit_all' in vals): #we jsut check edit_all
- return vals['edit_all']
- else: #it's a recurrent event and edit_all is already check
- return meeting['recurrency'] and meeting['edit_all']
-
def _get_data(self, cr, uid, id, context=None):
res = self.read(cr, uid, [id],['date', 'date_deadline'])
return res[0]
@@ -1370,101 +1353,63 @@ rule or repeating pattern of time to exclude from the recurring rule."),
def write(self, cr, uid, ids, vals, context=None, check=True, update_check=True):
- if context is None:
- context = {}
+ context = context or {}
if isinstance(ids, (str, int, long)):
- select = [ids]
- else:
- select = ids
-
-
-
- new_ids = []
+ ids = [ids]
res = False
- for event_id in select:
+
+ # Special write of complex IDS
+ for event_id in ids[:]:
+ if len(str(event_id).split('-')) == 1:
+ continue
+ ids.remove(event_id)
real_event_id = base_calendar_id2real_id(event_id)
- edit_all = self.get_edit_all(cr, uid, event_id, vals=vals)
- if edit_all:
- if self.need_to_update(event_id, vals):
- res = self._get_data(cr, uid, real_event_id, context=context)
- vals.update(res)
- event_id = real_event_id
+ if not vals.get('recurrency', True):
+ ids.append(real_event_id)
+ continue
#if edit one instance of a reccurrent id
- if len(str(event_id).split('-')) > 1 and not edit_all:
- data = self.read(cr, uid, event_id, ['date', 'date_deadline', \
- 'rrule', 'duration', 'exdate'])
- if data.get('rrule'):
- data.update(vals)
- data.update({
- 'recurrent_uid': real_event_id,
- 'recurrent_id': data.get('date'),
- 'rrule_type': 'none',
- 'rrule': '',
- 'edit_all': False,
- 'recurrency' : False,
- })
+ data = self.read(cr, uid, event_id, ['date', 'date_deadline', \
+ 'rrule', 'duration', 'exdate'])
+ if data.get('rrule'):
+ data.update(vals)
+ data.update({
+ 'recurrent_uid': real_event_id,
+ 'recurrent_id': data.get('date'),
+ 'rrule_type': 'none',
+ 'rrule': '',
+ 'recurrency' : False,
+ })
- new_id = self.copy(cr, uid, real_event_id, default=data, context=context)
+ new_id = self.copy(cr, uid, real_event_id, default=data, context=context)
- date_new = event_id.split('-')[1]
- date_new = time.strftime("%Y%m%dT%H%M%S", \
- time.strptime(date_new, "%Y%m%d%H%M%S"))
- exdate = (data['exdate'] and (data['exdate'] + ',') or '') + date_new
- res = self.write(cr, uid, [real_event_id], {'exdate': exdate})
+ date_new = event_id.split('-')[1]
+ date_new = time.strftime("%Y%m%dT%H%M%S", \
+ time.strptime(date_new, "%Y%m%d%H%M%S"))
+ exdate = (data['exdate'] and (data['exdate'] + ',') or '') + date_new
+ res = self.write(cr, uid, [real_event_id], {'exdate': exdate})
- context.update({'active_id': new_id, 'active_ids': [new_id]})
- continue
- if not real_event_id in new_ids:
- new_ids.append(real_event_id)
+ context.update({'active_id': new_id, 'active_ids': [new_id]})
+ continue
if vals.get('vtimezone', '') and vals.get('vtimezone', '').startswith('/freeassociation.sourceforge.net/tzfile/'):
vals['vtimezone'] = vals['vtimezone'][40:]
- updated_vals = self.onchange_dates(cr, uid, new_ids,
- vals.get('date', False),
- vals.get('duration', False),
- vals.get('date_deadline', False),
- vals.get('allday', False),
- context=context)
- vals.update(updated_vals.get('value', {}))
- if new_ids:
- if 'rrule' in vals.keys():
- if 'date' in vals.keys():
- date_to_write = vals['date']
- else:
- date_to_write = False
- self._write_rrule(cr, uid, new_ids, vals['rrule'], date_to_write, context)
-
- res = super(calendar_event, self).write(cr, uid, new_ids, vals, context=context)
+ res = super(calendar_event, self).write(cr, uid, ids, vals, context=context)
if ('alarm_id' in vals or 'base_calendar_alarm_id' in vals)\
or ('date' in vals or 'duration' in vals or 'date_deadline' in vals):
- # change alarm details
alarm_obj = self.pool.get('res.alarm')
- alarm_obj.do_alarm_create(cr, uid, new_ids, self._name, 'date', context=context)
+ alarm_obj.do_alarm_create(cr, uid, ids, self._name, 'date', context=context)
return res or True and False
- def browse(self, cr, uid, ids, context=None, list_class=None, fields_process=None):
- if isinstance(ids, (str, int, long)):
- select = [ids]
- else:
- select = ids
- select = map(lambda x: base_calendar_id2real_id(x), select)
- res = super(calendar_event, self).browse(cr, uid, select, context, \
- list_class, fields_process)
- if isinstance(ids, (str, int, long)):
- return res and res[0] or False
-
- return res
-
def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context=None, orderby=False):
if not context:
context = {}
if 'date' in groupby:
raise osv.except_osv(_('Warning !'), _('Group by date not supported, use the calendar view instead'))
- virtual_id = context.get('virtual_id', False)
+ virtual_id = context.get('virtual_id', True)
context.update({'virtual_id': False})
res = super(calendar_event, self).read_group(cr, uid, domain, fields, groupby, offset=offset, limit=limit, context=context, orderby=orderby)
for re in res:
@@ -1479,8 +1424,12 @@ rule or repeating pattern of time to exclude from the recurring rule."),
# FIXME This whole id mangling has to go!
if context is None:
context = {}
-
+ fields2 = fields and fields[:] or None
+ EXTRAFIELDS = ('class','user_id','date','duration')
+ for f in EXTRAFIELDS:
+ if fields and (f not in fields):
+ fields2.append(f)
if isinstance(ids, (str, int, long)):
select = [ids]
@@ -1488,17 +1437,13 @@ rule or repeating pattern of time to exclude from the recurring rule."),
select = ids
select = map(lambda x: (x, base_calendar_id2real_id(x)), select)
result = []
- if fields and 'date' not in fields:
- fields.append('date')
- if fields and 'duration' not in fields:
- fields.append('duration')
real_data = super(calendar_event, self).read(cr, uid,
[real_id for base_calendar_id, real_id in select],
- fields=fields, context=context, load=load)
+ fields=fields2, context=context, load=load)
real_data = dict(zip([x['id'] for x in real_data], real_data))
- for base_calendar_id, real_id in select:
+ for base_calendar_id, real_id in select:
res = real_data[real_id].copy()
ls = base_calendar_id2real_id(base_calendar_id, with_date=res and res.get('duration', 0) or 0)
if not isinstance(ls, (str, int, long)) and len(ls) >= 2:
@@ -1507,9 +1452,25 @@ rule or repeating pattern of time to exclude from the recurring rule."),
res['id'] = base_calendar_id
result.append(res)
+
+ for r in result:
+ if r['user_id']:
+ user_id = type(r['user_id']) in (tuple,list) and r['user_id'][0] or r['user_id']
+ if user_id==uid:
+ continue
+ if r['class']=='private':
+ for f in r.keys():
+ if f not in ('id','date','date_deadline','duration','user_id','state'):
+ r[f] = False
+ if f=='name':
+ r[f] = _('Busy')
+
+ for r in result:
+ for k in EXTRAFIELDS:
+ if (k in r) and ((not fields) or (k not in fields)):
+ del r[k]
if isinstance(ids, (str, int, long)):
return result and result[0] or False
-
return result
def copy(self, cr, uid, id, default=None, context=None):
@@ -1520,68 +1481,49 @@ rule or repeating pattern of time to exclude from the recurring rule."),
alarm_obj = self.pool.get('res.alarm')
alarm_obj.do_alarm_create(cr, uid, [res], self._name, 'date', context=context)
return res
-
-
+
def unlink(self, cr, uid, ids, context=None):
if not isinstance(ids, list):
ids = [ids]
-
res = False
- for id in ids:
- data_list = self.read(cr, uid, [id], ['date', 'rrule', 'exdate'], context=context)
- if len(data_list) < 1:
+ for event_id in ids[:]:
+ if len(str(event_id).split('-')) == 1:
continue
- event_data = data_list[0]
- event_id = event_data['id']
- if self.get_edit_all(cr, uid, event_id, vals=None):
- event_id = base_calendar_id2real_id(event_id)
+ real_event_id = base_calendar_id2real_id(event_id)
+ data = self.read(cr, uid, real_event_id, ['exdate'], context=context)
+ date_new = event_id.split('-')[1]
+ date_new = time.strftime("%Y%m%dT%H%M%S", \
+ time.strptime(date_new, "%Y%m%d%H%M%S"))
+ exdate = (data['exdate'] and (data['exdate'] + ',') or '') + date_new
+ self.write(cr, uid, [real_event_id], {'exdate': exdate})
+ ids.remove(event_id)
- if isinstance(event_id, (int, long)):
- res = super(calendar_event, self).unlink(cr, uid, event_id, context=context)
- self.pool.get('res.alarm').do_alarm_unlink(cr, uid, [event_id], self._name)
- self.unlink_events(cr, uid, [event_id], context=context)
- else:
- str_event, date_new = event_id.split('-')
- event_id = int(str_event)
- if event_data['rrule']:
- # Remove one of the recurrent event
- date_new = time.strftime("%Y%m%dT%H%M%S", \
- time.strptime(date_new, "%Y%m%d%H%M%S"))
- exdate = (event_data['exdate'] and (event_data['exdate'] + ',') or '') + date_new
- res = self.write(cr, uid, [event_id], {'exdate': exdate})
- else:
- res = super(calendar_event, self).unlink(cr, uid, [event_id], context=context)
- self.pool.get('res.alarm').do_alarm_unlink(cr, uid, [event_id], self._name)
- self.unlink_events(cr, uid, [event_id], context=context)
+ res = super(calendar_event, self).unlink(cr, uid, ids, context=context)
+ self.pool.get('res.alarm').do_alarm_unlink(cr, uid, ids, self._name)
+ self.unlink_events(cr, uid, ids, context=context)
return res
+
def create(self, cr, uid, vals, context=None):
if context is None:
context = {}
if vals.get('vtimezone', '') and vals.get('vtimezone', '').startswith('/freeassociation.sourceforge.net/tzfile/'):
vals['vtimezone'] = vals['vtimezone'][40:]
-
- if 'date' in vals and 'rrule' in vals and vals['rrule']:
- update_datas = self._parse_rrule(vals['rrule'], self._get_empty_rrule_data(), vals['date'])
- update_datas['recurrency'] = True
- vals.update(update_datas)
- updated_vals = self.onchange_dates(cr, uid, [],
- vals.get('date', False),
- vals.get('duration', False),
- vals.get('date_deadline', False),
- vals.get('allday', False),
- context=context)
- vals.update(updated_vals.get('value', {}))
+ #updated_vals = self.onchange_dates(cr, uid, [],
+ # vals.get('date', False),
+ # vals.get('duration', False),
+ # vals.get('date_deadline', False),
+ # vals.get('allday', False),
+ # context=context)
+ #vals.update(updated_vals.get('value', {}))
+
res = super(calendar_event, self).create(cr, uid, vals, context)
alarm_obj = self.pool.get('res.alarm')
alarm_obj.do_alarm_create(cr, uid, [res], self._name, 'date', context=context)
-
return res
-
-
def do_tentative(self, cr, uid, ids, context=None, *args):
""" Makes event invitation as Tentative
diff --git a/addons/base_calendar/base_calendar_view.xml b/addons/base_calendar/base_calendar_view.xml
index 3ce934b4ded..16064762f9b 100644
--- a/addons/base_calendar/base_calendar_view.xml
+++ b/addons/base_calendar/base_calendar_view.xml
@@ -242,8 +242,7 @@
-
-
+
diff --git a/addons/base_calendar/i18n/bn.po b/addons/base_calendar/i18n/bn.po
new file mode 100644
index 00000000000..e0d0b9c7cca
--- /dev/null
+++ b/addons/base_calendar/i18n/bn.po
@@ -0,0 +1,1658 @@
+# Bengali translation for openobject-addons
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2011-01-11 11:14+0000\n"
+"PO-Revision-Date: 2011-11-21 12:57+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Bengali \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-11-22 05:00+0000\n"
+"X-Generator: Launchpad (build 14299)\n"
+
+#. module: base_calendar
+#: selection:calendar.alarm,trigger_related:0
+#: selection:res.alarm,trigger_related:0
+msgid "The event starts"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,freq:0
+msgid "Hourly"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+msgid "Required to Join"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.event,exdate:0
+#: help:calendar.todo,exdate:0
+msgid ""
+"This property defines the list of date/time exceptions for a recurring "
+"calendar component."
+msgstr ""
+
+#. module: base_calendar
+#: constraint:res.users:0
+msgid "The chosen company is not in the allowed companies for this user"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.event.edit.all,name:0
+msgid "Title"
+msgstr "শিরোনাম"
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,freq:0
+#: selection:calendar.event,rrule_type:0
+#: selection:calendar.todo,rrule_type:0
+msgid "Monthly"
+msgstr "মাসভিত্তিক"
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+msgid "Invited User"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+msgid "Invitation"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.event,recurrency:0
+#: help:calendar.todo,recurrency:0
+msgid "Recurrent Meeting"
+msgstr ""
+
+#. module: base_calendar
+#: model:ir.actions.act_window,name:base_calendar.action_res_alarm_view
+#: model:ir.ui.menu,name:base_calendar.menu_crm_meeting_avail_alarm
+msgid "Alarms"
+msgstr "অ্যালার্ম"
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,week_list:0
+#: selection:calendar.event,week_list:0
+#: selection:calendar.todo,week_list:0
+msgid "Sunday"
+msgstr "রবিবার"
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+#: field:calendar.attendee,role:0
+msgid "Role"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+#: view:calendar.event:0
+msgid "Invitation details"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,byday:0
+#: selection:calendar.event,byday:0
+#: selection:calendar.todo,byday:0
+msgid "Fourth"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.event,show_as:0
+#: field:calendar.todo,show_as:0
+msgid "Show as"
+msgstr ""
+
+#. module: base_calendar
+#: field:base.calendar.set.exrule,day:0
+#: selection:base.calendar.set.exrule,select1:0
+#: field:calendar.event,day:0
+#: selection:calendar.event,select1:0
+#: field:calendar.todo,day:0
+#: selection:calendar.todo,select1:0
+msgid "Date of month"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.event,class:0
+#: selection:calendar.todo,class:0
+msgid "Public"
+msgstr "পাবলিক"
+
+#. module: base_calendar
+#: view:calendar.event:0
+msgid " "
+msgstr " "
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,month_list:0
+#: selection:calendar.event,month_list:0
+#: selection:calendar.todo,month_list:0
+msgid "March"
+msgstr "মার্চ"
+
+#. module: base_calendar
+#: code:addons/base_calendar/base_calendar.py:414
+#: code:addons/base_calendar/wizard/base_calendar_set_exrule.py:90
+#, python-format
+msgid "Warning !"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,week_list:0
+#: selection:calendar.event,week_list:0
+#: selection:calendar.todo,week_list:0
+msgid "Friday"
+msgstr "শুক্রবার"
+
+#. module: base_calendar
+#: field:calendar.event,allday:0
+#: field:calendar.todo,allday:0
+msgid "All Day"
+msgstr "সারাদিন"
+
+#. module: base_calendar
+#: field:base.calendar.set.exrule,select1:0
+#: field:calendar.event,select1:0
+#: field:calendar.todo,select1:0
+msgid "Option"
+msgstr "বিকল্প"
+
+#. module: base_calendar
+#: selection:calendar.attendee,availability:0
+#: selection:calendar.event,show_as:0
+#: selection:calendar.todo,show_as:0
+#: selection:res.users,availability:0
+msgid "Free"
+msgstr "ফ্রী"
+
+#. module: base_calendar
+#: help:calendar.attendee,rsvp:0
+msgid "Indicats whether the favor of a reply is requested"
+msgstr ""
+
+#. module: base_calendar
+#: model:ir.model,name:base_calendar.model_ir_attachment
+msgid "ir.attachment"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.attendee,delegated_to:0
+msgid "The users that the original request was delegated to"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.attendee,ref:0
+msgid "Event Ref"
+msgstr ""
+
+#. module: base_calendar
+#: field:base.calendar.set.exrule,we:0
+#: field:calendar.event,we:0
+#: field:calendar.todo,we:0
+msgid "Wed"
+msgstr "বুধ"
+
+#. module: base_calendar
+#: view:calendar.event:0
+msgid "Show time as"
+msgstr ""
+
+#. module: base_calendar
+#: field:base.calendar.set.exrule,tu:0
+#: field:calendar.event,tu:0
+#: field:calendar.todo,tu:0
+msgid "Tue"
+msgstr "মঙ্গল"
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,freq:0
+#: selection:calendar.event,rrule_type:0
+#: selection:calendar.todo,rrule_type:0
+msgid "Yearly"
+msgstr "বাৎসরিক"
+
+#. module: base_calendar
+#: selection:calendar.alarm,trigger_related:0
+#: selection:res.alarm,trigger_related:0
+msgid "The event ends"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,byday:0
+#: selection:calendar.event,byday:0
+#: selection:calendar.todo,byday:0
+msgid "Last"
+msgstr "শেষ"
+
+#. module: base_calendar
+#: help:calendar.attendee,state:0
+msgid "Status of the attendee's participation"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.attendee,cutype:0
+msgid "Room"
+msgstr "রুম"
+
+#. module: base_calendar
+#: selection:calendar.alarm,trigger_interval:0
+#: selection:calendar.event,freq:0
+#: selection:calendar.todo,freq:0
+#: selection:res.alarm,trigger_interval:0
+msgid "Days"
+msgstr "দিন"
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+#: view:calendar.event:0
+msgid "Invitation Detail"
+msgstr ""
+
+#. module: base_calendar
+#: code:addons/base_calendar/base_calendar.py:1355
+#: code:addons/base_calendar/wizard/base_calendar_invite_attendee.py:96
+#: code:addons/base_calendar/wizard/base_calendar_invite_attendee.py:143
+#: code:addons/base_calendar/wizard/base_calendar_set_exrule.py:128
+#: code:addons/base_calendar/wizard/base_calendar_set_exrule.py:136
+#, python-format
+msgid "Error!"
+msgstr "ভুল"
+
+#. module: base_calendar
+#: selection:calendar.attendee,role:0
+msgid "Chair Person"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.alarm,action:0
+msgid "Procedure"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.event,state:0
+#: selection:calendar.todo,state:0
+msgid "Cancelled"
+msgstr "বাতিল করা হয়েছে"
+
+#. module: base_calendar
+#: selection:calendar.alarm,trigger_interval:0
+#: selection:res.alarm,trigger_interval:0
+msgid "Minutes"
+msgstr "মিনিট"
+
+#. module: base_calendar
+#: selection:calendar.alarm,action:0
+msgid "Display"
+msgstr "প্রদর্শন"
+
+#. module: base_calendar
+#: view:calendar.event.edit.all:0
+msgid "Edit all Occurrences"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+msgid "Invitation type"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,freq:0
+msgid "Secondly"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.alarm,event_date:0
+#: field:calendar.attendee,event_date:0
+#: view:calendar.event:0
+msgid "Event Date"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+#: view:calendar.event:0
+msgid "Group By..."
+msgstr "...দিয়ে গ্রুপ করুন"
+
+#. module: base_calendar
+#: help:base_calendar.invite.attendee,email:0
+msgid "Provide external email address who will receive this invitation."
+msgstr ""
+
+#. module: base_calendar
+#: model:ir.module.module,description:base_calendar.module_meta_information
+msgid ""
+"Full featured calendar system that supports:\n"
+" - Calendar of events\n"
+" - Alerts (create requests)\n"
+" - Recurring events\n"
+" - Invitations to people"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.attendee,cutype:0
+msgid "Specify the type of Invitation"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.event,freq:0
+#: selection:calendar.todo,freq:0
+msgid "Years"
+msgstr "বছর"
+
+#. module: base_calendar
+#: field:calendar.alarm,event_end_date:0
+#: field:calendar.attendee,event_end_date:0
+msgid "Event End Date"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.attendee,role:0
+msgid "Optional Participation"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.event,date_deadline:0
+#: field:calendar.todo,date_deadline:0
+msgid "Deadline"
+msgstr "ডেডলাইন"
+
+#. module: base_calendar
+#: code:addons/base_calendar/base_calendar.py:385
+#: code:addons/base_calendar/base_calendar.py:1088
+#: code:addons/base_calendar/base_calendar.py:1090
+#, python-format
+msgid "Warning!"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.event,active:0
+#: help:calendar.todo,active:0
+msgid ""
+"If the active field is set to true, it will allow you to hide the "
+"event alarm information without removing it."
+msgstr ""
+
+#. module: base_calendar
+#: model:ir.module.module,shortdesc:base_calendar.module_meta_information
+msgid "Basic Calendar Functionality"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.event,organizer:0
+#: field:calendar.event,organizer_id:0
+#: field:calendar.todo,organizer:0
+#: field:calendar.todo,organizer_id:0
+msgid "Organizer"
+msgstr "আয়োজক"
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+#: view:calendar.event:0
+#: field:calendar.event,user_id:0
+#: field:calendar.todo,user_id:0
+msgid "Responsible"
+msgstr "দায়িত্বপ্রাপ্ত"
+
+#. module: base_calendar
+#: view:calendar.event:0
+#: model:res.request.link,name:base_calendar.request_link_meeting
+msgid "Event"
+msgstr "ইভেন্ট"
+
+#. module: base_calendar
+#: help:calendar.event,edit_all:0
+#: help:calendar.todo,edit_all:0
+msgid "Edit all Occurrences of recurrent Meeting."
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.alarm,trigger_occurs:0
+#: selection:res.alarm,trigger_occurs:0
+msgid "Before"
+msgstr "আগে"
+
+#. module: base_calendar
+#: view:calendar.event:0
+#: selection:calendar.event,state:0
+#: selection:calendar.todo,state:0
+msgid "Confirmed"
+msgstr "নিশ্চিত"
+
+#. module: base_calendar
+#: model:ir.actions.act_window,name:base_calendar.action_calendar_event_edit_all
+msgid "Edit all events"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.alarm,attendee_ids:0
+#: field:calendar.event,attendee_ids:0
+#: field:calendar.todo,attendee_ids:0
+msgid "Attendees"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+msgid "Confirm"
+msgstr "নিশ্চিত"
+
+#. module: base_calendar
+#: model:ir.model,name:base_calendar.model_calendar_todo
+msgid "Calendar Task"
+msgstr ""
+
+#. module: base_calendar
+#: field:base.calendar.set.exrule,su:0
+#: field:calendar.event,su:0
+#: field:calendar.todo,su:0
+msgid "Sun"
+msgstr "রবি"
+
+#. module: base_calendar
+#: field:calendar.attendee,cutype:0
+msgid "Invite Type"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.attendee,partner_id:0
+msgid "Partner related to contact"
+msgstr ""
+
+#. module: base_calendar
+#: view:res.alarm:0
+msgid "Reminder details"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.attendee,parent_ids:0
+msgid "Delegrated From"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,select1:0
+#: selection:calendar.event,select1:0
+#: selection:calendar.todo,select1:0
+msgid "Day of month"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+#: field:calendar.event,location:0
+#: field:calendar.event.edit.all,location:0
+#: field:calendar.todo,location:0
+msgid "Location"
+msgstr "স্থান"
+
+#. module: base_calendar
+#: field:base_calendar.invite.attendee,send_mail:0
+msgid "Send mail?"
+msgstr ""
+
+#. module: base_calendar
+#: field:base_calendar.invite.attendee,email:0
+#: selection:calendar.alarm,action:0
+#: field:calendar.attendee,email:0
+msgid "Email"
+msgstr "ই-মেইল"
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+msgid "Event Detail"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.alarm,state:0
+msgid "Run"
+msgstr "চালাও"
+
+#. module: base_calendar
+#: field:calendar.event,exdate:0
+#: field:calendar.todo,exdate:0
+msgid "Exception Date/Times"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.event,class:0
+#: selection:calendar.todo,class:0
+msgid "Confidential"
+msgstr "গুপ্ত"
+
+#. module: base_calendar
+#: field:base.calendar.set.exrule,end_date:0
+#: field:calendar.event,end_date:0
+#: field:calendar.todo,end_date:0
+msgid "Repeat Until"
+msgstr ""
+
+#. module: base_calendar
+#: model:ir.actions.act_window,help:base_calendar.action_res_alarm_view
+msgid ""
+"Create specific calendar alarms that may be assigned to calendar events or "
+"meetings."
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+msgid "Visibility"
+msgstr "দৃশ্যমানতা"
+
+#. module: base_calendar
+#: field:calendar.attendee,rsvp:0
+msgid "Required Reply?"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.event,base_calendar_url:0
+#: field:calendar.todo,base_calendar_url:0
+msgid "Caldav URL"
+msgstr ""
+
+#. module: base_calendar
+#: view:base.calendar.set.exrule:0
+msgid "Select range to Exclude"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.event,recurrent_uid:0
+#: field:calendar.todo,recurrent_uid:0
+msgid "Recurrent ID"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,month_list:0
+#: selection:calendar.event,month_list:0
+#: selection:calendar.todo,month_list:0
+msgid "July"
+msgstr "জুলাই"
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+#: selection:calendar.attendee,state:0
+msgid "Accepted"
+msgstr "গৃহীত"
+
+#. module: base_calendar
+#: field:base.calendar.set.exrule,th:0
+#: field:calendar.event,th:0
+#: field:calendar.todo,th:0
+msgid "Thu"
+msgstr "বৃহঃ"
+
+#. module: base_calendar
+#: field:calendar.attendee,child_ids:0
+msgid "Delegrated To"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+msgid "Required Reply"
+msgstr "উত্তর প্রয়োজন"
+
+#. module: base_calendar
+#: selection:calendar.event,end_type:0
+#: selection:calendar.todo,end_type:0
+msgid "Forever"
+msgstr "চিরকাল"
+
+#. module: base_calendar
+#: selection:calendar.attendee,role:0
+msgid "Participation required"
+msgstr "অংশগ্রহণ প্রয়োজন"
+
+#. module: base_calendar
+#: view:base.calendar.set.exrule:0
+msgid "_Cancel"
+msgstr "বাতিল (_C)"
+
+#. module: base_calendar
+#: field:calendar.event,create_date:0
+#: field:calendar.todo,create_date:0
+msgid "Created"
+msgstr "তৈরী হয়েছে"
+
+#. module: base_calendar
+#: selection:calendar.event,class:0
+#: selection:calendar.todo,class:0
+msgid "Private"
+msgstr "ব্যক্তিগত"
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,freq:0
+#: selection:calendar.event,rrule_type:0
+#: selection:calendar.todo,rrule_type:0
+msgid "Daily"
+msgstr "দৈনিক"
+
+#. module: base_calendar
+#: code:addons/base_calendar/base_calendar.py:385
+#, python-format
+msgid "Can not Duplicate"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.event,class:0
+#: field:calendar.todo,class:0
+msgid "Mark as"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+#: field:calendar.attendee,partner_address_id:0
+msgid "Contact"
+msgstr "যোগাযোগ"
+
+#. module: base_calendar
+#: help:calendar.event,rrule_type:0
+#: help:calendar.todo,rrule_type:0
+msgid "Let the event automatically repeat at that interval"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+#: view:calendar.event:0
+msgid "Delegate"
+msgstr ""
+
+#. module: base_calendar
+#: field:base_calendar.invite.attendee,partner_id:0
+#: view:calendar.attendee:0
+#: field:calendar.attendee,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: base_calendar
+#: view:base_calendar.invite.attendee:0
+#: selection:base_calendar.invite.attendee,type:0
+msgid "Partner Contacts"
+msgstr ""
+
+#. module: base_calendar
+#: view:base.calendar.set.exrule:0
+msgid "_Ok"
+msgstr "ঠিক আছে(_O)"
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,byday:0
+#: selection:calendar.event,byday:0
+#: selection:calendar.todo,byday:0
+msgid "First"
+msgstr "প্রথম"
+
+#. module: base_calendar
+#: view:calendar.event:0
+msgid "Privacy"
+msgstr "প্রাইভেসি"
+
+#. module: base_calendar
+#: field:calendar.event,vtimezone:0
+#: field:calendar.todo,vtimezone:0
+msgid "Timezone"
+msgstr "টাইমজোন"
+
+#. module: base_calendar
+#: view:calendar.event:0
+msgid "Subject"
+msgstr "বিষয়"
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,month_list:0
+#: selection:calendar.event,month_list:0
+#: selection:calendar.todo,month_list:0
+msgid "September"
+msgstr "সেপ্টেম্বর"
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,month_list:0
+#: selection:calendar.event,month_list:0
+#: selection:calendar.todo,month_list:0
+msgid "December"
+msgstr ""
+
+#. module: base_calendar
+#: help:base_calendar.invite.attendee,send_mail:0
+msgid "Check this if you want to send an Email to Invited Person"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+msgid "Availability"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event.edit.all:0
+msgid "_Save"
+msgstr "সংরক্ষণ (_S)"
+
+#. module: base_calendar
+#: selection:calendar.attendee,cutype:0
+msgid "Individual"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.event,count:0
+#: help:calendar.todo,count:0
+msgid "Repeat x times"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.alarm,user_id:0
+msgid "Owner"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+msgid "Delegation Info"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+#: field:calendar.event.edit.all,date:0
+msgid "Start Date"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.attendee,cn:0
+msgid "Common name"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+#: selection:calendar.attendee,state:0
+msgid "Declined"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+msgid "My Role"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+msgid "My Events"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+#: view:calendar.event:0
+msgid "Decline"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.event,freq:0
+#: selection:calendar.todo,freq:0
+msgid "Weeks"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.attendee,cutype:0
+msgid "Group"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.event,edit_all:0
+#: field:calendar.todo,edit_all:0
+msgid "Edit All"
+msgstr ""
+
+#. module: base_calendar
+#: field:base_calendar.invite.attendee,contact_ids:0
+msgid "Contacts"
+msgstr ""
+
+#. module: base_calendar
+#: model:ir.model,name:base_calendar.model_res_alarm
+msgid "Basic Alarm Information"
+msgstr ""
+
+#. module: base_calendar
+#: field:base.calendar.set.exrule,fr:0
+#: field:calendar.event,fr:0
+#: field:calendar.todo,fr:0
+msgid "Fri"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.alarm,trigger_interval:0
+#: selection:calendar.event,freq:0
+#: selection:calendar.todo,freq:0
+#: selection:res.alarm,trigger_interval:0
+msgid "Hours"
+msgstr ""
+
+#. module: base_calendar
+#: code:addons/base_calendar/base_calendar.py:1090
+#, python-format
+msgid "Count can not be Negative"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.attendee,member:0
+msgid "Member"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.event,location:0
+#: help:calendar.todo,location:0
+msgid "Location of Event"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.event,rrule:0
+#: field:calendar.todo,rrule:0
+msgid "Recurrent Rule"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.alarm,state:0
+msgid "Draft"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.alarm,attach:0
+msgid "Attachment"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+msgid "Invitation From"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+msgid "End of recurrency"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+#: field:calendar.event.edit.all,alarm_id:0
+msgid "Reminder"
+msgstr ""
+
+#. module: base_calendar
+#: view:base.calendar.set.exrule:0
+#: model:ir.model,name:base_calendar.model_base_calendar_set_exrule
+msgid "Set Exrule"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+#: model:ir.actions.act_window,name:base_calendar.action_view_event
+#: model:ir.ui.menu,name:base_calendar.menu_events
+msgid "Events"
+msgstr ""
+
+#. module: base_calendar
+#: model:ir.actions.act_window,name:base_calendar.action_view_calendar_invite_attendee_wizard
+#: model:ir.model,name:base_calendar.model_base_calendar_invite_attendee
+msgid "Invite Attendees"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.attendee,email:0
+msgid "Email of Invited Person"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.alarm,repeat:0
+#: field:calendar.event,count:0
+#: field:calendar.todo,count:0
+#: field:res.alarm,repeat:0
+msgid "Repeat"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.attendee,dir:0
+msgid ""
+"Reference to the URIthat points to the directory information corresponding "
+"to the attendee."
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,month_list:0
+#: selection:calendar.event,month_list:0
+#: selection:calendar.todo,month_list:0
+msgid "August"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,week_list:0
+#: selection:calendar.event,week_list:0
+#: selection:calendar.todo,week_list:0
+msgid "Monday"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,byday:0
+#: selection:calendar.event,byday:0
+#: selection:calendar.todo,byday:0
+msgid "Third"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,month_list:0
+#: selection:calendar.event,month_list:0
+#: selection:calendar.todo,month_list:0
+msgid "June"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.alarm,alarm_id:0
+msgid "Basic Alarm"
+msgstr ""
+
+#. module: base_calendar
+#: view:base.calendar.set.exrule:0
+#: view:calendar.event:0
+msgid "The"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+#: field:calendar.attendee,delegated_from:0
+msgid "Delegated From"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.attendee,user_id:0
+msgid "User"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+#: field:calendar.event,date:0
+msgid "Date"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,month_list:0
+#: selection:calendar.event,month_list:0
+#: selection:calendar.todo,month_list:0
+msgid "November"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.attendee,member:0
+msgid "Indicate the groups that the attendee belongs to"
+msgstr ""
+
+#. module: base_calendar
+#: view:base_calendar.invite.attendee:0
+msgid "Data"
+msgstr ""
+
+#. module: base_calendar
+#: field:base.calendar.set.exrule,mo:0
+#: field:calendar.event,mo:0
+#: field:calendar.todo,mo:0
+msgid "Mon"
+msgstr ""
+
+#. module: base_calendar
+#: field:base.calendar.set.exrule,count:0
+msgid "Count"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,freq:0
+#: selection:calendar.event,freq:0
+#: selection:calendar.todo,freq:0
+msgid "No Repeat"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,month_list:0
+#: selection:calendar.event,month_list:0
+#: selection:calendar.todo,month_list:0
+msgid "October"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+#: view:calendar.event:0
+msgid "Uncertain"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.attendee,language:0
+msgid "Language"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.alarm,trigger_occurs:0
+#: field:res.alarm,trigger_occurs:0
+msgid "Triggers"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,month_list:0
+#: selection:calendar.event,month_list:0
+#: selection:calendar.todo,month_list:0
+msgid "January"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.alarm,trigger_related:0
+#: field:res.alarm,trigger_related:0
+msgid "Related to"
+msgstr ""
+
+#. module: base_calendar
+#: field:base.calendar.set.exrule,interval:0
+#: field:calendar.alarm,trigger_interval:0
+#: field:res.alarm,trigger_interval:0
+msgid "Interval"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,week_list:0
+#: selection:calendar.event,week_list:0
+#: selection:calendar.todo,week_list:0
+msgid "Wednesday"
+msgstr ""
+
+#. module: base_calendar
+#: code:addons/base_calendar/base_calendar.py:1088
+#, python-format
+msgid "Interval can not be Negative"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.alarm,name:0
+#: view:calendar.event:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.alarm,active:0
+#: field:calendar.event,active:0
+#: field:calendar.todo,active:0
+#: field:res.alarm,active:0
+msgid "Active"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+msgid "Choose day in the month where repeat the meeting"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.alarm,action:0
+msgid "Action"
+msgstr ""
+
+#. module: base_calendar
+#: help:base_calendar.invite.attendee,type:0
+msgid "Select whom you want to Invite"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.alarm,duration:0
+#: help:res.alarm,duration:0
+msgid ""
+"Duration' and 'Repeat' are both optional, but if one occurs, so MUST the "
+"other"
+msgstr ""
+
+#. module: base_calendar
+#: model:ir.model,name:base_calendar.model_calendar_event_edit_all
+msgid "Calendar Edit all event"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.attendee,role:0
+msgid "Participation role for the calendar user"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+#: field:calendar.attendee,delegated_to:0
+msgid "Delegated To"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.alarm,action:0
+msgid "Defines the action to be invoked when an alarm is triggered"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.event,end_type:0
+#: selection:calendar.todo,end_type:0
+msgid "End date"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+msgid "Search Events"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+msgid "Recurrency Option"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,freq:0
+#: selection:calendar.event,rrule_type:0
+#: selection:calendar.todo,rrule_type:0
+msgid "Weekly"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.alarm,active:0
+#: help:res.alarm,active:0
+msgid ""
+"If the active field is set to true, it will allow you to hide the event "
+"alarm information without removing it."
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.event,recurrent_id:0
+#: field:calendar.todo,recurrent_id:0
+msgid "Recurrent ID date"
+msgstr ""
+
+#. module: base_calendar
+#: sql_constraint:res.users:0
+msgid "You can not have two users with the same login !"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.alarm,state:0
+#: view:calendar.attendee:0
+#: field:calendar.attendee,state:0
+#: view:calendar.event:0
+#: field:calendar.event,state:0
+#: field:calendar.todo,state:0
+msgid "State"
+msgstr ""
+
+#. module: base_calendar
+#: view:res.alarm:0
+msgid "Reminder Details"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+msgid "To Review"
+msgstr ""
+
+#. module: base_calendar
+#: field:base.calendar.set.exrule,freq:0
+#: field:calendar.event,freq:0
+#: field:calendar.todo,freq:0
+msgid "Frequency"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.alarm,state:0
+msgid "Done"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.event,interval:0
+#: help:calendar.todo,interval:0
+msgid "Repeat every (Days/Week/Month/Year)"
+msgstr ""
+
+#. module: base_calendar
+#: view:base_calendar.invite.attendee:0
+#: field:base_calendar.invite.attendee,user_ids:0
+msgid "Users"
+msgstr ""
+
+#. module: base_calendar
+#: view:base.calendar.set.exrule:0
+msgid "of"
+msgstr ""
+
+#. module: base_calendar
+#: view:base_calendar.invite.attendee:0
+#: view:calendar.event:0
+#: view:calendar.event.edit.all:0
+msgid "Cancel"
+msgstr ""
+
+#. module: base_calendar
+#: model:ir.model,name:base_calendar.model_res_users
+msgid "res.users"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,week_list:0
+#: selection:calendar.event,week_list:0
+#: selection:calendar.todo,week_list:0
+msgid "Tuesday"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.alarm,description:0
+msgid ""
+"Provides a more complete description of the "
+"calendar component, than that provided by the "
+"\"SUMMARY\" property"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+msgid "Responsible User"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.attendee,availability:0
+#: selection:calendar.event,show_as:0
+#: selection:calendar.todo,show_as:0
+#: selection:res.users,availability:0
+msgid "Busy"
+msgstr ""
+
+#. module: base_calendar
+#: model:ir.model,name:base_calendar.model_calendar_event
+msgid "Calendar Event"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.attendee,state:0
+#: selection:calendar.event,state:0
+#: selection:calendar.todo,state:0
+msgid "Tentative"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.event,interval:0
+#: field:calendar.todo,interval:0
+msgid "Repeat every"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.event,end_type:0
+#: selection:calendar.todo,end_type:0
+msgid "Fix amout of times"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.event,recurrency:0
+#: field:calendar.todo,recurrency:0
+msgid "Recurrent"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.event,rrule_type:0
+#: field:calendar.todo,rrule_type:0
+msgid "Recurrency"
+msgstr ""
+
+#. module: base_calendar
+#: model:ir.actions.act_window,name:base_calendar.action_view_attendee_form
+#: model:ir.ui.menu,name:base_calendar.menu_attendee_invitations
+msgid "Event Invitations"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,week_list:0
+#: selection:calendar.event,week_list:0
+#: selection:calendar.todo,week_list:0
+msgid "Thursday"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.event,exrule:0
+#: field:calendar.todo,exrule:0
+msgid "Exception Rule"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.attendee,language:0
+msgid ""
+"To specify the language for text values in aproperty or property parameter."
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+msgid "Details"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.event,exrule:0
+#: help:calendar.todo,exrule:0
+msgid ""
+"Defines a rule or repeating pattern of time to exclude from the recurring "
+"rule."
+msgstr ""
+
+#. module: base_calendar
+#: field:base.calendar.set.exrule,month_list:0
+#: field:calendar.event,month_list:0
+#: field:calendar.todo,month_list:0
+msgid "Month"
+msgstr ""
+
+#. module: base_calendar
+#: view:base_calendar.invite.attendee:0
+#: view:calendar.event:0
+msgid "Invite People"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.event,rrule:0
+#: help:calendar.todo,rrule:0
+msgid ""
+"Defines a rule or repeating pattern for recurring events\n"
+"e.g.: Every other month on the last Sunday of the month for 10 occurrences: "
+" FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=-1SU"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.attendee,dir:0
+msgid "URI Reference"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.alarm,description:0
+#: view:calendar.event:0
+#: field:calendar.event,description:0
+#: field:calendar.event,name:0
+#: field:calendar.todo,description:0
+#: field:calendar.todo,name:0
+msgid "Description"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,month_list:0
+#: selection:calendar.event,month_list:0
+#: selection:calendar.todo,month_list:0
+msgid "May"
+msgstr ""
+
+#. module: base_calendar
+#: field:base_calendar.invite.attendee,type:0
+#: view:calendar.attendee:0
+msgid "Type"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+msgid "Search Invitations"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.alarm,trigger_occurs:0
+#: selection:res.alarm,trigger_occurs:0
+msgid "After"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.alarm,state:0
+msgid "Stop"
+msgstr ""
+
+#. module: base_calendar
+#: model:ir.model,name:base_calendar.model_ir_values
+msgid "ir.values"
+msgstr ""
+
+#. module: base_calendar
+#: model:ir.model,name:base_calendar.model_ir_model
+msgid "Objects"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+#: selection:calendar.attendee,state:0
+msgid "Delegated"
+msgstr ""
+
+#. module: base_calendar
+#: field:base.calendar.set.exrule,sa:0
+#: field:calendar.event,sa:0
+#: field:calendar.todo,sa:0
+msgid "Sat"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+msgid "Choose day where repeat the meeting"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,freq:0
+msgid "Minutely"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.attendee,sent_by:0
+msgid "Specify the user that is acting on behalf of the calendar user"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+#: field:calendar.event.edit.all,date_deadline:0
+msgid "End Date"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,month_list:0
+#: selection:calendar.event,month_list:0
+#: selection:calendar.todo,month_list:0
+msgid "February"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.event,freq:0
+#: selection:calendar.todo,freq:0
+msgid "Months"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.attendee,cutype:0
+msgid "Resource"
+msgstr ""
+
+#. module: base_calendar
+#: field:res.alarm,name:0
+msgid "Name"
+msgstr ""
+
+#. module: base_calendar
+#: model:ir.model,name:base_calendar.model_calendar_alarm
+msgid "Event alarm information"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.alarm,name:0
+msgid ""
+"Contains the text to be used as the message subject for "
+"email or contains the text to be used for display"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.event,alarm_id:0
+#: field:calendar.event,base_calendar_alarm_id:0
+#: field:calendar.todo,alarm_id:0
+#: field:calendar.todo,base_calendar_alarm_id:0
+msgid "Alarm"
+msgstr ""
+
+#. module: base_calendar
+#: code:addons/base_calendar/wizard/base_calendar_set_exrule.py:90
+#, python-format
+msgid "Please Apply Recurrency before applying Exception Rule."
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.attendee,sent_by_uid:0
+msgid "Sent By User"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,month_list:0
+#: selection:calendar.event,month_list:0
+#: selection:calendar.todo,month_list:0
+msgid "April"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.event:0
+msgid "Recurrency period"
+msgstr ""
+
+#. module: base_calendar
+#: field:base.calendar.set.exrule,week_list:0
+#: field:calendar.event,week_list:0
+#: field:calendar.todo,week_list:0
+msgid "Weekday"
+msgstr ""
+
+#. module: base_calendar
+#: field:base.calendar.set.exrule,byday:0
+#: field:calendar.event,byday:0
+#: field:calendar.todo,byday:0
+msgid "By day"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.alarm,model_id:0
+msgid "Model"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.alarm,action:0
+msgid "Audio"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.event,id:0
+#: field:calendar.todo,id:0
+msgid "ID"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.attendee,role:0
+msgid "For information Purpose"
+msgstr ""
+
+#. module: base_calendar
+#: view:base_calendar.invite.attendee:0
+msgid "Invite"
+msgstr ""
+
+#. module: base_calendar
+#: model:ir.model,name:base_calendar.model_calendar_attendee
+msgid "Attendee information"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.alarm,res_id:0
+msgid "Resource ID"
+msgstr ""
+
+#. module: base_calendar
+#: selection:calendar.attendee,state:0
+msgid "Needs Action"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.attendee,sent_by:0
+msgid "Sent By"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.event,sequence:0
+#: field:calendar.todo,sequence:0
+msgid "Sequence"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.event,alarm_id:0
+#: help:calendar.todo,alarm_id:0
+msgid "Set an alarm at this time, before the event occurs"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base_calendar.invite.attendee,type:0
+msgid "Internal User"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+#: view:calendar.event:0
+msgid "Accept"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,week_list:0
+#: selection:calendar.event,week_list:0
+#: selection:calendar.todo,week_list:0
+msgid "Saturday"
+msgstr ""
+
+#. module: base_calendar
+#: view:calendar.attendee:0
+msgid "Invitation To"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,byday:0
+#: selection:calendar.event,byday:0
+#: selection:calendar.todo,byday:0
+msgid "Second"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.attendee,availability:0
+#: field:res.users,availability:0
+msgid "Free/Busy"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.event,end_type:0
+#: field:calendar.todo,end_type:0
+msgid "Way to end reccurency"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.alarm,duration:0
+#: field:calendar.alarm,trigger_duration:0
+#: field:calendar.event,duration:0
+#: field:calendar.todo,date:0
+#: field:calendar.todo,duration:0
+#: field:res.alarm,duration:0
+#: field:res.alarm,trigger_duration:0
+msgid "Duration"
+msgstr ""
+
+#. module: base_calendar
+#: selection:base_calendar.invite.attendee,type:0
+msgid "External Email"
+msgstr ""
+
+#. module: base_calendar
+#: field:calendar.alarm,trigger_date:0
+msgid "Trigger Date"
+msgstr ""
+
+#. module: base_calendar
+#: help:calendar.alarm,attach:0
+msgid ""
+"* Points to a sound resource, which is rendered when the "
+"alarm is triggered for audio,\n"
+" * File which is intended to be sent as message "
+"attachments for email,\n"
+" * Points to a procedure resource, which is invoked when "
+" the alarm is triggered for procedure."
+msgstr ""
+
+#. module: base_calendar
+#: selection:base.calendar.set.exrule,byday:0
+#: selection:calendar.event,byday:0
+#: selection:calendar.todo,byday:0
+msgid "Fifth"
+msgstr ""
diff --git a/addons/base_calendar/security/ir.model.access.csv b/addons/base_calendar/security/ir.model.access.csv
index 9977f96141b..3dac47653f2 100644
--- a/addons/base_calendar/security/ir.model.access.csv
+++ b/addons/base_calendar/security/ir.model.access.csv
@@ -1,7 +1,7 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_calendar_attendee","calendar.attendee","model_calendar_attendee","base.group_user",1,1,1,1
-"access_calendar_alarm","calendar.alarm","model_calendar_alarm","base.group_user",1,1,1,1
-"access_res_alarm","res.alarm","model_res_alarm","base.group_user",1,1,1,1
-"access_calendar_todo","calendar.todo","model_calendar_todo","base.group_user",1,1,1,1
-"access_calendar_event","calendar.event","model_calendar_event","base.group_user",1,1,1,1
-"access_calendar_attendee_survey_user","calendar.attendee","model_calendar_attendee","base.group_survey_user",1,0,0,0
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_calendar_attendee,calendar.attendee,model_calendar_attendee,base.group_user,1,1,1,1
+access_calendar_alarm,calendar.alarm,model_calendar_alarm,base.group_user,1,1,1,1
+access_res_alarm,res.alarm,model_res_alarm,base.group_user,1,1,1,1
+access_calendar_todo,calendar.todo,model_calendar_todo,base.group_user,1,1,1,1
+access_calendar_event,calendar.event,model_calendar_event,base.group_user,1,1,1,1
+access_calendar_attendee_survey_user,calendar.attendee,model_calendar_attendee,base.group_survey_user,1,0,0,0
diff --git a/addons/crm/test/test_crm_recurrent_meeting_case2.yml b/addons/base_calendar/test/test_crm_recurrent_meeting_case2.yml
similarity index 98%
rename from addons/crm/test/test_crm_recurrent_meeting_case2.yml
rename to addons/base_calendar/test/test_crm_recurrent_meeting_case2.yml
index b6afeb6906e..693f0d81c6b 100644
--- a/addons/crm/test/test_crm_recurrent_meeting_case2.yml
+++ b/addons/base_calendar/test/test_crm_recurrent_meeting_case2.yml
@@ -72,7 +72,7 @@
!python {model: crm.meeting}: |
from base_calendar import base_calendar
base_cal_id = base_calendar.real_id2base_calendar_id(ref('crm_meeting_sprintreview0'), '2011-09-01 13:01:00')
- self.write(cr, uid, [base_cal_id], {'name': 'Sprint Review for google modules', 'edit_all': True})
+ self.write(cr, uid, [base_cal_id], {'name': 'Sprint Review for google modules'})
-
I check whether all the records are edited or not.
-
diff --git a/addons/base_contact/__openerp__.py b/addons/base_contact/__openerp__.py
index 5537d6f91eb..0f78103a187 100644
--- a/addons/base_contact/__openerp__.py
+++ b/addons/base_contact/__openerp__.py
@@ -21,9 +21,9 @@
{
- 'name': 'Base Contact',
+ 'name': 'Contacts Management',
'version': '1.0',
- 'category': 'Hidden',
+ 'category': 'Customer Relationship Management',
'complexity': "expert",
'description': """
This module allows you to manage your contacts entirely.
diff --git a/addons/base_contact/base_contact_demo.xml b/addons/base_contact/base_contact_demo.xml
index 393c318015c..35390caca77 100644
--- a/addons/base_contact/base_contact_demo.xml
+++ b/addons/base_contact/base_contact_demo.xml
@@ -146,7 +146,11 @@
-
+
+
@@ -154,7 +158,11 @@
-
+
+
@@ -162,7 +170,11 @@
-
+
+
diff --git a/addons/base_contact/i18n/ar.po b/addons/base_contact/i18n/ar.po
index 6264b1aa32d..e5610421181 100644
--- a/addons/base_contact/i18n/ar.po
+++ b/addons/base_contact/i18n/ar.po
@@ -7,104 +7,104 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
-"PO-Revision-Date: 2009-02-03 06:25+0000\n"
-"Last-Translator: <>\n"
+"PO-Revision-Date: 2011-12-03 15:19+0000\n"
+"Last-Translator: kifcaliph \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 05:04+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-04 04:43+0000\n"
+"X-Generator: Launchpad (build 14418)\n"
#. module: base_contact
#: field:res.partner.contact,title:0
msgid "Title"
-msgstr ""
+msgstr "اللقب"
#. module: base_contact
#: view:res.partner.address:0
msgid "# of Contacts"
-msgstr ""
+msgstr "عدد جهات الاتصال"
#. module: base_contact
#: field:res.partner.job,fax:0
msgid "Fax"
-msgstr ""
+msgstr "فاكس"
#. module: base_contact
#: view:base.contact.installer:0
msgid "title"
-msgstr ""
+msgstr "الاسم"
#. module: base_contact
#: help:res.partner.job,date_start:0
msgid "Start date of job(Joining Date)"
-msgstr ""
+msgstr "تاريخ الالتحاق بالوظيفة"
#. module: base_contact
#: view:base.contact.installer:0
msgid "Select the Option for Addresses Migration"
-msgstr ""
+msgstr "حدد الخيار لنقل العناوين"
#. module: base_contact
#: help:res.partner.job,function:0
msgid "Function of this contact with this partner"
-msgstr ""
+msgstr "مهمة جهة الاتصال هذه عند هذا الشريك"
#. module: base_contact
#: help:res.partner.job,state:0
msgid "Status of Address"
-msgstr ""
+msgstr "حالة العنوان"
#. module: base_contact
#: help:res.partner.job,name:0
msgid ""
"You may enter Address first,Partner will be linked "
"automatically if any."
-msgstr ""
+msgstr "يمكنك إدخال العنوان أولاً، وسيتمّ ربط الشريك تلقائياً إن وُجِد."
#. module: base_contact
#: help:res.partner.job,fax:0
msgid "Job FAX no."
-msgstr ""
+msgstr "فاكس العمل"
#. module: base_contact
#: field:res.partner.contact,mobile:0
msgid "Mobile"
-msgstr ""
+msgstr "الجوال"
#. module: base_contact
#: view:res.partner.contact:0
#: field:res.partner.contact,comment:0
msgid "Notes"
-msgstr ""
+msgstr "ملاحظات"
#. module: base_contact
#: model:process.node,note:base_contact.process_node_contacts0
msgid "People you work with."
-msgstr ""
+msgstr "أشخاص تعمل معهم."
#. module: base_contact
#: model:process.transition,note:base_contact.process_transition_functiontoaddress0
msgid "Define functions and address."
-msgstr ""
+msgstr "تعريف المهام والعنوان"
#. module: base_contact
#: help:res.partner.job,date_stop:0
msgid "Last date of job"
-msgstr ""
+msgstr "تاريخ ترك الوظيفة"
#. module: base_contact
#: view:base.contact.installer:0
#: field:base.contact.installer,migrate:0
msgid "Migrate"
-msgstr ""
+msgstr "نقل"
#. module: base_contact
#: view:res.partner.contact:0
#: field:res.partner.job,name:0
msgid "Partner"
-msgstr ""
+msgstr "الشريك"
#. module: base_contact
#: model:process.node,note:base_contact.process_node_function0
@@ -114,12 +114,12 @@ msgstr ""
#. module: base_contact
#: model:process.node,name:base_contact.process_node_partners0
msgid "Partners"
-msgstr ""
+msgstr "الشركاء"
#. module: base_contact
#: field:res.partner.job,state:0
msgid "State"
-msgstr ""
+msgstr "المحافظة"
#. module: base_contact
#: help:res.partner.contact,active:0
@@ -151,27 +151,42 @@ msgid ""
"an other object.\n"
" "
msgstr ""
+"\n"
+" تمكنك هذه الوحدة البرمجية من إدارة جهات الاتصال بشكل كامل.\n"
+" فهي تسمح لك بـتعرف:\n"
+" * جهات اتصال غير ذات صلة بشريك،\n"
+" * جهات اتصال ذات عناوين عمل متعددة (ربما لارتباطها بشركاء مختلفين)،\n"
+" * جهات اتصال ذات مهام مختلفة لكل عنوان من عناوين وظائفها\n"
+"\n"
+" كذلك تضيف هذه الوحدة البرمجية عناصر جديدة إلى القائمة تحت\n"
+" الشركاء / جهات الاتصال\n"
+" الشركاء / المهام\n"
+"\n"
+" تنبه إلى أن هذه الوحدة البرمجية تقوم بتحويل العناوين الموجودة مسبقاً إلى "
+"\"عناوين\" و \"جهات اتصال\"، مما يعني أن بعض حقول العناوين سيتم حذفها (مثل "
+"اسم جهة الاتصال) لأنه من المفترض أن يتم تعريفها في كائن آخر.\n"
+" "
#. module: base_contact
#: model:ir.module.module,shortdesc:base_contact.module_meta_information
#: model:process.process,name:base_contact.process_process_basecontactprocess0
msgid "Base Contact"
-msgstr ""
+msgstr "جهة الاتصال الأساسية"
#. module: base_contact
#: field:res.partner.job,date_stop:0
msgid "Date Stop"
-msgstr ""
+msgstr "تاريخ التوقف"
#. module: base_contact
#: model:ir.actions.act_window,name:base_contact.action_res_partner_job
msgid "Contact's Jobs"
-msgstr ""
+msgstr "الوظائف"
#. module: base_contact
#: view:res.partner:0
msgid "Categories"
-msgstr ""
+msgstr "الفئات"
#. module: base_contact
#: help:res.partner.job,sequence_partner:0
@@ -179,70 +194,72 @@ msgid ""
"Order of importance of this job title in the list of job "
"title of the linked partner"
msgstr ""
+"ترتيب المسمى الوظيفي هذا حسب الأهمية بين المسميات الوظيغية المستخدمة لدى "
+"الشريك"
#. module: base_contact
#: field:res.partner.job,extension:0
msgid "Extension"
-msgstr ""
+msgstr "الامتداد"
#. module: base_contact
#: help:res.partner.job,extension:0
msgid "Internal/External extension phone number"
-msgstr ""
+msgstr "امتداد رقم الهاتف الداخلي/الخارجي"
#. module: base_contact
#: help:res.partner.job,phone:0
msgid "Job Phone no."
-msgstr ""
+msgstr "هاتف العمل"
#. module: base_contact
#: view:res.partner.contact:0
#: field:res.partner.contact,job_ids:0
msgid "Functions and Addresses"
-msgstr ""
+msgstr "المهام والعناوين"
#. module: base_contact
#: model:ir.model,name:base_contact.model_res_partner_contact
#: field:res.partner.job,contact_id:0
msgid "Contact"
-msgstr ""
+msgstr "جهة الاتصال"
#. module: base_contact
#: help:res.partner.job,email:0
msgid "Job E-Mail"
-msgstr ""
+msgstr "البريد الإلكتروني للعمل"
#. module: base_contact
#: field:res.partner.job,sequence_partner:0
msgid "Partner Seq."
-msgstr ""
+msgstr "رقم الشريك"
#. module: base_contact
#: model:process.transition,name:base_contact.process_transition_functiontoaddress0
msgid "Function to address"
-msgstr ""
+msgstr "مهمة إلى عنوان"
#. module: base_contact
#: field:base.contact.installer,progress:0
msgid "Configuration Progress"
-msgstr ""
+msgstr "سير الإعدادات"
#. module: base_contact
#: field:res.partner.contact,name:0
msgid "Last Name"
-msgstr ""
+msgstr "اسم العائلة"
#. module: base_contact
#: view:res.partner:0
#: view:res.partner.contact:0
msgid "Communication"
-msgstr ""
+msgstr "التواصل"
#. module: base_contact
#: field:base.contact.installer,config_logo:0
#: field:res.partner.contact,photo:0
msgid "Image"
-msgstr ""
+msgstr "صورة"
#. module: base_contact
#: selection:res.partner.job,state:0
@@ -252,7 +269,7 @@ msgstr ""
#. module: base_contact
#: model:ir.model,name:base_contact.model_res_partner_address
msgid "Partner Addresses"
-msgstr ""
+msgstr "عناوين الشريك"
#. module: base_contact
#: view:base.contact.installer:0
@@ -262,12 +279,12 @@ msgstr ""
#. module: base_contact
#: field:res.partner.job,sequence_contact:0
msgid "Contact Seq."
-msgstr ""
+msgstr "رقم جهة الاتصال"
#. module: base_contact
#: view:res.partner.address:0
msgid "Search Contact"
-msgstr ""
+msgstr "بحث جهة الإتصال"
#. module: base_contact
#: model:ir.actions.act_window,name:base_contact.action_partner_contact_form
@@ -277,7 +294,7 @@ msgstr ""
#: view:res.partner:0
#: field:res.partner.address,job_ids:0
msgid "Contacts"
-msgstr ""
+msgstr "جهات الاتصال"
#. module: base_contact
#: view:base.contact.installer:0
@@ -289,58 +306,58 @@ msgstr ""
#. module: base_contact
#: model:process.node,note:base_contact.process_node_addresses0
msgid "Working and private addresses."
-msgstr ""
+msgstr "عناوين العمل والعناوين الخاصة"
#. module: base_contact
#: help:res.partner.job,address_id:0
msgid "Address which is linked to the Partner"
-msgstr ""
+msgstr "العنوان المرتبط بالشريك"
#. module: base_contact
#: field:res.partner.job,function:0
msgid "Partner Function"
-msgstr ""
+msgstr "مهمة الشريك"
#. module: base_contact
#: help:res.partner.job,other:0
msgid "Additional phone field"
-msgstr ""
+msgstr "حقل هاتف إضافي"
#. module: base_contact
#: field:res.partner.contact,website:0
msgid "Website"
-msgstr ""
+msgstr "الموقع الإلكتروني"
#. module: base_contact
#: view:base.contact.installer:0
msgid "Otherwise these details will not be visible from address/contact."
-msgstr ""
+msgstr "وإلا فلن تظهر هذه التفاصيل في العنوان/جهة الاتصال."
#. module: base_contact
#: view:base.contact.installer:0
msgid "Configure"
-msgstr ""
+msgstr "ضبط الإعدادات"
#. module: base_contact
#: field:res.partner.contact,email:0
#: field:res.partner.job,email:0
msgid "E-Mail"
-msgstr ""
+msgstr "البريد الإلكتروني"
#. module: base_contact
#: model:ir.model,name:base_contact.model_base_contact_installer
msgid "base.contact.installer"
-msgstr ""
+msgstr "base.contact.installer"
#. module: base_contact
#: view:res.partner.job:0
msgid "Contact Functions"
-msgstr ""
+msgstr "مهام جهة الاتصال"
#. module: base_contact
#: field:res.partner.job,phone:0
msgid "Phone"
-msgstr ""
+msgstr "هاتف"
#. module: base_contact
#: view:base.contact.installer:0
@@ -350,164 +367,164 @@ msgstr ""
#. module: base_contact
#: field:res.partner.contact,active:0
msgid "Active"
-msgstr ""
+msgstr "نشِط"
#. module: base_contact
#: field:res.partner.contact,function:0
msgid "Main Function"
-msgstr ""
+msgstr "المهمة الرئيسية"
#. module: base_contact
#: model:process.transition,note:base_contact.process_transition_partnertoaddress0
msgid "Define partners and their addresses."
-msgstr ""
+msgstr "تعريف الشركاء وعناوينهم"
#. module: base_contact
#: view:res.partner.contact:0
msgid "Seq."
-msgstr ""
+msgstr "رقم"
#. module: base_contact
#: field:res.partner.contact,lang_id:0
msgid "Language"
-msgstr ""
+msgstr "اللغة"
#. module: base_contact
#: view:res.partner.contact:0
msgid "Extra Information"
-msgstr ""
+msgstr "معلومات إضافية"
#. module: base_contact
#: model:process.node,note:base_contact.process_node_partners0
msgid "Companies you work with."
-msgstr ""
+msgstr "الشركات التي تتعامل معها."
#. module: base_contact
#: view:res.partner.contact:0
msgid "Partner Contact"
-msgstr ""
+msgstr "جهة الاتصال بالشريك"
#. module: base_contact
#: view:res.partner.contact:0
msgid "General"
-msgstr ""
+msgstr "عام"
#. module: base_contact
#: view:res.partner.contact:0
msgid "Photo"
-msgstr ""
+msgstr "صورة"
#. module: base_contact
#: field:res.partner.contact,birthdate:0
msgid "Birth Date"
-msgstr ""
+msgstr "تاريخ الميلاد"
#. module: base_contact
#: help:base.contact.installer,migrate:0
msgid "If you select this, all addresses will be migrated."
-msgstr ""
+msgstr "إذا اخترت هذا الخيار، سيتم نقل جميع العناوين."
#. module: base_contact
#: selection:res.partner.job,state:0
msgid "Current"
-msgstr ""
+msgstr "الحالي"
#. module: base_contact
#: field:res.partner.contact,first_name:0
msgid "First Name"
-msgstr ""
+msgstr "الاسم الأول"
#. module: base_contact
#: model:ir.model,name:base_contact.model_res_partner_job
msgid "Contact Partner Function"
-msgstr ""
+msgstr "مهمة الشريك"
#. module: base_contact
#: field:res.partner.job,other:0
msgid "Other"
-msgstr ""
+msgstr "غير ذلك"
#. module: base_contact
#: model:process.node,name:base_contact.process_node_function0
msgid "Function"
-msgstr ""
+msgstr "المهمة"
#. module: base_contact
#: field:res.partner.address,job_id:0
#: field:res.partner.contact,job_id:0
msgid "Main Job"
-msgstr ""
+msgstr "الوظيفة الرئيسية"
#. module: base_contact
#: model:process.transition,note:base_contact.process_transition_contacttofunction0
msgid "Defines contacts and functions."
-msgstr ""
+msgstr "تعريف جهات الاتصال والمهام."
#. module: base_contact
#: model:process.transition,name:base_contact.process_transition_contacttofunction0
msgid "Contact to function"
-msgstr ""
+msgstr "جهة اتصال إلى مهمة"
#. module: base_contact
#: view:res.partner:0
#: field:res.partner.job,address_id:0
msgid "Address"
-msgstr ""
+msgstr "العنوان"
#. module: base_contact
#: field:res.partner.contact,country_id:0
msgid "Nationality"
-msgstr ""
+msgstr "الجنسية"
#. module: base_contact
#: model:ir.actions.act_window,name:base_contact.act_res_partner_jobs
msgid "Open Jobs"
-msgstr ""
+msgstr "الوظائف المفتوحة"
#. module: base_contact
#: field:base.contact.installer,name:0
msgid "Name"
-msgstr ""
+msgstr "الاسم"
#. module: base_contact
#: view:base.contact.installer:0
msgid "You can migrate Partner's current addresses to the contact."
-msgstr ""
+msgstr "يمكنك نقل العناوين الحالية للشريك إلى جهة الاتصال"
#. module: base_contact
#: field:res.partner.contact,partner_id:0
msgid "Main Employer"
-msgstr ""
+msgstr "صاحب العمل الرئيسي"
#. module: base_contact
#: model:ir.actions.act_window,name:base_contact.action_base_contact_installer
msgid "Address Migration"
-msgstr ""
+msgstr "نقل العنوان"
#. module: base_contact
#: view:res.partner:0
msgid "Postal Address"
-msgstr ""
+msgstr "العنوان البريدي"
#. module: base_contact
#: model:process.node,name:base_contact.process_node_addresses0
#: view:res.partner:0
msgid "Addresses"
-msgstr ""
+msgstr "العناوين"
#. module: base_contact
#: model:process.transition,name:base_contact.process_transition_partnertoaddress0
msgid "Partner to address"
-msgstr ""
+msgstr "شريك إلى عنوان"
#. module: base_contact
#: field:res.partner.job,date_start:0
msgid "Date Start"
-msgstr ""
+msgstr "تاريخ البدء"
#. module: base_contact
#: help:res.partner.job,sequence_contact:0
msgid ""
"Order of importance of this address in the list of "
"addresses of the linked contact"
-msgstr ""
+msgstr "ترتيب هذا العنوان حسب الأهمية بين عناوين جهة الاتصال"
diff --git a/addons/base_contact/i18n/cs.po b/addons/base_contact/i18n/cs.po
index c93c7f7f7ba..2e4b8e18e42 100644
--- a/addons/base_contact/i18n/cs.po
+++ b/addons/base_contact/i18n/cs.po
@@ -4,17 +4,18 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 6.0dev\n"
+"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
-"PO-Revision-Date: 2010-08-03 00:58+0000\n"
-"Last-Translator: Mantavya Gajjar (Open ERP) \n"
-"Language-Team: \n"
+"PO-Revision-Date: 2011-11-25 12:34+0000\n"
+"Last-Translator: Jiří Hajda \n"
+"Language-Team: Czech \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 05:04+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-11-26 05:49+0000\n"
+"X-Generator: Launchpad (build 14381)\n"
+"X-Poedit-Language: Czech\n"
#. module: base_contact
#: field:res.partner.contact,title:0
@@ -24,7 +25,7 @@ msgstr "Název"
#. module: base_contact
#: view:res.partner.address:0
msgid "# of Contacts"
-msgstr ""
+msgstr "# z kontaktů"
#. module: base_contact
#: field:res.partner.job,fax:0
@@ -34,27 +35,27 @@ msgstr "Fax"
#. module: base_contact
#: view:base.contact.installer:0
msgid "title"
-msgstr ""
+msgstr "nadpis"
#. module: base_contact
#: help:res.partner.job,date_start:0
msgid "Start date of job(Joining Date)"
-msgstr ""
+msgstr "Datum zahájení práce (datum připojení)"
#. module: base_contact
#: view:base.contact.installer:0
msgid "Select the Option for Addresses Migration"
-msgstr ""
+msgstr "Vyberte volbu pro přesun adres"
#. module: base_contact
#: help:res.partner.job,function:0
msgid "Function of this contact with this partner"
-msgstr ""
+msgstr "Funkce tohoto kontaktu s tímto partnerem"
#. module: base_contact
#: help:res.partner.job,state:0
msgid "Status of Address"
-msgstr ""
+msgstr "Stav adresy"
#. module: base_contact
#: help:res.partner.job,name:0
@@ -62,64 +63,66 @@ msgid ""
"You may enter Address first,Partner will be linked "
"automatically if any."
msgstr ""
+"Můžete zadat nejdříve adresu. Pokud je nějaký partner, "
+"bude napojen automaticky."
#. module: base_contact
#: help:res.partner.job,fax:0
msgid "Job FAX no."
-msgstr ""
+msgstr "Číslo FAXu do práce"
#. module: base_contact
#: field:res.partner.contact,mobile:0
msgid "Mobile"
-msgstr ""
+msgstr "Mobil"
#. module: base_contact
#: view:res.partner.contact:0
#: field:res.partner.contact,comment:0
msgid "Notes"
-msgstr ""
+msgstr "Poznámky"
#. module: base_contact
#: model:process.node,note:base_contact.process_node_contacts0
msgid "People you work with."
-msgstr ""
+msgstr "Lidé, s kterými pracujete."
#. module: base_contact
#: model:process.transition,note:base_contact.process_transition_functiontoaddress0
msgid "Define functions and address."
-msgstr ""
+msgstr "Určit funkce a adresu."
#. module: base_contact
#: help:res.partner.job,date_stop:0
msgid "Last date of job"
-msgstr ""
+msgstr "Poslední datum práce"
#. module: base_contact
#: view:base.contact.installer:0
#: field:base.contact.installer,migrate:0
msgid "Migrate"
-msgstr ""
+msgstr "Přesunout"
#. module: base_contact
#: view:res.partner.contact:0
#: field:res.partner.job,name:0
msgid "Partner"
-msgstr ""
+msgstr "Partner"
#. module: base_contact
#: model:process.node,note:base_contact.process_node_function0
msgid "Jobs at a same partner address."
-msgstr ""
+msgstr "Pracovní pozice u stejné adresy partnera."
#. module: base_contact
#: model:process.node,name:base_contact.process_node_partners0
msgid "Partners"
-msgstr ""
+msgstr "Partneři"
#. module: base_contact
#: field:res.partner.job,state:0
msgid "State"
-msgstr ""
+msgstr "Stav"
#. module: base_contact
#: help:res.partner.contact,active:0
@@ -127,6 +130,8 @@ msgid ""
"If the active field is set to False, it will allow you to "
"hide the partner contact without removing it."
msgstr ""
+"Pokud je aktivní pole nastaveno na Nepravda, umožní vám to "
+"skrýt kontakt partnera bez jeho odstranění."
#. module: base_contact
#: model:ir.module.module,description:base_contact.module_meta_information
@@ -151,22 +156,40 @@ msgid ""
"an other object.\n"
" "
msgstr ""
+"\n"
+" Tento modul umožňuje úplně spravovat vaše kontakty.\n"
+"\n"
+" Nechá vás určit\n"
+" *kontakty nevztažené k partnerovi,\n"
+" *kontakty pracující na několika adresách (případně i pro různé "
+"partnery),\n"
+" *kontakty s možnými různými funkcemi pro každou jeho pracovní "
+"adresu\n"
+"\n"
+" Také přidává nové položky nabídky umístěné v\n"
+" Partneři \\ Kontakty\n"
+" Partneři \\ Funkce\n"
+"\n"
+" Berte na vědomí, že tento modul převádí existující adresy na \"adresy + "
+"kontakty\". To znamená, že některé pole adres budou chybět (jako jméno "
+"kontaktu), protože ty jsou definovány v jiném objektu.\n"
+" "
#. module: base_contact
#: model:ir.module.module,shortdesc:base_contact.module_meta_information
#: model:process.process,name:base_contact.process_process_basecontactprocess0
msgid "Base Contact"
-msgstr ""
+msgstr "Základní kontakt"
#. module: base_contact
#: field:res.partner.job,date_stop:0
msgid "Date Stop"
-msgstr ""
+msgstr "Datum zastavení"
#. module: base_contact
#: model:ir.actions.act_window,name:base_contact.action_res_partner_job
msgid "Contact's Jobs"
-msgstr ""
+msgstr "Pozice kontaktu"
#. module: base_contact
#: view:res.partner:0
@@ -179,95 +202,97 @@ msgid ""
"Order of importance of this job title in the list of job "
"title of the linked partner"
msgstr ""
+"Pořadí důležitosti této pracovní pozice v seznamu titulů "
+"pozic napojeného partnera"
#. module: base_contact
#: field:res.partner.job,extension:0
msgid "Extension"
-msgstr ""
+msgstr "Rozšíření"
#. module: base_contact
#: help:res.partner.job,extension:0
msgid "Internal/External extension phone number"
-msgstr ""
+msgstr "Vnitřní/vnější telefoní číslo klapky"
#. module: base_contact
#: help:res.partner.job,phone:0
msgid "Job Phone no."
-msgstr ""
+msgstr "Telefoní číslo do práce."
#. module: base_contact
#: view:res.partner.contact:0
#: field:res.partner.contact,job_ids:0
msgid "Functions and Addresses"
-msgstr ""
+msgstr "Funkce a adresy"
#. module: base_contact
#: model:ir.model,name:base_contact.model_res_partner_contact
#: field:res.partner.job,contact_id:0
msgid "Contact"
-msgstr ""
+msgstr "Kontakt"
#. module: base_contact
#: help:res.partner.job,email:0
msgid "Job E-Mail"
-msgstr ""
+msgstr "Pracovní E-Mail"
#. module: base_contact
#: field:res.partner.job,sequence_partner:0
msgid "Partner Seq."
-msgstr ""
+msgstr "Poř. parnera"
#. module: base_contact
#: model:process.transition,name:base_contact.process_transition_functiontoaddress0
msgid "Function to address"
-msgstr ""
+msgstr "Funkce na adresu"
#. module: base_contact
#: field:base.contact.installer,progress:0
msgid "Configuration Progress"
-msgstr ""
+msgstr "Průběh nastavení"
#. module: base_contact
#: field:res.partner.contact,name:0
msgid "Last Name"
-msgstr ""
+msgstr "Příjmení"
#. module: base_contact
#: view:res.partner:0
#: view:res.partner.contact:0
msgid "Communication"
-msgstr ""
+msgstr "Komunikace"
#. module: base_contact
#: field:base.contact.installer,config_logo:0
#: field:res.partner.contact,photo:0
msgid "Image"
-msgstr ""
+msgstr "Obrázek"
#. module: base_contact
#: selection:res.partner.job,state:0
msgid "Past"
-msgstr ""
+msgstr "Minulý"
#. module: base_contact
#: model:ir.model,name:base_contact.model_res_partner_address
msgid "Partner Addresses"
-msgstr ""
+msgstr "Adresy partnerů"
#. module: base_contact
#: view:base.contact.installer:0
msgid "Address's Migration to Contacts"
-msgstr ""
+msgstr "Stěhování adresy na kontakty"
#. module: base_contact
#: field:res.partner.job,sequence_contact:0
msgid "Contact Seq."
-msgstr ""
+msgstr "Poř. kontaktu"
#. module: base_contact
#: view:res.partner.address:0
msgid "Search Contact"
-msgstr ""
+msgstr "Hledat kontakt"
#. module: base_contact
#: model:ir.actions.act_window,name:base_contact.action_partner_contact_form
@@ -277,7 +302,7 @@ msgstr ""
#: view:res.partner:0
#: field:res.partner.address,job_ids:0
msgid "Contacts"
-msgstr "Kotakty"
+msgstr "Kontakty"
#. module: base_contact
#: view:base.contact.installer:0
@@ -285,52 +310,54 @@ msgid ""
"Due to changes in Address and Partner's relation, some of the details from "
"address are needed to be migrated into contact information."
msgstr ""
+"Kvůli změnám v adrese a vztahu partnera, některé podrobnosti adresy jsou "
+"potřebné, aby byly přesunuty do informací účtu."
#. module: base_contact
#: model:process.node,note:base_contact.process_node_addresses0
msgid "Working and private addresses."
-msgstr ""
+msgstr "Pracovní a soukromé adresy."
#. module: base_contact
#: help:res.partner.job,address_id:0
msgid "Address which is linked to the Partner"
-msgstr ""
+msgstr "Adresa, která je napojena na partnera"
#. module: base_contact
#: field:res.partner.job,function:0
msgid "Partner Function"
-msgstr ""
+msgstr "Funkce partnera"
#. module: base_contact
#: help:res.partner.job,other:0
msgid "Additional phone field"
-msgstr ""
+msgstr "Doplňující pole telefonu"
#. module: base_contact
#: field:res.partner.contact,website:0
msgid "Website"
-msgstr ""
+msgstr "Webová stránka"
#. module: base_contact
#: view:base.contact.installer:0
msgid "Otherwise these details will not be visible from address/contact."
-msgstr ""
+msgstr "Jinak tyto podrobnosti nebudou viditelné z adresy/kontaktu."
#. module: base_contact
#: view:base.contact.installer:0
msgid "Configure"
-msgstr ""
+msgstr "Nastavit"
#. module: base_contact
#: field:res.partner.contact,email:0
#: field:res.partner.job,email:0
msgid "E-Mail"
-msgstr ""
+msgstr "E-mail"
#. module: base_contact
#: model:ir.model,name:base_contact.model_base_contact_installer
msgid "base.contact.installer"
-msgstr ""
+msgstr "base.contact.installer"
#. module: base_contact
#: view:res.partner.job:0
@@ -345,27 +372,27 @@ msgstr "Telefon"
#. module: base_contact
#: view:base.contact.installer:0
msgid "Do you want to migrate your Address data in Contact Data?"
-msgstr ""
+msgstr "Chcete stěhovat vaše data adresy v datech kontaktu?"
#. module: base_contact
#: field:res.partner.contact,active:0
msgid "Active"
-msgstr ""
+msgstr "Aktivní"
#. module: base_contact
#: field:res.partner.contact,function:0
msgid "Main Function"
-msgstr ""
+msgstr "Hlavní funkce"
#. module: base_contact
#: model:process.transition,note:base_contact.process_transition_partnertoaddress0
msgid "Define partners and their addresses."
-msgstr ""
+msgstr "Určuje partnery a jejich adresy."
#. module: base_contact
#: view:res.partner.contact:0
msgid "Seq."
-msgstr ""
+msgstr "Poř."
#. module: base_contact
#: field:res.partner.contact,lang_id:0
@@ -375,37 +402,37 @@ msgstr "Jazyk"
#. module: base_contact
#: view:res.partner.contact:0
msgid "Extra Information"
-msgstr ""
+msgstr "Speciální informace"
#. module: base_contact
#: model:process.node,note:base_contact.process_node_partners0
msgid "Companies you work with."
-msgstr ""
+msgstr "Společnosti, se kterými pracujete."
#. module: base_contact
#: view:res.partner.contact:0
msgid "Partner Contact"
-msgstr ""
+msgstr "Kontakt partnera"
#. module: base_contact
#: view:res.partner.contact:0
msgid "General"
-msgstr ""
+msgstr "Obecný"
#. module: base_contact
#: view:res.partner.contact:0
msgid "Photo"
-msgstr ""
+msgstr "Fotka"
#. module: base_contact
#: field:res.partner.contact,birthdate:0
msgid "Birth Date"
-msgstr ""
+msgstr "Datum narození"
#. module: base_contact
#: help:base.contact.installer,migrate:0
msgid "If you select this, all addresses will be migrated."
-msgstr ""
+msgstr "Pokud toto vyberete, všechny adresy budou přesunuty."
#. module: base_contact
#: selection:res.partner.job,state:0
@@ -420,12 +447,12 @@ msgstr "Křestní jméno"
#. module: base_contact
#: model:ir.model,name:base_contact.model_res_partner_job
msgid "Contact Partner Function"
-msgstr ""
+msgstr "Kontakt funkce partnera"
#. module: base_contact
#: field:res.partner.job,other:0
msgid "Other"
-msgstr ""
+msgstr "Jiné"
#. module: base_contact
#: model:process.node,name:base_contact.process_node_function0
@@ -436,17 +463,17 @@ msgstr "Funkce"
#: field:res.partner.address,job_id:0
#: field:res.partner.contact,job_id:0
msgid "Main Job"
-msgstr ""
+msgstr "Hlavní práce"
#. module: base_contact
#: model:process.transition,note:base_contact.process_transition_contacttofunction0
msgid "Defines contacts and functions."
-msgstr ""
+msgstr "Určuje kontakty a funkce."
#. module: base_contact
#: model:process.transition,name:base_contact.process_transition_contacttofunction0
msgid "Contact to function"
-msgstr ""
+msgstr "Kontakt na funkci"
#. module: base_contact
#: view:res.partner:0
@@ -457,53 +484,53 @@ msgstr "Adresa"
#. module: base_contact
#: field:res.partner.contact,country_id:0
msgid "Nationality"
-msgstr ""
+msgstr "Národnost"
#. module: base_contact
#: model:ir.actions.act_window,name:base_contact.act_res_partner_jobs
msgid "Open Jobs"
-msgstr ""
+msgstr "Otevřené pozice"
#. module: base_contact
#: field:base.contact.installer,name:0
msgid "Name"
-msgstr ""
+msgstr "Jméno"
#. module: base_contact
#: view:base.contact.installer:0
msgid "You can migrate Partner's current addresses to the contact."
-msgstr ""
+msgstr "Můžete stěhovat partnerovu aktuální adresu do kontaktu."
#. module: base_contact
#: field:res.partner.contact,partner_id:0
msgid "Main Employer"
-msgstr ""
+msgstr "Hlavní zaměstnavatel"
#. module: base_contact
#: model:ir.actions.act_window,name:base_contact.action_base_contact_installer
msgid "Address Migration"
-msgstr ""
+msgstr "Stěhování adresy"
#. module: base_contact
#: view:res.partner:0
msgid "Postal Address"
-msgstr ""
+msgstr "Poštovní adresa"
#. module: base_contact
#: model:process.node,name:base_contact.process_node_addresses0
#: view:res.partner:0
msgid "Addresses"
-msgstr ""
+msgstr "Adresy"
#. module: base_contact
#: model:process.transition,name:base_contact.process_transition_partnertoaddress0
msgid "Partner to address"
-msgstr ""
+msgstr "Partner na adresu"
#. module: base_contact
#: field:res.partner.job,date_start:0
msgid "Date Start"
-msgstr ""
+msgstr "Počáteční datum"
#. module: base_contact
#: help:res.partner.job,sequence_contact:0
@@ -511,6 +538,8 @@ msgid ""
"Order of importance of this address in the list of "
"addresses of the linked contact"
msgstr ""
+"Pořadí podle důležitosti této adresy v seznamu adres napojeného "
+"kontaktu"
#~ msgid "Invalid XML for View Architecture!"
#~ msgstr "Invalidní XML pro zobrazení architektury!"
diff --git a/addons/base_contact/security/ir.model.access.csv b/addons/base_contact/security/ir.model.access.csv
index 16cfad100a3..a44b5450a54 100644
--- a/addons/base_contact/security/ir.model.access.csv
+++ b/addons/base_contact/security/ir.model.access.csv
@@ -1,7 +1,7 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_res_partner_contact","res.partner.contact","model_res_partner_contact","base.group_partner_manager",1,1,1,1
-"access_res_partner_job","res.partner.job","model_res_partner_job","base.group_partner_manager",1,1,1,1
-"access_res_partner_contact_all","res.partner.contact all","model_res_partner_contact","base.group_user",1,0,0,0
-"access_res_partner_job_all","res.partner.job all","model_res_partner_job","base.group_user",1,0,0,0
-"access_group_sale_salesman","res.partner.contact.sale.salesman","model_res_partner_contact","base.group_sale_salesman",1,1,1,0
-"access_res_partner_job_salesman","res.partner.job.salesman","model_res_partner_job","base.group_sale_salesman",1,1,1,0
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_res_partner_contact,res.partner.contact,model_res_partner_contact,base.group_partner_manager,1,1,1,1
+access_res_partner_job,res.partner.job,model_res_partner_job,base.group_partner_manager,1,1,1,1
+access_res_partner_contact_all,res.partner.contact all,model_res_partner_contact,base.group_user,1,0,0,0
+access_res_partner_job_all,res.partner.job all,model_res_partner_job,base.group_user,1,0,0,0
+access_group_sale_salesman,res.partner.contact.sale.salesman,model_res_partner_contact,base.group_sale_salesman,1,1,1,0
+access_res_partner_job_salesman,res.partner.job.salesman,model_res_partner_job,base.group_sale_salesman,1,1,1,0
diff --git a/addons/base_contact/test/base_contact00.yml b/addons/base_contact/test/base_contact00.yml
index c6a4ed9e057..775b5636caa 100644
--- a/addons/base_contact/test/base_contact00.yml
+++ b/addons/base_contact/test/base_contact00.yml
@@ -64,7 +64,7 @@
country_id: base.be
first_name: Nicolas
job_ids:
- - address_id: base.main_address
+ - address_id: base.res_partner_address_1
function: CTO
state: current
- address_id: base.res_partner_address_3000
diff --git a/addons/base_crypt/__init__.py b/addons/base_crypt/__init__.py
index a8b9a6b0740..921c536b575 100644
--- a/addons/base_crypt/__init__.py
+++ b/addons/base_crypt/__init__.py
@@ -21,3 +21,5 @@
from service import security
import crypt
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_crypt/__openerp__.py b/addons/base_crypt/__openerp__.py
index 025f7db0704..fc85100b41c 100644
--- a/addons/base_crypt/__openerp__.py
+++ b/addons/base_crypt/__openerp__.py
@@ -19,12 +19,12 @@
#
##############################################################################
{
- "name" : "Base - Password Encryption",
+ "name" : "DB Password Encryption",
"version" : "1.1",
"author" : ['OpenERP SA', "FS3"],
"maintainer" : "OpenERP SA",
"website" : "http://www.openerp.com",
- "category" : "Hidden",
+ "category" : "Tools",
'complexity': "easy",
"description": """
Replaces cleartext passwords in the database with a secure hash
@@ -62,3 +62,5 @@ will disable LDAP authentication completely if installed at the same time.
"installable": True,
"certificate" : "00721290471310299725",
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_crypt/i18n/oc.po b/addons/base_crypt/i18n/oc.po
new file mode 100644
index 00000000000..ef234e97cb7
--- /dev/null
+++ b/addons/base_crypt/i18n/oc.po
@@ -0,0 +1,73 @@
+# Occitan (post 1500) translation for openobject-addons
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2011-01-11 11:14+0000\n"
+"PO-Revision-Date: 2011-11-20 09:17+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Occitan (post 1500) \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
+"X-Generator: Launchpad (build 14299)\n"
+
+#. module: base_crypt
+#: sql_constraint:res.users:0
+msgid "You can not have two users with the same login !"
+msgstr "Podètz pas aver dos utilizaires amb lo meteis identificant !"
+
+#. module: base_crypt
+#: model:ir.model,name:base_crypt.model_res_users
+msgid "res.users"
+msgstr "res.users"
+
+#. module: base_crypt
+#: constraint:res.users:0
+msgid "The chosen company is not in the allowed companies for this user"
+msgstr ""
+"La societat causida fa pas partida de las societats autorizadas per aqueste "
+"utilizaire"
+
+#. module: base_crypt
+#: code:addons/base_crypt/crypt.py:132
+#, python-format
+msgid "Please specify the password !"
+msgstr "Entratz un senhal"
+
+#. module: base_crypt
+#: model:ir.module.module,shortdesc:base_crypt.module_meta_information
+msgid "Base - Password Encryption"
+msgstr "Basa - Chifratge del senhal"
+
+#. module: base_crypt
+#: code:addons/base_crypt/crypt.py:132
+#, python-format
+msgid "Error"
+msgstr "Error"
+
+#. module: base_crypt
+#: model:ir.module.module,description:base_crypt.module_meta_information
+msgid ""
+"This module replaces the cleartext password in the database with a password "
+"hash,\n"
+"preventing anyone from reading the original password.\n"
+"For your existing user base, the removal of the cleartext passwords occurs "
+"the first time\n"
+"a user logs into the database, after installing base_crypt.\n"
+"After installing this module it won't be possible to recover a forgotten "
+"password for your\n"
+"users, the only solution is for an admin to set a new password.\n"
+"\n"
+"Note: installing this module does not mean you can ignore basic security "
+"measures,\n"
+"as the password is still transmitted unencrypted on the network (by the "
+"client),\n"
+"unless you are using a secure protocol such as XML-RPCS.\n"
+" "
+msgstr ""
diff --git a/addons/base_iban/__openerp__.py b/addons/base_iban/__openerp__.py
index c9bc3866b4f..bf9162601b1 100644
--- a/addons/base_iban/__openerp__.py
+++ b/addons/base_iban/__openerp__.py
@@ -19,9 +19,9 @@
#
##############################################################################
{
- 'name': 'Create IBAN bank accounts',
+ 'name': 'IBAN Bank Accounts',
'version': '1.0',
- 'category': 'Hidden',
+ "category": 'Hidden/Dependency',
'complexity': "easy",
'description': """
This module installs the base for IBAN (International Bank Account Number) bank accounts and checks for its validity.
diff --git a/addons/base_module_doc_rst/__init__.py b/addons/base_module_doc_rst/__init__.py
index f306de84dba..87582ff4c7c 100644
--- a/addons/base_module_doc_rst/__init__.py
+++ b/addons/base_module_doc_rst/__init__.py
@@ -21,3 +21,5 @@
import base_module_doc_rst
import wizard
import report
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_module_doc_rst/__openerp__.py b/addons/base_module_doc_rst/__openerp__.py
index 41425f77749..5e3674269d7 100644
--- a/addons/base_module_doc_rst/__openerp__.py
+++ b/addons/base_module_doc_rst/__openerp__.py
@@ -20,9 +20,9 @@
##############################################################################
{
- 'name': 'Module Technical Guide in Restructured Text ',
+ 'name': 'Generate Docs of Modules',
'version': '1.0',
- 'category': 'Hidden',
+ 'category': 'Tools',
'description': """
This module generates the Technical Guides of selected modules in Restructured Text format (RST).
=================================================================================================
@@ -42,3 +42,5 @@ This module generates the Technical Guides of selected modules in Restructured T
'images': ['images/base_module_doc_rst1.jpeg'],
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_module_doc_rst/report/report_proximity_graph.py b/addons/base_module_doc_rst/report/report_proximity_graph.py
index d14d709f501..b17d4bb517f 100644
--- a/addons/base_module_doc_rst/report/report_proximity_graph.py
+++ b/addons/base_module_doc_rst/report/report_proximity_graph.py
@@ -78,4 +78,5 @@ class report_graph(report.interface.report_int):
pdf_string = self.get_proximity_graph(cr, uid, data['id'])
return (pdf_string, 'pdf')
-report_graph('report.proximity.graph', 'ir.module.module')
\ No newline at end of file
+report_graph('report.proximity.graph', 'ir.module.module')
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_module_doc_rst/wizard/__init__.py b/addons/base_module_doc_rst/wizard/__init__.py
index 6f6e62e8767..c6614aacbc1 100644
--- a/addons/base_module_doc_rst/wizard/__init__.py
+++ b/addons/base_module_doc_rst/wizard/__init__.py
@@ -22,3 +22,5 @@
import wizard_tech_guide_rst
import generate_relation_graph
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_module_doc_rst/wizard/wizard_tech_guide_rst.py b/addons/base_module_doc_rst/wizard/wizard_tech_guide_rst.py
index b7a5d6da397..bb02d7c33d2 100644
--- a/addons/base_module_doc_rst/wizard/wizard_tech_guide_rst.py
+++ b/addons/base_module_doc_rst/wizard/wizard_tech_guide_rst.py
@@ -507,3 +507,5 @@ class wizard_tech_guide_rst(wizard.interface):
wizard_tech_guide_rst('tech.guide.rst')
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_module_quality/__openerp__.py b/addons/base_module_quality/__openerp__.py
index 02d09e0919d..df57b88fcc2 100644
--- a/addons/base_module_quality/__openerp__.py
+++ b/addons/base_module_quality/__openerp__.py
@@ -21,9 +21,9 @@
{
- 'name': 'Base module quality - To check the quality of other modules' ,
+ 'name': 'Analyse Module Quality' ,
'version': '1.0',
- 'category': 'Hidden',
+ 'category': 'Tools',
'description': """
The aim of this module is to check the quality of other modules.
================================================================
diff --git a/addons/base_module_quality/i18n/pt.po b/addons/base_module_quality/i18n/pt.po
index 67eebfb18bb..cd1f263dc5d 100644
--- a/addons/base_module_quality/i18n/pt.po
+++ b/addons/base_module_quality/i18n/pt.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
-"PO-Revision-Date: 2010-12-15 10:44+0000\n"
-"Last-Translator: OpenERP Administrators \n"
+"PO-Revision-Date: 2011-12-10 12:08+0000\n"
+"Last-Translator: Paulino Ascenção \n"
"Language-Team: Portuguese \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 05:39+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-11 05:36+0000\n"
+"X-Generator: Launchpad (build 14450)\n"
#. module: base_module_quality
#: code:addons/base_module_quality/object_test/object_test.py:187
@@ -152,7 +152,7 @@ msgstr "Objecto de Teste"
#. module: base_module_quality
#: view:module.quality.detail:0
msgid "Save Report"
-msgstr "Gravar Relatório"
+msgstr "Guardar relatório"
#. module: base_module_quality
#: code:addons/base_module_quality/wizard/module_quality_check.py:46
diff --git a/addons/base_module_quality/security/ir.model.access.csv b/addons/base_module_quality/security/ir.model.access.csv
index 74b88054c40..b5e5d53addb 100644
--- a/addons/base_module_quality/security/ir.model.access.csv
+++ b/addons/base_module_quality/security/ir.model.access.csv
@@ -1,3 +1,3 @@
-"id","name","model_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_module_quality_check","module.quality.check","model_module_quality_check",1,1,1,1
-"access_module_quality_detail","module.quality.detail","model_module_quality_detail",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_module_quality_check,module.quality.check,model_module_quality_check,,1,1,1,1
+access_module_quality_detail,module.quality.detail,model_module_quality_detail,,1,1,1,1
diff --git a/addons/base_module_record/__openerp__.py b/addons/base_module_record/__openerp__.py
index 3e1cf79792a..b2a93258d5d 100644
--- a/addons/base_module_record/__openerp__.py
+++ b/addons/base_module_record/__openerp__.py
@@ -21,9 +21,9 @@
{
- 'name': 'Module Record',
+ 'name': 'Record and Create Modules',
'version': '1.0',
- 'category': 'Hidden',
+ 'category': 'Tools',
'description': """
This module allows you to create a new module without any development.
======================================================================
diff --git a/addons/base_module_record/security/ir.model.access.csv b/addons/base_module_record/security/ir.model.access.csv
index fa68571a916..894312eae88 100644
--- a/addons/base_module_record/security/ir.model.access.csv
+++ b/addons/base_module_record/security/ir.model.access.csv
@@ -1,2 +1,2 @@
-id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
-access_ir_module_record,ir.module.record,model_ir_module_record,base.group_system,1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_ir_module_record,ir.module.record,model_ir_module_record,base.group_system,1,1,1,1
diff --git a/addons/base_report_creator/__openerp__.py b/addons/base_report_creator/__openerp__.py
index 5e8bed72d03..632d1d306f6 100644
--- a/addons/base_report_creator/__openerp__.py
+++ b/addons/base_report_creator/__openerp__.py
@@ -23,7 +23,7 @@
{
'name': 'Query Builder',
'version': '1.0',
- 'category': 'Advanced Reporting',
+ 'category': 'Reporting',
'complexity': "expert",
'description': """
This module allows you to create any statistic report on several objects.
diff --git a/addons/base_report_creator/security/ir.model.access.csv b/addons/base_report_creator/security/ir.model.access.csv
index 24e5a1c4cee..a096efd3b18 100644
--- a/addons/base_report_creator/security/ir.model.access.csv
+++ b/addons/base_report_creator/security/ir.model.access.csv
@@ -1,4 +1,5 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_base_report_creator_report","base_report_creator.report","model_base_report_creator_report","base.group_system",1,1,1,1
-"access_base_report_creator_report_fields","base_report_creator.report.fields","model_base_report_creator_report_fields","base.group_system",1,1,1,1
-"access_base_report_creator_report_filter","base_report_creator.report.filter","model_base_report_creator_report_filter","base.group_system",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_base_report_creator_report,base_report_creator.report,model_base_report_creator_report,base.group_system,1,1,1,1
+access_base_report_creator_report_fields,base_report_creator.report.fields,model_base_report_creator_report_fields,base.group_system,1,1,1,1
+access_base_report_creator_report_filter,base_report_creator.report.filter,model_base_report_creator_report_filter,base.group_system,1,1,1,1
+access_base_report_creator_report_result,base_report_creator.report.result,model_base_report_creator_report_result,base.group_system,1,1,1,1
diff --git a/addons/base_report_designer/__openerp__.py b/addons/base_report_designer/__openerp__.py
index a95235d8017..0f3d5f72263 100644
--- a/addons/base_report_designer/__openerp__.py
+++ b/addons/base_report_designer/__openerp__.py
@@ -23,7 +23,7 @@
{
'name': 'OpenOffice Report Designer',
'version': '0.1',
- 'category': 'Advanced Reporting',
+ 'category': 'Reporting',
'complexity': "normal",
'description': """
This module is used along with OpenERP OpenOffice Plugin.
diff --git a/addons/base_report_designer/base_report_designer.py b/addons/base_report_designer/base_report_designer.py
index 90c48f7f17c..46a6e1fe870 100644
--- a/addons/base_report_designer/base_report_designer.py
+++ b/addons/base_report_designer/base_report_designer.py
@@ -59,13 +59,21 @@ class report_xml(osv.osv):
return True
def report_get(self, cr, uid, report_id, context=None):
+ if context is None:
+ context = {}
+ # skip osv.fields.sanitize_binary_value() because we want the raw bytes in all cases
+ context.update(bin_raw=True)
report = self.browse(cr, uid, report_id, context=context)
- sxw_data=(report.report_sxw_content).encode("iso-8859-1", "replace")
- rml_data= (report.report_rml_content).encode("iso-8859-1", "replace")
+ sxw_data = report.report_sxw_content
+ rml_data = report.report_rml_content
+ if isinstance(sxw_data, unicode):
+ sxw_data = sxw_data.encode("iso-8859-1", "replace")
+ if isinstance(rml_data, unicode):
+ rml_data = rml_data.encode("iso-8859-1", "replace")
return {
- 'file_type' : report.report_type,
- 'report_sxw_content': report.report_sxw_content and base64.encodestring(sxw_data) or False,
- 'report_rml_content': report.report_rml_content and base64.encodestring(rml_data) or False
+ 'file_type' : report.report_type,
+ 'report_sxw_content': sxw_data and base64.encodestring(sxw_data) or False,
+ 'report_rml_content': rml_data and base64.encodestring(rml_data) or False
}
report_xml()
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/About.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/About.py
index b31065ce37e..401cf88b418 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/About.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/About.py
@@ -109,3 +109,5 @@ if __name__<>"package" and __name__=="__main__":
elif __name__=="package":
g_ImplementationHelper.addImplementation( About, "org.openoffice.openerp.report.about", ("com.sun.star.task.Job",),)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/AddAttachment.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/AddAttachment.py
index 4dbb28a30c0..c65ba32e6bf 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/AddAttachment.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/AddAttachment.py
@@ -275,3 +275,5 @@ if __name__<>"package" and __name__=="__main__":
AddAttachment(None)
elif __name__=="package":
g_ImplementationHelper.addImplementation( AddAttachment, "org.openoffice.openerp.report.addattachment", ("com.sun.star.task.Job",),)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Change.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Change.py
index 0b68ab10b01..cdc5c7553b1 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Change.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Change.py
@@ -137,3 +137,5 @@ if __name__<>"package" and __name__=="__main__":
elif __name__=="package":
g_ImplementationHelper.addImplementation( Change, "org.openoffice.openerp.report.change", ("com.sun.star.task.Job",),)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertBracesToField.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertBracesToField.py
index 59b7d32b529..bb80c3ecd61 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertBracesToField.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertBracesToField.py
@@ -283,3 +283,5 @@ if __name__<>"package":
else:
g_ImplementationHelper.addImplementation( ConvertBracesToField, "org.openoffice.openerp.report.convertBF", ("com.sun.star.task.Job",),)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertFieldsToBraces.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertFieldsToBraces.py
index d804405c990..892061c56b4 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertFieldsToBraces.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertFieldsToBraces.py
@@ -83,3 +83,5 @@ if __name__<>"package":
else:
g_ImplementationHelper.addImplementation( ConvertFieldsToBraces, "org.openoffice.openerp.report.convertFB", ("com.sun.star.task.Job",),)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ExportToRML.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ExportToRML.py
index e2720c1e803..dd00f1719e1 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ExportToRML.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ExportToRML.py
@@ -130,3 +130,5 @@ if __name__<>"package" and __name__=="__main__":
ExportToRML(None)
elif __name__=="package":
g_ImplementationHelper.addImplementation( ExportToRML, "org.openoffice.openerp.report.exporttorml", ("com.sun.star.task.Job",),)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Expression.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Expression.py
index 074a3bd020e..ecdf13454dc 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Expression.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Expression.py
@@ -113,3 +113,5 @@ if __name__<>"package" and __name__=="__main__":
elif __name__=="package":
g_ImplementationHelper.addImplementation( Expression, "org.openoffice.openerp.report.expression", ("com.sun.star.task.Job",),)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Fields.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Fields.py
index cfe65d61022..92044f78fe1 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Fields.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Fields.py
@@ -289,3 +289,5 @@ if __name__<>"package" and __name__=="__main__":
elif __name__=="package":
g_ImplementationHelper.addImplementation( Fields, "org.openoffice.openerp.report.fields", ("com.sun.star.task.Job",),)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/LoginTest.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/LoginTest.py
index 012c6f896a2..85059d7712c 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/LoginTest.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/LoginTest.py
@@ -53,3 +53,5 @@ class LoginTest:
if not loginstatus:
Change(None)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ModifyExistingReport.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ModifyExistingReport.py
index 138513475bb..2ccd8358c97 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ModifyExistingReport.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ModifyExistingReport.py
@@ -211,3 +211,5 @@ if __name__<>"package" and __name__=="__main__":
elif __name__=="package":
g_ImplementationHelper.addImplementation( ModifyExistingReport, "org.openoffice.openerp.report.modifyreport", ("com.sun.star.task.Job",),)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/NewReport.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/NewReport.py
index 0e4a18c3b10..6022e44df7a 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/NewReport.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/NewReport.py
@@ -117,3 +117,5 @@ elif __name__=="package":
NewReport,
"org.openoffice.openerp.report.opennewreport",
("com.sun.star.task.Job",),)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Repeatln.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Repeatln.py
index d8458be027d..0eab6d1710c 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Repeatln.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Repeatln.py
@@ -298,3 +298,5 @@ if __name__<>"package" and __name__=="__main__":
elif __name__=="package":
g_ImplementationHelper = unohelper.ImplementationHelper()
g_ImplementationHelper.addImplementation( RepeatIn, "org.openoffice.openerp.report.repeatln", ("com.sun.star.task.Job",),)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/SendToServer.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/SendToServer.py
index 896f3cfcac2..3a6d799f8a5 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/SendToServer.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/SendToServer.py
@@ -239,3 +239,5 @@ if __name__<>"package" and __name__=="__main__":
SendtoServer(None)
elif __name__=="package":
g_ImplementationHelper.addImplementation( SendtoServer, "org.openoffice.openerp.report.sendtoserver", ("com.sun.star.task.Job",),)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ServerParameter.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ServerParameter.py
index 245cd1dc7ce..9b69e4a5c15 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ServerParameter.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ServerParameter.py
@@ -172,3 +172,5 @@ if __name__<>"package" and __name__=="__main__":
elif __name__=="package":
g_ImplementationHelper.addImplementation( ServerParameter, "org.openoffice.openerp.report.serverparam", ("com.sun.star.task.Job",),)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Translation.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Translation.py
index 54343d02d7f..73146f1b68a 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Translation.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Translation.py
@@ -272,3 +272,5 @@ if __name__<>"package" and __name__=="__main__":
elif __name__=="package":
g_ImplementationHelper.addImplementation( AddLang, "org.openoffice.openerp.report.langtag", ("com.sun.star.task.Job",),)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/__init__.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/__init__.py
index d2192cd5ddd..0ccd1c9d011 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/__init__.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/__init__.py
@@ -59,3 +59,5 @@ import ConvertBracesToField
import ConvertFieldsToBraces
import ExportToRML
import SendtoServer
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/compile_all.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/compile_all.py
index acafd5f549e..4740c61b178 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/compile_all.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/compile_all.py
@@ -47,3 +47,5 @@
import compileall
compileall.compile_dir('package')
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/__init__.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/__init__.py
index 2a732da8226..a60ae586303 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/__init__.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/__init__.py
@@ -26,3 +26,5 @@ import gui
import logreport
import rpc
import tiny_socket
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/actions.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/actions.py
index 56a83159e4a..8511bb8343d 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/actions.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/actions.py
@@ -109,3 +109,5 @@ class TextListenerProcAdapter( unohelper.Base, XTextListener ):
apply( self.oProcToCall, (oTextEvent,) + self.tParams )
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/error.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/error.py
index a6cfe9215a3..c0a3e5b5d63 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/error.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/error.py
@@ -58,3 +58,5 @@ class ErrorDialog:
def btnOkOrCancel_clicked( self, oActionEvent ):
self.win.endExecute()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/functions.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/functions.py
index db1f15b1fc5..29f1cd87e46 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/functions.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/functions.py
@@ -262,3 +262,5 @@ def GetAFileName():
return sPath
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/gui.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/gui.py
index 79f2ae370de..975aa387193 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/gui.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/gui.py
@@ -820,3 +820,5 @@ class DBModalDialog:
"""
self.oDialogControl.endExecute()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/logreport.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/logreport.py
index dfcc78374c9..2aab8596862 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/logreport.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/logreport.py
@@ -46,3 +46,5 @@ class Logger(object):
def shutdown(self):
logging.shutdown()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/rpc.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/rpc.py
index f211c6309f4..f7c7f636485 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/rpc.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/rpc.py
@@ -202,3 +202,5 @@ class NETRPCGateway(RPCGateway):
info = reduce(lambda x, y: x+y, traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback))
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/tiny_socket.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/tiny_socket.py
index 415e4b3c91e..30a2079433a 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/tiny_socket.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/tiny_socket.py
@@ -91,3 +91,5 @@ class mysocket:
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/tools.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/tools.py
index 8c9a8c9a1a8..ef22a3a0d51 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/tools.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/tools.py
@@ -38,3 +38,5 @@ def write_data_to_file( filename, data ):
fp.write( data )
fp.close()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/modify.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/modify.py
index fa7874cff45..fc3d6672b79 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/modify.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/modify.py
@@ -136,3 +136,5 @@ if __name__<>"package":
else:
g_ImplementationHelper.addImplementation( modify, "org.openoffice.openerp.report.modify", ("com.sun.star.task.Job",),)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/plugin/openerp_report_designer/test/test_fields.py b/addons/base_report_designer/plugin/openerp_report_designer/test/test_fields.py
index 8afd773b3fb..8954aa8d7a8 100644
--- a/addons/base_report_designer/plugin/openerp_report_designer/test/test_fields.py
+++ b/addons/base_report_designer/plugin/openerp_report_designer/test/test_fields.py
@@ -30,3 +30,5 @@ print
print 'Field selection for a repeatIn', '='*40
get('account.invoice', level=0, ending=['one2many','many2many'], recur=['many2one'])
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_report_designer/wizard/base_report_designer_modify.py b/addons/base_report_designer/wizard/base_report_designer_modify.py
index d0790cdc0ad..03d1ac19d7e 100644
--- a/addons/base_report_designer/wizard/base_report_designer_modify.py
+++ b/addons/base_report_designer/wizard/base_report_designer_modify.py
@@ -148,3 +148,5 @@ class base_report_rml_save(osv.osv_memory):
}
base_report_rml_save()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_setup/__openerp__.py b/addons/base_setup/__openerp__.py
index 4417ebf2439..24d665a2cf6 100644
--- a/addons/base_setup/__openerp__.py
+++ b/addons/base_setup/__openerp__.py
@@ -21,9 +21,9 @@
{
- 'name': 'Base Setup',
+ 'name': 'Initial Setup Tools',
'version': '1.0',
- 'category': 'Hidden',
+ 'category': 'Hidden/Dependency',
'complexity': "easy",
'description': """
This module helps to configure the system at the installation of a new database.
diff --git a/addons/base_setup/base_setup.py b/addons/base_setup/base_setup.py
index d2155e5b01e..c10dee7b14b 100644
--- a/addons/base_setup/base_setup.py
+++ b/addons/base_setup/base_setup.py
@@ -28,293 +28,6 @@ from osv import fields, osv
from tools.translate import _
from lxml import etree
-#Application and feature chooser, this could be done by introspecting ir.modules
-DEFAULT_MODULES = {
- 'Customer Relationship Management' : ['crm',],
- 'Sales Management' : ['sale',],
- 'Project Management' : ['project',],
- 'Knowledge Management' : ['document',],
- 'Warehouse Management' : ['stock',],
- 'Manufacturing' : ['mrp'],
- 'Accounting & Finance' : ['account'],
- 'Purchase Management' : ['purchase'],
- 'Human Resources' : ['hr',],
- 'Point of Sale' : ['point_of_sale',],
- 'Marketing' : ['marketing',],
-}
-
-class base_setup_installer(osv.osv_memory):
- _name = 'base.setup.installer'
- _inherit = 'res.config.installer'
-
- _columns = {
- 'selection' : fields.text('Selection'),
- }
-
- def fields_get(self, cr, uid, fields=None, context=None):
- if context is None:
- context = {}
- if fields is None:
- fields = {}
-
- fields = {}
- category_proxy = self.pool.get('ir.module.category')
- domain = [('parent_id', '=', False),
- ('name', '!=', 'Uncategorized'),
- ('visible', '=', True)]
- category_ids = category_proxy.search(cr, uid, domain, context=context)
- for category in category_proxy.browse(cr, uid, category_ids, context=context):
- category_name = 'category_%d' % (category.id,)
- fields[category_name] = {
- 'type' : 'boolean',
- 'string' : category.name,
- 'name' : category_name,
- 'help' : category.description,
- }
-
- module_proxy = self.pool.get('ir.module.module')
- module_ids = module_proxy.search(cr, uid, [], context=context)
- for module in module_proxy.browse(cr, uid, module_ids, context=context):
- module_name = 'module_%d' % (module.id,)
- module_is_installed = module.state == 'installed'
-
- fields[module_name] = {
- 'type' : 'boolean',
- 'string' : module.shortdesc,
- 'name' : module_name,
- 'help' : module.description,
- }
-
- return fields
-
- def default_get(self, cr, uid, fields=None, context=None):
- if context is None:
- context = {}
- if fields is None:
- fields = {}
-
- result = {}
-
- if 'dont_compute_virtual_attributes' not in context:
- module_proxy = self.pool.get('ir.module.module')
- module_ids = module_proxy.search(cr, uid, [], context=context)
- for module in module_proxy.browse(cr, uid, module_ids, context=context):
- result['module_%d' % (module.id,)] = module.state == 'installed'
-
- cat_proxy = self.pool.get('ir.module.category')
- cat_ids = cat_proxy.search(cr, uid, [], context=context)
- for cat in cat_proxy.browse(cr, uid, cat_ids, context=context):
- m = DEFAULT_MODULES.get(cat.name,[])
- r = module_proxy.search(cr, uid, [('state','=','installed'),('name','in',m)])
-
- result['category_%d' % (cat.id,)] = bool(r) and (len(r) == len(m))
-
- return result
-
- def fields_view_get(self, cr, uid, view_id=None, view_type='from', context=None, toolbar=False, submenu=False):
- def in_extended_view_group(cr, uid, context=None):
- try:
- model, group_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'base', 'group_extended')
- except ValueError:
- return False
- return group_id in self.pool.get('res.users').read(cr, uid, uid, ['groups_id'], context=context)['groups_id']
-
- result = super(base_setup_installer, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar, submenu)
-
- module_category_proxy = self.pool.get('ir.module.category')
- domain = [('parent_id', '=', False),
- ('name', '!=', 'Uncategorized'),
- ('visible', '=', True)]
- module_category_ids = module_category_proxy.search(cr, uid, domain, context=context, order='sequence asc')
-
- arch = ['' % _('Automatic Base Setup')]
- arch.append(' ' % _('Install Applications'))
- module_proxy = self.pool.get('ir.module.module')
-
- extended_view = in_extended_view_group(cr, uid, context=context)
-
- for module_category in module_category_proxy.browse(cr, uid, module_category_ids, context=context):
- domain = [('category_id', '=', module_category.id)]
- if not extended_view:
- domain.append(('complexity', '!=', 'expert'))
-
- modules = module_proxy.browse(cr, uid, module_proxy.search(cr, uid, domain, context=context), context=context)
- if not modules:
- continue
-
- m = DEFAULT_MODULES.get(module_category.name, [])
- r = module_proxy.search(cr, uid, [('state', '=', 'installed'),('name', 'in', m)], context=context)
- readonly = bool(r)
-
- attributes = {
- 'name' : 'category_%d' % (module_category.id,),
- 'on_change' : 'on_change_%s_%d(category_%d)' % ('category', module_category.id, module_category.id,),
- }
- if readonly:
- attributes['modifiers'] = simplejson.dumps({'readonly' : True})
-
- arch.append(""" """ % (" ".join(["%s='%s'" % (key, value,)
- for key, value in attributes.iteritems()]),))
-
- # Compute the modules to show
- for module_category in module_category_proxy.browse(cr, uid, module_category_ids, context=context):
- domain = [('category_id', '=', module_category.id)]
-
- if not extended_view:
- domain.append(('complexity', '!=', 'expert'))
-
- default_modules = DEFAULT_MODULES.get(module_category.name, False)
- if default_modules:
- domain.append(('name', 'not in', default_modules))
-
- modules = module_proxy.browse(cr, uid, module_proxy.search(cr, uid, domain, context=context), context=context)
-
- if not modules:
- continue
-
- modifiers = {
- 'invisible' : [('category_%d' % (module_category.id), '=', False)],
- }
- module_modifiers = dict(modifiers)
-
- arch.append(""" """ % (
- cgi.escape(module_category.name),
- simplejson.dumps(modifiers))
- )
-
- for module in modules:
- #module_modifiers['readonly'] = module.state == 'installed'
-
- arch.append(""" """ % (
- module.id,
- simplejson.dumps(module_modifiers))
- )
-
- arch.append(
- ' '
- ''
- ' '
- ' '
- ' '
- )
-
- arch.append(' ')
-
- result['arch'] = ''.join(arch)
- return result
-
- def __getattr__(self, name):
- if name.startswith('on_change_category_'):
- def proxy(cr, uid, ids, value, context=None):
- item = 'category_%s' % name[len('on_change_category_'):]
- return self._on_change_selection(cr, uid, ids, item, value, context=context)
- return proxy
- return getattr(super(base_setup_installer, self), name)
-
- def _on_change_selection(self, cr, uid, ids, item, value, context=None):
- if not isinstance(item, basestring) or not value:
- return {}
-
- if item.startswith('category_') or item.startswith('module_'):
- object_name, identifier = item.split('_')
- else:
- return {}
-
- values = {
- }
-
- #if object_name == 'category':
- # module_ids = self.pool.get('ir.module.module').search(cr, uid, [('category_id', '=', int(identifier))], context=context)
- # for module_id in module_ids:
- # values['module_%d' % module_id] = 1
-
- return {'value': values}
-
- def create(self, cr, uid, values, context=None):
- to_install = {'categories' : [], 'modules' : []}
-
- for key, value in values.iteritems():
- if value == 1 and (key.startswith('module_') or key.startswith('category_')):
- kind, identifier = key.split('_')
- if kind == 'category':
- to_install['categories'].append(long(identifier))
- if kind == 'module':
- to_install['modules'].append(long(identifier))
-
- values = {
- 'selection' : simplejson.dumps(to_install),
- }
- context.update(dont_compute_virtual_attributes=True)
- return super(base_setup_installer, self).create(cr, uid, values, context=context)
-
- def apply_cb(self, cr, uid, ids, context=None):
- category_proxy = self.pool.get('ir.module.category')
- for installer in self.browse(cr, uid, ids, context=context):
- to_install = simplejson.loads(installer.selection)
-
- proxy = self.pool.get('ir.module.module')
-
- module_ids = proxy.search(cr, uid, [('id', 'in', to_install['modules'])], context=context)
- modules = set(record['name']
- for record in proxy.read(cr, uid, module_ids, ['name'], context=context))
-
- category_ids = category_proxy.search(cr, uid, [('id', 'in', to_install['categories'])], context=context)
- selected_categories = set(record['name']
- for record in category_proxy.read(cr, uid, category_ids, ['name'], context=context))
-
- # FIXME: Use a workaround, but can do better
- for category_name, default_modules in DEFAULT_MODULES.iteritems():
- if category_name in selected_categories:
- modules.update(default_modules)
-
- # Special Cases:
- # * project_mrp: the dependencies are sale, project, procurement, mrp_jit
- if 'sale' in modules and 'project' in modules:
- modules.add('project_mrp')
-
- need_update = False
- module_ids = proxy.search(cr, uid, [('name', 'in', list(modules))], context=context)
- if module_ids:
- proxy.state_update(cr, uid, module_ids, 'to install', ['uninstalled'], context=context)
- need_update = True
-
- category_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'base', 'module_category_hidden_link')
- while True and category_id:
- cr.execute("select id, name from ir_module_module m where category_id = %s \
- and (select count(d.id) from ir_module_module_dependency d \
- where d.module_id = m.id) = (select count(d.id) from \
- ir_module_module_dependency d inner join ir_module_module m2 on d.name = m2.name \
- where d.module_id=m.id and m2.state in %s ) and state = %s",
- (category_id[1], ('installed', 'to install', 'to upgrade', ), 'uninstalled',))
- inner_modules = [name for _, name in cr.fetchall()]
-
- module_ids = proxy.search(cr, uid, [('name', 'in', inner_modules)], context=context)
- if not module_ids:
- break
-
- modules.update(inner_modules)
-
- proxy.state_update(cr, uid, module_ids, 'to install', ['uninstalled'], context=context)
- need_update = True
-
-
- domain = [('name', 'in', list(modules)),
- ('state', '=', 'installed')]
- for module in proxy.browse(cr, uid, proxy.search(cr, uid, domain, context=context), context):
- cr.execute("update ir_actions_todo set state='open' \
- from ir_model_data as data where data.res_id = ir_actions_todo.id \
- and ir_actions_todo.type='special'\
- and data.model = 'ir.actions.todo' and data.module=%s", (module.name, ))
-
- if need_update:
- cr.commit()
- self.pool = pooler.restart_pool(cr.dbname, update_module=True)[1]
-
- if 'html' in context:
- return {'type' : 'ir.actions.reload'}
- else:
- return {'type' : 'ir.actions.act_window_close'}
-
#Migrate data from another application Conf wiz
class migrade_application_installer_modules(osv.osv_memory):
diff --git a/addons/base_setup/base_setup_views.xml b/addons/base_setup/base_setup_views.xml
index 165e1c6d12a..9450057f53f 100644
--- a/addons/base_setup/base_setup_views.xml
+++ b/addons/base_setup/base_setup_views.xml
@@ -1,36 +1,6 @@
-
- Install Applications
- base.setup.installer
- form
- form
- new
-
-
-
-
-
-
- 2
-
-
-
- Start Configuration
-
- code
-
-
-
-
-
- Add More Features
- ir.ui.menu
-
-
-
-
Create or Import Customers
@@ -139,7 +109,7 @@
- Specify Your Terminology for Customers
+ Use another word to say "Customer"
ir.actions.act_window
base.setup.terminology
form
@@ -162,6 +132,7 @@
form
form
{'res_id': user.company_id.id}
+ Fill in your company data (address, logo, bank accounts) so that it's printed on your reports. You can click on the button 'Preview Header' in order to check the header/footer of PDF documents.
diff --git a/addons/base_setup/i18n/ar.po b/addons/base_setup/i18n/ar.po
index 0e658ca1d41..5dc55269b8b 100644
--- a/addons/base_setup/i18n/ar.po
+++ b/addons/base_setup/i18n/ar.po
@@ -7,24 +7,24 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
-"PO-Revision-Date: 2011-11-07 12:48+0000\n"
-"Last-Translator: OpenERP Administrators \n"
+"PO-Revision-Date: 2011-11-14 11:20+0000\n"
+"Last-Translator: kifcaliph \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-08 05:40+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-11-15 05:06+0000\n"
+"X-Generator: Launchpad (build 14291)\n"
#. module: base_setup
#: field:base.setup.company,city:0
msgid "City"
-msgstr ""
+msgstr "المدينة"
#. module: base_setup
#: view:base.setup.installer:0
msgid "Install"
-msgstr ""
+msgstr "تثبيت"
#. module: base_setup
#: field:base.setup.installer,account_voucher:0
@@ -34,12 +34,12 @@ msgstr "الفواتير"
#. module: base_setup
#: field:base.setup.installer,hr:0
msgid "Human Resources"
-msgstr ""
+msgstr "الموارد البشرية"
#. module: base_setup
#: field:base.setup.company,email:0
msgid "E-mail"
-msgstr ""
+msgstr "البريد الإلكتروني"
#. module: base_setup
#: field:base.setup.company,account_no:0
@@ -54,19 +54,19 @@ msgstr "أدوات إضافية"
#. module: base_setup
#: field:base.setup.company,rml_footer1:0
msgid "Report Footer 1"
-msgstr ""
+msgstr "تذييل تقرير 1"
#. module: base_setup
#: help:base.setup.installer,mrp:0
msgid ""
"Helps you manage your manufacturing processes and generate reports on those "
"processes."
-msgstr ""
+msgstr "يساعدك على إدارة عمليات التصنيع وإصدار تقارير عن هذه العمليات."
#. module: base_setup
#: help:base.setup.installer,marketing:0
msgid "Helps you manage your marketing campaigns step by step."
-msgstr ""
+msgstr "يساعدك على إدارة حملاتك التسويقية خطوة بخطوة."
#. module: base_setup
#: view:base.setup.config:0
@@ -81,7 +81,7 @@ msgstr "نقاط البيع"
#. module: base_setup
#: field:base.setup.installer,association:0
msgid "Associations"
-msgstr ""
+msgstr "الجمعيات"
#. module: base_setup
#: help:base.setup.installer,account_accountant:0
@@ -89,6 +89,8 @@ msgid ""
"Helps you handle your accounting needs, if you are not an accountant, we "
"suggest you to install only the Invoicing "
msgstr ""
+"يساعدك على التعامل مع احتياجاتك المحاسبية. إذا لم تكن محاسباً، نقترح تثبيت "
+"\"الفواتير\" فقط "
#. module: base_setup
#: code:addons/base_setup/__init__.py:50
@@ -100,33 +102,33 @@ msgstr "تمت إضافة المستخدمين التالين: \n"
#: field:base.setup.company,progress:0
#: field:base.setup.installer,progress:0
msgid "Configuration Progress"
-msgstr ""
+msgstr "تقدم الإعدادات"
#. module: base_setup
#: field:base.setup.company,rml_footer2:0
msgid "Report Footer 2"
-msgstr ""
+msgstr "تذييل تقرير 2"
#. module: base_setup
#: field:base.setup.company,currency:0
#: model:ir.model,name:base_setup.model_res_currency
msgid "Currency"
-msgstr ""
+msgstr "العملة"
#. module: base_setup
#: field:base.setup.company,state_id:0
msgid "Fed. State"
-msgstr ""
+msgstr "المحافظة / الولاية"
#. module: base_setup
#: field:base.setup.installer,marketing:0
msgid "Marketing"
-msgstr ""
+msgstr "التسويق"
#. module: base_setup
#: field:base.setup.company,company_id:0
msgid "Company"
-msgstr ""
+msgstr "الشركة"
#. module: base_setup
#: field:base.setup.installer,sale:0
@@ -139,13 +141,15 @@ msgid ""
"Lets you install various interesting but non-essential tools like Survey, "
"Lunch and Ideas box."
msgstr ""
+"يمكّنك من تثبيت عدد من الأدوات المفيدة ولكن غير الضرورية، مثل الاستبانات "
+"والوجبات وصندوق الأفكار."
#. module: base_setup
#: view:base.setup.config:0
msgid ""
"You can start configuring the system or connect directly to the database as "
"an administrator."
-msgstr ""
+msgstr "يمكنك الشروع في إعداد النظام أو استخدام النظام مباشرة كمدير."
#. module: base_setup
#: field:base.setup.installer,report_designer:0
@@ -155,12 +159,12 @@ msgstr "تقارير متقدمة"
#. module: base_setup
#: field:base.setup.company,phone:0
msgid "Phone"
-msgstr ""
+msgstr "هاتف"
#. module: base_setup
#: view:base.setup.company:0
msgid "res_config_contents"
-msgstr ""
+msgstr "res_config_contents"
#. module: base_setup
#: view:base.setup.company:0
@@ -168,16 +172,18 @@ msgid ""
"Your company information will be used to personalize documents issued with "
"OpenERP such as invoices, sales orders and much more."
msgstr ""
+"سيتمّ استخدام معلومات شركتك لتخصيص المستندات التي يصدرها OpenERP مثل "
+"الفواتير وأوامر المبيعات وغير ذلك الكثير."
#. module: base_setup
#: view:base.setup.installer:0
msgid "title"
-msgstr ""
+msgstr "العنوان"
#. module: base_setup
#: field:base.setup.installer,knowledge:0
msgid "Knowledge Management"
-msgstr ""
+msgstr "إدارة المعارف"
#. module: base_setup
#: model:ir.module.module,description:base_setup.module_meta_information
@@ -197,6 +203,19 @@ msgid ""
" footer, the account chart to install and the language.\n"
" "
msgstr ""
+"\n"
+" هذا البرنامج يشمل إعدادات النظام ليساعد المستخدم\n"
+" لإعداد النظام أثناء إنشاءه قاعدة بيانات جديدة.\n"
+"\n"
+" سيسمح لك بإختيار من قائمة معرفة لتنصيب:\n"
+" * الحد الأدني للنظام\n"
+" * برامج المحاسبة فقط\n"
+" * برامج القطاع الخدمي\n"
+" * برامج القطاع التصنيعي\n"
+"\n"
+" بالإضافة إلي مساعدتك علي تحديد نوع شركتك، اسمها\n"
+" و تعريف نوع الدليل المحاسبي و اللغة.\n"
+" "
#. module: base_setup
#: help:base.setup.installer,product_expiry:0
@@ -204,6 +223,8 @@ msgid ""
"Installs a preselected set of OpenERP applications which will help you "
"manage your industry."
msgstr ""
+"يقوم بتثبيت مجموعة من تطبيقات OpenERP مختارة مسبقاً تساعدك على إدارة نوع "
+"الصناعة الخاص بك."
#. module: base_setup
#: help:base.setup.installer,project:0
@@ -211,16 +232,17 @@ msgid ""
"Helps you manage your projects and tasks by tracking them, generating "
"plannings, etc..."
msgstr ""
+"يساعدك على إدارة مشاريعك ومهامك عن طريق متابعتهم وإصدار الخطط وما إلى ذلك."
#. module: base_setup
#: field:base.setup.company,name:0
msgid "Company Name"
-msgstr ""
+msgstr "اسم الشركة"
#. module: base_setup
#: view:base.setup.config:0
msgid "Skip Configuration Wizards"
-msgstr ""
+msgstr "تجاوز معالجات الإعدادات"
#. module: base_setup
#: help:base.setup.installer,hr:0
@@ -228,6 +250,8 @@ msgid ""
"Helps you manage your human resources by encoding your employees structure, "
"generating work sheets, tracking attendance and more."
msgstr ""
+"يساعدك على إدارة مواردك البشرية عن طريق فهم هيكل الموظفين وإصدار أوراق العمل "
+"ومتابعة الحضور وغير ذلك."
#. module: base_setup
#: help:base.setup.installer,account_voucher:0
@@ -235,11 +259,13 @@ msgid ""
"Allows you to create your invoices and track the payments. It is an easier "
"version of the accounting module for managers who are not accountants."
msgstr ""
+"يمكّنك من إصدار الفواتير و متابعة المدفوعات. يعدّ نسخة مبسطة من "
+"\"المحاسبة\" مناسبة للمدراء غير المحاسِبين."
#. module: base_setup
#: model:ir.model,name:base_setup.model_base_setup_company
msgid "base.setup.company"
-msgstr ""
+msgstr "base.setup.company"
#. module: base_setup
#: help:base.setup.installer,purchase:0
@@ -247,6 +273,8 @@ msgid ""
"Helps you manage your purchase-related processes such as requests for "
"quotations, supplier invoices, etc..."
msgstr ""
+"يساعدك على إدارة العمليات المتعلقة بالشراء مثل طلبات التسعير وفواتير "
+"الموردين وما إلى ذلك."
#. module: base_setup
#: help:base.setup.company,rml_footer2:0
@@ -255,26 +283,29 @@ msgid ""
"We suggest you to put bank information here:\n"
"IBAN: BE74 1262 0121 6907 - SWIFT: CPDF BE71 - VAT: BE0477.472.701"
msgstr ""
+"ستظهر هذه الجملة أسفل التقارير.\n"
+"نقترح عليك وضع معلوماتك المصرفية هنا:\n"
+"IBAN: BE74 1262 0121 6907 - SWIFT: CPDF BE71 - VAT: BE0477.472.701"
#. module: base_setup
#: field:base.setup.company,street2:0
msgid "Street 2"
-msgstr ""
+msgstr "العنوان 2"
#. module: base_setup
#: model:ir.model,name:base_setup.model_base_setup_installer
msgid "base.setup.installer"
-msgstr ""
+msgstr "base.setup.installer"
#. module: base_setup
#: field:base.setup.company,country_id:0
msgid "Country"
-msgstr ""
+msgstr "الدولة"
#. module: base_setup
#: model:ir.actions.act_window,name:base_setup.action_base_setup
msgid "Setup"
-msgstr ""
+msgstr "إعداد"
#. module: base_setup
#: field:base.setup.installer,account_accountant:0
@@ -289,7 +320,7 @@ msgstr ""
#. module: base_setup
#: field:base.setup.company,zip:0
msgid "Zip Code"
-msgstr ""
+msgstr "الرمز البريدي"
#. module: base_setup
#: view:base.setup.config:0
@@ -301,7 +332,7 @@ msgstr "بدء الإعداد"
msgid ""
"Lets you install addons geared towards sharing knowledge with and between "
"your employees."
-msgstr ""
+msgstr "يمكّنك من تثبيت إضافات غرضها نشر ومشاركة المعارف بين موظفيك."
#. module: base_setup
#: view:base.setup.installer:0
@@ -309,6 +340,8 @@ msgid ""
"Select the Applications you want your system to cover. If you are not sure "
"about your exact needs at this stage, you can easily install them later."
msgstr ""
+"اختر التطبيقات الي تريد أن يتضمنها النظام. إذا لم تكن متأكداً من احتياجاتك "
+"بدقة في هذه المرحلة، يمكنك تثبيت أي من التطبيقات بسهولة لاحقاً."
#. module: base_setup
#: view:base.setup.company:0
@@ -319,7 +352,7 @@ msgstr "إعدادات الشركة"
#. module: base_setup
#: field:base.setup.company,logo:0
msgid "Logo"
-msgstr ""
+msgstr "الشعار"
#. module: base_setup
#: help:base.setup.installer,point_of_sale:0
@@ -328,6 +361,8 @@ msgid ""
"simplified payment mode encoding, automatic picking lists generation and "
"more."
msgstr ""
+"يساعدك على تشغيل نقاط البيع بكفاءة عن طريق تسجيل عمليات البيع بسرعة وتوفير "
+"وضع مبسط للدفع وإصدار تلقائي لقوائم الالتقاط وغير ذلك."
#. module: base_setup
#: field:base.setup.installer,purchase:0
@@ -337,7 +372,7 @@ msgstr "إدارة المشتريات"
#. module: base_setup
#: help:base.setup.installer,sale:0
msgid "Helps you handle your quotations, sale orders and invoicing."
-msgstr ""
+msgstr "يساعدك على التعامل مع التسعيرات وأوامر المبيعات والفواتير."
#. module: base_setup
#: field:base.setup.installer,stock:0
@@ -347,7 +382,7 @@ msgstr "إدارة المخازن و المستودعات"
#. module: base_setup
#: field:base.setup.installer,project:0
msgid "Project Management"
-msgstr "إدارة المشروعات"
+msgstr "إدارة المشاريع"
#. module: base_setup
#: field:base.setup.config,installed_users:0
@@ -357,7 +392,7 @@ msgstr "المستخدمون المعرّفون"
#. module: base_setup
#: view:base.setup.config:0
msgid "New Database"
-msgstr ""
+msgstr "قاعدة بيانات جديدة"
#. module: base_setup
#: field:base.setup.installer,crm:0
@@ -370,6 +405,8 @@ msgid ""
"Installs a preselected set of OpenERP applications selected to help you "
"manage your auctions as well as the business processes around them."
msgstr ""
+"يقوم بتثبيت مجموعة من تطبيقات OpenERP مختارة مسبقاً لتساعدك على إدارة "
+"المزادات والعمليات المتعلقة بها."
#. module: base_setup
#: help:base.setup.company,rml_header1:0
@@ -378,18 +415,21 @@ msgid ""
"We suggest you to put a slogan here:\n"
"\"Open Source Business Solutions\"."
msgstr ""
+"ستظهر هذه الجملة في الزاوية اليمنى في رأس كل تقرير.\n"
+"نقترح عليك وضع شعار هنا:\n"
+"\"حلول أعمال مفتوحة المصدر\"."
#. module: base_setup
#: help:base.setup.installer,report_designer:0
msgid ""
"Lets you install various tools to simplify and enhance OpenERP's report "
"creation."
-msgstr ""
+msgstr "يمكّنك من تثبيت عدة أدوات تسهل وتحسن إنشاء التقارير."
#. module: base_setup
#: field:base.setup.company,rml_header1:0
msgid "Report Header"
-msgstr ""
+msgstr "رأس التقرير"
#. module: base_setup
#: view:base.setup.config:0
@@ -401,7 +441,7 @@ msgstr "معلومات عن قاعدة البيانات الجديدة"
#: field:base.setup.config,config_logo:0
#: field:base.setup.installer,config_logo:0
msgid "Image"
-msgstr ""
+msgstr "صورة"
#. module: base_setup
#: field:base.setup.installer,product_expiry:0
@@ -411,7 +451,7 @@ msgstr "الصناعات الغذائية"
#. module: base_setup
#: field:base.setup.installer,mrp:0
msgid "Manufacturing"
-msgstr ""
+msgstr "التصنيع"
#. module: base_setup
#: view:base.setup.company:0
@@ -425,6 +465,9 @@ msgid ""
"We suggest you to write legal sentences here:\n"
"Web: http://openerp.com - Fax: +32.81.73.35.01 - Fortis Bank: 126-2013269-07"
msgstr ""
+"ستظهر هذه الجملة في أسفل التقارير.\n"
+"نقترح عليك كتابة معلومات قانونية هنا:\n"
+"موقع: http://openerp.com - فاكس: +32.81.73.35.01 - بنك فوتيس: 126-2013269-07"
#. module: base_setup
#: field:base.setup.company,website:0
@@ -434,12 +477,12 @@ msgstr "الموقع الإلكتروني للشركة"
#. module: base_setup
#: view:base.setup.installer:0
msgid "Install Specific Industry Applications"
-msgstr "نصّب تطبيقات صناعات معينة"
+msgstr "ثبّت تطبيقات صناعات معينة"
#. module: base_setup
#: field:base.setup.company,street:0
msgid "Street"
-msgstr ""
+msgstr "العنوان"
#. module: base_setup
#: view:base.setup.company:0
@@ -455,7 +498,7 @@ msgstr "مثال: http://openerp.com"
#: view:base.setup.installer:0
#: model:ir.actions.act_window,name:base_setup.action_base_setup_installer
msgid "Install Applications"
-msgstr "تنصيب التطبيقات"
+msgstr "تثبيت تطبيقات"
#. module: base_setup
#: help:base.setup.installer,crm:0
@@ -464,6 +507,9 @@ msgid ""
"or issues. Can automatically send reminders, escalate requests or trigger "
"business-specific actions based on standard events."
msgstr ""
+"يساعدك على متابعة وإدارة علاقات العملاء مثل الفرص والطلبات والشكاوى. يوفر "
+"إمكانيات تلقائية لإرسال رسائل تذكير، وتصعيد طلبات، وابتداء إجراءات مخصصة "
+"بناء على أحداث قياسية."
#. module: base_setup
#: help:base.setup.installer,stock:0
@@ -471,6 +517,8 @@ msgid ""
"Helps you manage your inventory and main stock operations: delivery orders, "
"receptions, etc."
msgstr ""
+"يساعدك على إدارة العمليات المتعلقة بكميات المخزون مثل أوامر التسليم "
+"والاستلام وما إلى ذلك."
#. module: base_setup
#: model:ir.module.module,shortdesc:base_setup.module_meta_information
@@ -483,11 +531,13 @@ msgid ""
"Installs a preselected set of OpenERP applications which will help you "
"manage your association more efficiently."
msgstr ""
+"يقوم بتثبيت مجموعة من تطبيقات OpenERP مختارة مسبقاً لتساعدك على إدارة جمعيتك "
+"بكفاءة أعلى."
#. module: base_setup
#: model:ir.model,name:base_setup.model_base_setup_config
msgid "base.setup.config"
-msgstr ""
+msgstr "base.setup.config"
#~ msgid "Point of Sales"
#~ msgstr "نقاط البيع"
diff --git a/addons/base_setup/security/ir.model.access.csv b/addons/base_setup/security/ir.model.access.csv
index 97dd8b917b8..4a08a4aa60d 100644
--- a/addons/base_setup/security/ir.model.access.csv
+++ b/addons/base_setup/security/ir.model.access.csv
@@ -1 +1 @@
-id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
diff --git a/addons/base_synchro/__openerp__.py b/addons/base_synchro/__openerp__.py
index fba793e0473..a9fd08bccf6 100644
--- a/addons/base_synchro/__openerp__.py
+++ b/addons/base_synchro/__openerp__.py
@@ -20,10 +20,10 @@
##############################################################################
{
- "name":"Server Object Synchronization",
+ "name":"Multi-DB Synchronization",
"version":"0.1",
"author":"OpenERP SA",
- "category":"Hidden",
+ "category":"Tools",
"description": """
Synchronization with all objects.
=================================
diff --git a/addons/base_synchro/security/ir.model.access.csv b/addons/base_synchro/security/ir.model.access.csv
index fa0f00e8ccd..bf69c931523 100644
--- a/addons/base_synchro/security/ir.model.access.csv
+++ b/addons/base_synchro/security/ir.model.access.csv
@@ -1,5 +1,5 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"base_synchro_server","base.synchro.server","model_base_synchro_server","base.group_system",1,1,1,1
-" base_synchro_obj"," base.synchro.obj","model_base_synchro_obj","base.group_system",1,1,1,1
-"base_synchro_obj_avoid","base.synchro.obj.avoid","model_base_synchro_obj_avoid","base.group_system",1,1,1,1
-"base_synchro_obj_line","base.synchro.obj.line","model_base_synchro_obj_line","base.group_system",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+base_synchro_server,base.synchro.server,model_base_synchro_server,base.group_system,1,1,1,1
+ base_synchro_obj, base.synchro.obj,model_base_synchro_obj,base.group_system,1,1,1,1
+base_synchro_obj_avoid,base.synchro.obj.avoid,model_base_synchro_obj_avoid,base.group_system,1,1,1,1
+base_synchro_obj_line,base.synchro.obj.line,model_base_synchro_obj_line,base.group_system,1,1,1,1
diff --git a/addons/base_tools/__init__.py b/addons/base_tools/__init__.py
index 50a14119520..4c241b72be9 100644
--- a/addons/base_tools/__init__.py
+++ b/addons/base_tools/__init__.py
@@ -1 +1,3 @@
# Debian packaging removes blank files, so this comment is added.
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_tools/__openerp__.py b/addons/base_tools/__openerp__.py
index ec32805533e..d2cd2aad742 100644
--- a/addons/base_tools/__openerp__.py
+++ b/addons/base_tools/__openerp__.py
@@ -4,7 +4,7 @@
"author": "OpenERP SA",
"version": "1.0",
"depends": ["base"],
- "category" : "Hidden",
+ "category" : "Hidden/Dependency",
'complexity': "easy",
'description': """
Common base for tools modules.
@@ -19,3 +19,5 @@ Creates menu link for Tools from where tools like survey, lunch, idea, etc. are
"installable": True,
"certificate" : "00571588675379342237"
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_tools/i18n/oc.po b/addons/base_tools/i18n/oc.po
new file mode 100644
index 00000000000..47c934ff404
--- /dev/null
+++ b/addons/base_tools/i18n/oc.po
@@ -0,0 +1,32 @@
+# Occitan (post 1500) translation for openobject-addons
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2011-01-11 11:14+0000\n"
+"PO-Revision-Date: 2011-11-20 09:19+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Occitan (post 1500) \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
+"X-Generator: Launchpad (build 14299)\n"
+
+#. module: base_tools
+#: model:ir.module.module,shortdesc:base_tools.module_meta_information
+msgid "Common base for tools modules"
+msgstr "Basa comuna pels moduls utilitaris"
+
+#. module: base_tools
+#: model:ir.module.module,description:base_tools.module_meta_information
+msgid ""
+"\n"
+" "
+msgstr ""
+"\n"
+" "
diff --git a/addons/base_tools/i18n/pt.po b/addons/base_tools/i18n/pt.po
index 69b6b9c4459..badfa6acc16 100644
--- a/addons/base_tools/i18n/pt.po
+++ b/addons/base_tools/i18n/pt.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
-"PO-Revision-Date: 2011-05-17 12:07+0000\n"
-"Last-Translator: FULL NAME \n"
+"PO-Revision-Date: 2011-12-10 12:08+0000\n"
+"Last-Translator: Paulino Ascenção \n"
"Language-Team: Portuguese \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 05:56+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-11 05:36+0000\n"
+"X-Generator: Launchpad (build 14450)\n"
#. module: base_tools
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
diff --git a/addons/base_vat/__init__.py b/addons/base_vat/__init__.py
index 43dbd0c1418..1d7c143b7dc 100644
--- a/addons/base_vat/__init__.py
+++ b/addons/base_vat/__init__.py
@@ -19,6 +19,7 @@
#
##############################################################################
+import res_company
import base_vat
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
diff --git a/addons/base_vat/__openerp__.py b/addons/base_vat/__openerp__.py
index 5f7c1d2d86d..f7d9c572447 100644
--- a/addons/base_vat/__openerp__.py
+++ b/addons/base_vat/__openerp__.py
@@ -22,7 +22,7 @@
{
'name': 'VAT Number Validation',
'version': '1.0',
- 'category': 'Hidden',
+ "category": 'Hidden/Dependency',
'complexity': "easy",
'description': """
VAT validation for Partners' VAT numbers
@@ -33,6 +33,21 @@ be validated for all supported countries. The country is inferred from the
2-letter country code that prefixes the VAT number, e.g. ``BE0477472701``
will be validated using the Belgian rules.
+There are two different levels of VAT number validation:
+
+ * By default, a simple off-line check is performed using the known validation
+ rules for the country, usually a simple check digit. This is quick and
+ always available, but allows numbers that are perhaps not truly allocated,
+ or not valid anymore.
+ * When the "VAT VIES Check" option is enabled (in the configuration of the user's
+ Company), VAT numbers will be instead submitted to the online EU VIES
+ database, which will truly verify that the number is valid and currently
+ allocated to a EU company. This is a little bit slower than the simple
+ off-line check, requires an Internet connection, and may not be available
+ all the time. If the service is not available or does not support the
+ requested country (e.g. for non-EU countries), a simple check will be performed
+ instead.
+
Supported countries currently include EU countries, and a few non-EU countries
such as Chile, Colombia, Mexico, Norway or Russia. For unsupported countries,
only the country code will be validated.
diff --git a/addons/base_vat/base_vat.py b/addons/base_vat/base_vat.py
index ba858d10e64..02471f67442 100644
--- a/addons/base_vat/base_vat.py
+++ b/addons/base_vat/base_vat.py
@@ -61,27 +61,48 @@ class res_partner(osv.osv):
vat_country, vat_number = vat[:2].lower(), vat[2:].replace(' ', '')
return vat_country, vat_number
- def check_vat(self, cr, uid, ids, context=None):
+ def simple_vat_check(self, cr, uid, country_code, vat_number, context=None):
'''
Check the VAT number depending of the country.
http://sima-pc.com/nif.php
'''
- country_obj = self.pool.get('res.country')
+ check_func_name = 'check_vat_' + country_code
+ check_func = getattr(self, check_func_name, None) or \
+ getattr(vatnumber, check_func_name, None)
+ if not check_func:
+ # No VAT validation available, default to check that the country code exists
+ res_country = self.pool.get('res.country')
+ return bool(res_country.search(cr, uid, [('code', '=ilike', country_code)], context=context))
+ return check_func(vat_number)
+
+ def vies_vat_check(self, cr, uid, country_code, vat_number, context=None):
+ try:
+ # Validate against VAT Information Exchange System (VIES)
+ # see also http://ec.europa.eu/taxation_customs/vies/
+ return vatnumber.check_vies(country_code.upper()+vat_number)
+ except Exception:
+ # see http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
+ # Fault code may contain INVALID_INPUT, SERVICE_UNAVAILABLE, MS_UNAVAILABLE,
+ # TIMEOUT or SERVER_BUSY. There is no way we can validate the input
+ # with VIES if any of these arise, including the first one (it means invalid
+ # country code or empty VAT number), so we fall back to the simple check.
+ return self.simple_vat_check(cr, uid, country_code, vat_number, context=context)
+
+ def check_vat(self, cr, uid, ids, context=None):
+ user_company = self.pool.get('res.users').browse(cr, uid, uid).company_id
+ if user_company.vat_check_vies:
+ # force full VIES online check
+ check_func = self.vies_vat_check
+ else:
+ # quick and partial off-line checksum validation
+ check_func = self.simple_vat_check
+
for partner in self.browse(cr, uid, ids, context=context):
if not partner.vat:
continue
vat_country, vat_number = self._split_vat(partner.vat)
- check_func_name = 'check_vat_' + vat_country
- check_func = getattr(self, check_func_name, None) or \
- getattr(vatnumber, check_func_name, None)
- if not check_func:
- # No VAT validation available, default to check that the country code
- # exists.
- if country_obj.search(cr, uid, [('code', 'ilike', vat_country)], context=context):
- continue
- # Country code not found, considered invalid
+ if not check_func(cr, uid, vat_country, vat_number, context=context):
return False
- return check_func(vat_number)
return True
def vat_change(self, cr, uid, ids, value, context=None):
diff --git a/addons/base_vat/base_vat_view.xml b/addons/base_vat/base_vat_view.xml
index 69a1870ea72..fa53906d667 100644
--- a/addons/base_vat/base_vat_view.xml
+++ b/addons/base_vat/base_vat_view.xml
@@ -7,12 +7,23 @@
res.partner
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+ res.company.form.vat.inherit
+ res.company
+
+
+
+
+
diff --git a/addons/base_vat/res_company.py b/addons/base_vat/res_company.py
new file mode 100644
index 00000000000..e7641db9c68
--- /dev/null
+++ b/addons/base_vat/res_company.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (c) 2011 OpenERP S.A.
+#
+# 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 .
+#
+##############################################################################
+
+from osv import osv, fields
+
+class res_company_vat (osv.osv):
+ _inherit = 'res.company'
+ _columns = {
+ 'vat_check_vies': fields.boolean('VIES VAT Check',
+ help="If checked, Partners VAT numbers will be fully validated against EU's VIES service "
+ "rather than via a simple format validation (checksum)."),
+ }
+
+
\ No newline at end of file
diff --git a/addons/board/__openerp__.py b/addons/board/__openerp__.py
index 6cb0e3ecce7..e0f554bb1ec 100644
--- a/addons/board/__openerp__.py
+++ b/addons/board/__openerp__.py
@@ -20,9 +20,9 @@
##############################################################################
{
- 'name': 'Dashboard Creator',
+ 'name': 'Dashboards',
'version': '1.0',
- 'category': 'Hidden',
+ 'category': 'Hidden/Dependency',
'complexity': "normal",
'description': """
Lets the user create a custom dashboard.
diff --git a/addons/board/board.py b/addons/board/board.py
index 6a87d5b190b..dd3d75e1dca 100644
--- a/addons/board/board.py
+++ b/addons/board/board.py
@@ -56,14 +56,14 @@ class board_board(osv.osv):
#End Loop
arch = """
-
-
+
+
%s
-
-
+
+
%s
-
-
+
+
""" % ('\n'.join(left), '\n'.join(right))
return arch
@@ -134,10 +134,10 @@ class board_board(osv.osv):
res['arch'] = self._arch_preprocessing(cr, user, res['arch'], context=context)
res['toolbar'] = {'print': [], 'action': [], 'relate': []}
return res
-
-
- def _arch_preprocessing(self, cr, user, arch, context=None):
- from lxml import etree
+
+
+ def _arch_preprocessing(self, cr, user, arch, context=None):
+ from lxml import etree
def remove_unauthorized_children(node):
for child in node.iterchildren():
if child.tag=='action' and child.get('invisible'):
@@ -145,17 +145,17 @@ class board_board(osv.osv):
else:
child=remove_unauthorized_children(child)
return node
-
+
def encode(s):
if isinstance(s, unicode):
return s.encode('utf8')
return s
-
- archnode = etree.fromstring(encode(arch))
+
+ archnode = etree.fromstring(encode(arch))
return etree.tostring(remove_unauthorized_children(archnode),pretty_print=True)
-
-
-
+
+
+
_columns = {
'name': fields.char('Dashboard', size=64, required=True),
diff --git a/addons/board/board_data_admin.xml b/addons/board/board_data_admin.xml
index 0a65d816d8f..c5a51795425 100644
--- a/addons/board/board_data_admin.xml
+++ b/addons/board/board_data_admin.xml
@@ -139,7 +139,6 @@
-
@@ -158,7 +157,7 @@
-
+
diff --git a/addons/board/board_data_home.xml b/addons/board/board_data_home.xml
index accb112673b..8a0f150d5be 100644
--- a/addons/board/board_data_home.xml
+++ b/addons/board/board_data_home.xml
@@ -44,14 +44,10 @@
form
-
+
-
-
-
-
diff --git a/addons/board/security/ir.model.access.csv b/addons/board/security/ir.model.access.csv
index 8661750bfb8..2275cc7d47d 100644
--- a/addons/board/security/ir.model.access.csv
+++ b/addons/board/security/ir.model.access.csv
@@ -1,6 +1,6 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_board_board","board.board","model_board_board","base.group_user",1,1,1,1
-"access_board_board_line","board.board.line","model_board_board_line","base.group_user",1,1,1,1
-"access_res_log_report","res.log.report","model_res_log_report","base.group_user",1,1,1,1
-"access_res_log_report_system","res.log.report system","model_res_log_report",base.group_system,1,0,0,0
-"access_res_log_report_erp_manager","res.log.report erp_manager","model_res_log_report",base.group_erp_manager,1,0,0,0
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_board_board all,board.board,model_board_board,,1,0,0,0
+access_board_board_line all,board.board.line,model_board_board_line,,1,0,0,0
+access_board_board system,board.board system,model_board_board,base.group_system,1,1,1,1
+access_board_board_line system,board.board.line system,model_board_board_line,base.group_system,1,1,1,1
+access_res_log_report all,res.log.report,model_res_log_report,,1,0,0,0
diff --git a/addons/caldav/__openerp__.py b/addons/caldav/__openerp__.py
index 53bee3d0e94..ef691e39564 100644
--- a/addons/caldav/__openerp__.py
+++ b/addons/caldav/__openerp__.py
@@ -49,7 +49,7 @@ To access OpenERP Calendar using WebCal to remote site use the URL like:
DATABASE_NAME: Name of database on which OpenERP Calendar is created
CALENDAR_NAME: Name of calendar to access
""",
- 'category': 'Hidden',
+ 'category': 'Hidden/Dependency',
"author" : "OpenERP SA",
'website': 'http://www.openerp.com',
"init_xml" : ["caldav_data.xml"],
diff --git a/addons/caldav/caldav.py b/addons/caldav/caldav.py
index 2517f88f789..0f0f5ddd762 100644
--- a/addons/caldav/caldav.py
+++ b/addons/caldav/caldav.py
@@ -25,3 +25,5 @@ urlparse.uses_netloc.append('caldav')
urlparse.uses_netloc.append('caldavs')
#EOF
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/caldav/caldav_view.xml b/addons/caldav/caldav_view.xml
index d8025ef578e..72e88a6c7b4 100644
--- a/addons/caldav/caldav_view.xml
+++ b/addons/caldav/caldav_view.xml
@@ -45,6 +45,7 @@
form
tree,form
[('calendar_collection','=',True)]
+ {'default_calendar_collection': True}
diff --git a/addons/caldav/calendar_collection.py b/addons/caldav/calendar_collection.py
index 1258ba5bf18..1abbf573ef0 100644
--- a/addons/caldav/calendar_collection.py
+++ b/addons/caldav/calendar_collection.py
@@ -86,3 +86,5 @@ class calendar_collection(osv.osv):
return self.get_schedule_inbox_URL(cr, uid, ids, context=context)
calendar_collection()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/caldav/orm_utils.py b/addons/caldav/orm_utils.py
index 00521831e0f..b154d54d1aa 100644
--- a/addons/caldav/orm_utils.py
+++ b/addons/caldav/orm_utils.py
@@ -46,3 +46,5 @@ if True: # we need this indentation level ;)
return res[0][0]
#eof
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/caldav/security/ir.model.access.csv b/addons/caldav/security/ir.model.access.csv
index ce3f3c90e32..34fbdcc0b02 100644
--- a/addons/caldav/security/ir.model.access.csv
+++ b/addons/caldav/security/ir.model.access.csv
@@ -1,6 +1,6 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_basic_calendar_lines","basic.calendar.lines","model_basic_calendar_lines","base.group_user",1,1,1,1
-"access_basic_calendar_attributes","basic.calendar.attributes","model_basic_calendar_attributes","base.group_user",1,1,1,1
-"access_basic_calendar_fields","basic.calendar.fields","model_basic_calendar_fields","base.group_user",1,1,1,1
-"access_basic_calendar","basic.calendar","model_basic_calendar","base.group_user",1,1,1,1
-"access_basic_calendar_alias","basic.calendar.alias","model_basic_calendar_alias","base.group_user",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_basic_calendar_lines,basic.calendar.lines,model_basic_calendar_lines,base.group_user,1,1,1,1
+access_basic_calendar_attributes,basic.calendar.attributes,model_basic_calendar_attributes,base.group_user,1,1,1,1
+access_basic_calendar_fields,basic.calendar.fields,model_basic_calendar_fields,base.group_user,1,1,1,1
+access_basic_calendar,basic.calendar,model_basic_calendar,base.group_user,1,1,1,1
+access_basic_calendar_alias,basic.calendar.alias,model_basic_calendar_alias,base.group_user,1,1,1,1
diff --git a/addons/caldav/wizard/caldav_browse.py b/addons/caldav/wizard/caldav_browse.py
index 5b78c480d07..f4bb8aeaabc 100644
--- a/addons/caldav/wizard/caldav_browse.py
+++ b/addons/caldav/wizard/caldav_browse.py
@@ -275,3 +275,5 @@ class user_preference(osv.osv_memory):
}
user_preference()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/claim_from_delivery/__openerp__.py b/addons/claim_from_delivery/__openerp__.py
index c3eec37a229..023b5fd5700 100644
--- a/addons/claim_from_delivery/__openerp__.py
+++ b/addons/claim_from_delivery/__openerp__.py
@@ -18,10 +18,10 @@
#
##############################################################################
{
- "name" : "Claim from Delivery",
+ "name" : "Claim on Deliveries",
"version" : "1.0",
"author" : "OpenERP SA",
- "category" : "Hidden",
+ "category" : "Warehouse Management",
"depends" : ["base", "crm_claim", "stock"],
"init_xml" : [],
"demo_xml" : [],
diff --git a/addons/claim_from_delivery/i18n/oc.po b/addons/claim_from_delivery/i18n/oc.po
new file mode 100644
index 00000000000..e7670a75613
--- /dev/null
+++ b/addons/claim_from_delivery/i18n/oc.po
@@ -0,0 +1,33 @@
+# Occitan (post 1500) translation for openobject-addons
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2011-01-11 11:14+0000\n"
+"PO-Revision-Date: 2011-11-20 09:19+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Occitan (post 1500) \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
+"X-Generator: Launchpad (build 14299)\n"
+
+#. module: claim_from_delivery
+#: model:ir.actions.act_window,name:claim_from_delivery.action_claim_from_delivery
+msgid "Claim"
+msgstr "Reclamacion"
+
+#. module: claim_from_delivery
+#: model:ir.module.module,description:claim_from_delivery.module_meta_information
+msgid "Create Claim from delivery order:\n"
+msgstr "Crear una reclamacion sus un bon de liurason :\n"
+
+#. module: claim_from_delivery
+#: model:ir.module.module,shortdesc:claim_from_delivery.module_meta_information
+msgid "Claim from delivery"
+msgstr "Reclamacion sus la liurason"
diff --git a/addons/crm/__openerp__.py b/addons/crm/__openerp__.py
index 54dfc335a2b..83b0354912a 100644
--- a/addons/crm/__openerp__.py
+++ b/addons/crm/__openerp__.py
@@ -21,7 +21,7 @@
{
- 'name': 'Customer & Supplier Relationship Management',
+ 'name': 'CRM',
'version': '1.0',
'category': 'Customer Relationship Management',
'complexity': "easy",
@@ -61,7 +61,8 @@ Creates a dashboard for CRM that includes:
'mail',
'base_calendar',
'resource',
- 'board'
+ 'board',
+ 'fetchmail'
],
'init_xml': [
'crm_data.xml',
@@ -118,20 +119,17 @@ Creates a dashboard for CRM that includes:
'crm_phonecall_demo.xml',
],
'test': [
- 'test/test_crm_lead.yml',
- 'test/test_crm_meeting.yml',
- 'test/test_crm_opportunity.yml',
- 'test/test_crm_phonecall.yml',
- 'test/test_crm_recurrent_meeting.yml',
- 'test/test_crm_stage_changes.yml',
- 'test/test_crm_recurrent_meeting_case2.yml',
- 'test/test_crm_lead_case2.yml',
- 'test/test_crm_opportunity_case2.yml',
- 'test/test_crm_phonecall_case2.yml',
- 'test/test_crm_partner2opportunity.yml',
- 'test/test_crm_segmentation.yml',
+ 'test/process/communication_with_customer.yml',
+ 'test/process/lead2opportunity2win.yml',
+ 'test/process/merge_opportunity.yml',
+ 'test/process/cancel_lead.yml',
+ 'test/process/segmentation.yml',
+ 'test/ui/crm_demo.yml',
+ 'test/ui/duplicate_lead.yml',
+ 'test/ui/delete_lead.yml'
],
'installable': True,
+ 'application': True,
'active': False,
'certificate': '0079056041421',
'images': ['images/sale_crm_crm_dashboard.png', 'images/crm_dashboard.jpeg','images/leads.jpeg','images/meetings.jpeg','images/opportunities.jpeg','images/outbound_calls.jpeg','images/stages.jpeg'],
diff --git a/addons/crm/board_crm_statistical_view.xml b/addons/crm/board_crm_statistical_view.xml
index 607d4497c37..5ea3844e896 100644
--- a/addons/crm/board_crm_statistical_view.xml
+++ b/addons/crm/board_crm_statistical_view.xml
@@ -78,31 +78,22 @@
form
-
-
-
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
diff --git a/addons/crm/board_crm_view.xml b/addons/crm/board_crm_view.xml
index 069e3025b13..5d64bf20093 100644
--- a/addons/crm/board_crm_view.xml
+++ b/addons/crm/board_crm_view.xml
@@ -62,10 +62,11 @@
My Open Opportunities
- crm.lead
- form
- tree,form
- [('user_id','=',uid),('state','=','open'), ('type', '=', 'opportunity')]
+ crm.lead
+ form
+ tree,form
+ [('user_id','=',uid),('state','=','open'), ('type', '=', 'opportunity')]
+ {'default_user_id': uid, 'default_type': 'opportunity'}
@@ -82,68 +83,32 @@
-
- My Meetings
- crm.meeting
- form
- tree,form
-
- [('user_id','=',uid),('state','not in',('cancel','done'))]
-
-
Planned Revenue By Stage
crm.lead.report
form
graph,tree,form
- ['&', '&', ('user_id','=',uid), ('type', '=', 'opportunity'), '!' , '&', ('state', '=', 'done'), ('date_closed','>',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%Y-%m-%d'))]
+ [('user_id','=',uid), ('type', '=', 'opportunity'), ('state','in',('draft','open','done','pending')), '!', '&', ('state', '=', 'done'), ('date_closed','>=',datetime.date.today().strftime('%Y-%m-01'))]
{'search_default_Stage':1}
-
- My Win/Lost Ratio for The Last Year
- crm.lead.report
- form
- graph,tree,form
-
- ['&', ('user_id', '=', uid),'&', ('state', '=', 'done') , '&', ('create_date','>',(datetime.date.today()-datetime.timedelta(days=365)).strftime('%Y-%m-%d')), ('type', '=', 'opportunity')]
-
-
Sales Dashboard Form
board.board
form
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/addons/crm/crm.py b/addons/crm/crm.py
index 675174d8f10..bee1e48ada2 100644
--- a/addons/crm/crm.py
+++ b/addons/crm/crm.py
@@ -155,7 +155,7 @@ class crm_case_categ(osv.osv):
"""Finds id for case object"""
object_id = context and context.get('object_id', False) or False
ids = self.pool.get('ir.model').search(cr, uid, [('model', '=', object_id)])
- return ids and ids[0]
+ return ids and ids[0] or False
_defaults = {
'object_id' : _find_object_id
@@ -241,6 +241,8 @@ class crm_base(object):
address = self.pool.get('res.partner.address').browse(cr, uid, add)
data['value'] = {'email_from': address and address.email or False ,
'phone': address and address.phone or False}
+ if 'phone' not in self._columns:
+ del data['value']['phone']
return data
def onchange_partner_id(self, cr, uid, ids, part, email=False):
@@ -466,10 +468,12 @@ class crm_case(crm_base):
self._action(cr, uid, cases, state)
return True
+ #DEAD Code
def remind_partner(self, cr, uid, ids, context=None, attach=False):
return self.remind_user(cr, uid, ids, context, attach,
destination=False)
+ #DEAD Code
def remind_user(self, cr, uid, ids, context=None, attach=False, destination=True):
mail_message = self.pool.get('mail.message')
for case in self.browse(cr, uid, ids, context=context):
@@ -576,3 +580,5 @@ class users(osv.osv):
return res
users()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/crm_demo.xml b/addons/crm/crm_demo.xml
index 16ae0e73129..f345d86d030 100644
--- a/addons/crm/crm_demo.xml
+++ b/addons/crm/crm_demo.xml
@@ -1,6 +1,6 @@
-
+
@@ -12,5 +12,17 @@
+
+ Sales Marketing Department
+ Sales Marketing
+
+
+
+
+ OpenERP partners
+ True
+
+
+
diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py
index 91c8a453cd6..216a898bc88 100644
--- a/addons/crm/crm_lead.py
+++ b/addons/crm/crm_lead.py
@@ -27,7 +27,7 @@ from tools.translate import _
from crm import crm_case
import binascii
import tools
-
+from mail.mail_message import to_email
CRM_LEAD_PENDING_STATES = (
crm.AVAILABLE_STATES[2][0], # Cancelled
@@ -42,11 +42,19 @@ class crm_lead(crm_case, osv.osv):
_order = "priority,date_action,id desc"
_inherit = ['mail.thread','res.partner.address']
- def _read_group_stage_ids(self, cr, uid, ids, domain, context=None):
- context = context or {}
+ def _read_group_stage_ids(self, cr, uid, ids, domain, read_group_order=None, access_rights_uid=None, context=None):
+ access_rights_uid = access_rights_uid or uid
stage_obj = self.pool.get('crm.case.stage')
- stage_ids = stage_obj.search(cr, uid, ['|', ('id','in',ids), ('case_default','=',1)], context=context)
- return stage_obj.name_get(cr, uid, stage_ids, context=context)
+ order = stage_obj._order
+ if read_group_order == 'stage_id desc':
+ # lame hack to allow reverting search, should just work in the trivial case
+ order = "%s desc" % order
+ stage_ids = stage_obj._search(cr, uid, ['|', ('id','in',ids),('case_default','=',1)], order=order,
+ access_rights_uid=access_rights_uid, context=context)
+ result = stage_obj.name_get(cr, access_rights_uid, stage_ids, context=context)
+ # restore order of the search
+ result.sort(lambda x,y: cmp(stage_ids.index(x[0]), stage_ids.index(y[0])))
+ return result
_group_by_full = {
'stage_id': _read_group_stage_ids
@@ -198,6 +206,7 @@ class crm_lead(crm_case, osv.osv):
'stage_id': fields.many2one('crm.case.stage', 'Stage', domain="[('section_ids', '=', section_id)]"),
'color': fields.integer('Color Index'),
'partner_address_name': fields.related('partner_address_id', 'name', type='char', string='Partner Contact Name', readonly=True),
+ 'partner_address_email': fields.related('partner_address_id', 'email', type='char', string='Partner Contact Email', readonly=True),
'company_currency': fields.related('company_id', 'currency_id', 'symbol', type='char', string='Company Currency', readonly=True),
'user_email': fields.related('user_id', 'user_email', type='char', string='User Email', readonly=True),
'user_login': fields.related('user_id', 'login', type='char', string='User Login', readonly=True),
@@ -343,36 +352,380 @@ class crm_lead(crm_case, osv.osv):
"""
return self.set_priority(cr, uid, ids, '3')
- def convert_opportunity(self, cr, uid, ids, context=None):
- """ Precomputation for converting lead to opportunity
+
+ def _merge_data(self, cr, uid, ids, oldest, fields, context=None):
+ # prepare opportunity data into dictionary for merging
+ opportunities = self.browse(cr, uid, ids, context=context)
+ def _get_first_not_null(attr):
+ if hasattr(oldest, attr):
+ return getattr(oldest, attr)
+ for opportunity in opportunities:
+ if hasattr(opportunity, attr):
+ return getattr(opportunity, attr)
+ return False
+
+ def _get_first_not_null_id(attr):
+ res = _get_first_not_null(attr)
+ return res and res.id or False
+
+ def _concat_all(attr):
+ return ', '.join(filter(lambda x: x, [getattr(opportunity, attr) or '' for opportunity in opportunities if hasattr(opportunity, attr)]))
+
+ data = {}
+ for field_name in fields:
+ field_info = self._all_columns.get(field_name)
+ if field_info is None:
+ continue
+ field = field_info.column
+ if field._type in ('many2many', 'one2many'):
+ continue
+ elif field._type == 'many2one':
+ data[field_name] = _get_first_not_null_id(field_name) # !!
+ elif field._type == 'text':
+ data[field_name] = _concat_all(field_name) #not lost
+ else:
+ data[field_name] = _get_first_not_null(field_name) #not lost
+ return data
+
+ def _merge_find_oldest(self, cr, uid, ids, context=None):
+ if context is None:
+ context = {}
+ #TOCHECK: where pass 'convert' in context ?
+ if context.get('convert'):
+ ids = list(set(ids) - set(context.get('lead_ids', False)) )
+
+ #search opportunities order by create date
+ opportunity_ids = self.search(cr, uid, [('id', 'in', ids)], order='create_date' , context=context)
+ oldest_id = opportunity_ids[0]
+ return self.browse(cr, uid, oldest_id, context=context)
+
+ def _mail_body_text(self, cr, uid, lead, fields, title=False, context=None):
+ body = []
+ if title:
+ body.append("%s\n" % (title))
+ for field_name in fields:
+ field_info = self._all_columns.get(field_name)
+ if field_info is None:
+ continue
+ field = field_info.column
+ value = None
+
+ if field._type == 'selection':
+ if hasattr(field.selection, '__call__'):
+ key = field.selection(self, cr, uid, context=context)
+ else:
+ key = field.selection
+ value = dict(key).get(lead[field_name], lead[field_name])
+ elif field._type == 'many2one':
+ if lead[field_name]:
+ value = lead[field_name].name_get()[0][1]
+ else:
+ value = lead[field_name]
+
+ body.append("%s: %s" % (field.string, value or ''))
+ return "\n".join(body + ['---'])
+
+ def _merge_notification(self, cr, uid, opportunity_id, opportunities, context=None):
+ #TOFIX: mail template should be used instead of fix body, subject text
+ details = []
+ merge_message = _('Merged opportunities')
+ subject = [merge_message]
+ fields = ['name', 'partner_id', 'stage_id', 'section_id', 'user_id', 'categ_id', 'channel_id', 'company_id', 'contact_name',
+ 'email_from', 'phone', 'fax', 'mobile', 'state_id', 'description', 'probability', 'planned_revenue',
+ 'country_id', 'city', 'street', 'street2', 'zip']
+ for opportunity in opportunities:
+ subject.append(opportunity.name)
+ title = "%s : %s" % (merge_message, opportunity.name)
+ details.append(self._mail_body_text(cr, uid, opportunity, fields, title=title, context=context))
+
+ subject = subject[0] + ", ".join(subject[1:])
+ details = "\n\n".join(details)
+ return self.message_append(cr, uid, [opportunity_id], subject, body_text=details, context=context)
+
+ def _merge_opportunity_history(self, cr, uid, opportunity_id, opportunities, context=None):
+ message = self.pool.get('mail.message')
+ for opportunity in opportunities:
+ for history in opportunity.message_ids:
+ message.write(cr, uid, history.id, {
+ 'res_id': opportunity_id,
+ 'subject' : _("From %s : %s") % (opportunity.name, history.subject)
+ }, context=context)
+
+ return True
+
+ def _merge_opportunity_attachments(self, cr, uid, opportunity_id, opportunities, context=None):
+ attachment = self.pool.get('ir.attachment')
+
+ # return attachments of opportunity
+ def _get_attachments(opportunity_id):
+ attachment_ids = attachment.search(cr, uid, [('res_model', '=', self._name), ('res_id', '=', opportunity_id)], context=context)
+ return attachment.browse(cr, uid, attachment_ids, context=context)
+
+ count = 1
+ first_attachments = _get_attachments(opportunity_id)
+ for opportunity in opportunities:
+ attachments = _get_attachments(opportunity.id)
+ for first in first_attachments:
+ for attachment in attachments:
+ if attachment.name == first.name:
+ values = dict(
+ name = "%s (%s)" % (attachment.name, count,),
+ res_id = opportunity_id,
+ )
+ attachment.write(values)
+ count+=1
+
+ return True
+
+ def merge_opportunity(self, cr, uid, ids, context=None):
+ """
+ To merge opportunities
+ :param ids: list of opportunities ids to merge
+ """
+ if context is None: context = {}
+
+ #TOCHECK: where pass lead_ids in context?
+ lead_ids = context and context.get('lead_ids', []) or []
+
+ if len(ids) <= 1:
+ raise osv.except_osv(_('Warning !'),_('Please select more than one opportunities.'))
+
+ ctx_opportunities = self.browse(cr, uid, lead_ids, context=context)
+ opportunities = self.browse(cr, uid, ids, context=context)
+ opportunities_list = list(set(opportunities) - set(ctx_opportunities))
+ oldest = self._merge_find_oldest(cr, uid, ids, context=context)
+ if ctx_opportunities :
+ first_opportunity = ctx_opportunities[0]
+ tail_opportunities = opportunities_list
+ else:
+ first_opportunity = opportunities_list[0]
+ tail_opportunities = opportunities_list[1:]
+
+ fields = ['partner_id', 'title', 'name', 'categ_id', 'channel_id', 'city', 'company_id', 'contact_name', 'country_id',
+ 'partner_address_id', 'type_id', 'user_id', 'section_id', 'state_id', 'description', 'email', 'fax', 'mobile',
+ 'partner_name', 'phone', 'probability', 'planned_revenue', 'street', 'street2', 'zip', 'create_date', 'date_action_last',
+ 'date_action_next', 'email_from', 'email_cc', 'partner_name']
+
+ data = self._merge_data(cr, uid, ids, oldest, fields, context=context)
+
+ # merge data into first opportunity
+ self.write(cr, uid, [first_opportunity.id], data, context=context)
+
+ #copy message and attachements into the first opportunity
+ self._merge_opportunity_history(cr, uid, first_opportunity.id, tail_opportunities, context=context)
+ self._merge_opportunity_attachments(cr, uid, first_opportunity.id, tail_opportunities, context=context)
+
+ #Notification about loss of information
+ self._merge_notification(cr, uid, first_opportunity, opportunities, context=context)
+ #delete tail opportunities
+ self.unlink(cr, uid, [x.id for x in tail_opportunities], context=context)
+
+ #open first opportunity
+ self.case_open(cr, uid, [first_opportunity.id])
+ return first_opportunity.id
+
+ def _convert_opportunity_data(self, cr, uid, lead, customer, section_id=False, context=None):
+ crm_stage = self.pool.get('crm.case.stage')
+ contact_id = False
+ if customer:
+ contact_id = self.pool.get('res.partner').address_get(cr, uid, [customer.id])['default']
+ if not section_id:
+ section_id = lead.section_id and lead.section_id.id or False
+ if section_id:
+ stage_ids = crm_stage.search(cr, uid, [('sequence','>=',1), ('section_ids','=', section_id)])
+ else:
+ stage_ids = crm_stage.search(cr, uid, [('sequence','>=',1)])
+ stage_id = stage_ids and stage_ids[0] or False
+ return {
+ 'planned_revenue': lead.planned_revenue,
+ 'probability': lead.probability,
+ 'name': lead.name,
+ 'partner_id': customer and customer.id or False,
+ 'user_id': (lead.user_id and lead.user_id.id),
+ 'type': 'opportunity',
+ 'stage_id': stage_id or False,
+ 'date_action': time.strftime('%Y-%m-%d %H:%M:%S'),
+ 'partner_address_id': contact_id
+ }
+ def _convert_opportunity_notification(self, cr, uid, lead, context=None):
+ success_message = _("Lead '%s' has been converted to an opportunity.") % lead.name
+ self.message_append(cr, uid, [lead.id], success_message, body_text=success_message, context=context)
+ self.log(cr, uid, lead.id, success_message)
+ self._send_mail_to_salesman(cr, uid, lead, context=context)
+ return True
+
+ def convert_opportunity(self, cr, uid, ids, partner_id, user_ids=False, section_id=False, context=None):
+ partner = self.pool.get('res.partner')
+ mail_message = self.pool.get('mail.message')
+ customer = False
+ if partner_id:
+ customer = partner.browse(cr, uid, partner_id, context=context)
+ for lead in self.browse(cr, uid, ids, context=context):
+ if lead.state in ('done', 'cancel'):
+ continue
+ if user_ids or section_id:
+ self.allocate_salesman(cr, uid, [lead.id], user_ids, section_id, context=context)
+
+ vals = self._convert_opportunity_data(cr, uid, lead, customer, section_id, context=context)
+ self.write(cr, uid, [lead.id], vals, context=context)
+
+ self._convert_opportunity_notification(cr, uid, lead, context=context)
+ #TOCHECK: why need to change partner details in all messages of lead ?
+ if lead.partner_id:
+ msg_ids = [ x.id for x in lead.message_ids]
+ mail_message.write(cr, uid, msg_ids, {
+ 'partner_id': lead.partner_id.id
+ }, context=context)
+ return True
+
+ def _lead_create_partner(self, cr, uid, lead, context=None):
+ partner = self.pool.get('res.partner')
+ partner_id = partner.create(cr, uid, {
+ 'name': lead.partner_name or lead.contact_name or lead.name,
+ 'user_id': lead.user_id.id,
+ 'comment': lead.description,
+ 'section_id': lead.section_id.id or False,
+ 'address': []
+ })
+ return partner_id
+
+ def _lead_set_partner(self, cr, uid, lead, partner_id, context=None):
+ res = False
+ res_partner = self.pool.get('res.partner')
+ if partner_id:
+ res_partner.write(cr, uid, partner_id, {'section_id': lead.section_id.id or False})
+ contact_id = res_partner.address_get(cr, uid, [partner_id])['default']
+ res = lead.write({'partner_id' : partner_id, 'partner_address_id': contact_id}, context=context)
+
+ return res
+
+ def _lead_create_partner_address(self, cr, uid, lead, partner_id, context=None):
+ address = self.pool.get('res.partner.address')
+ return address.create(cr, uid, {
+ 'partner_id': partner_id,
+ 'name': lead.contact_name,
+ 'phone': lead.phone,
+ 'mobile': lead.mobile,
+ 'email': lead.email_from and to_email(lead.email_from)[0],
+ 'fax': lead.fax,
+ 'title': lead.title and lead.title.id or False,
+ 'function': lead.function,
+ 'street': lead.street,
+ 'street2': lead.street2,
+ 'zip': lead.zip,
+ 'city': lead.city,
+ 'country_id': lead.country_id and lead.country_id.id or False,
+ 'state_id': lead.state_id and lead.state_id.id or False,
+ })
+
+ def convert_partner(self, cr, uid, ids, action='create', partner_id=False, context=None):
+ """
+ This function convert partner based on action.
+ if action is 'create', create new partner with contact and assign lead to new partner_id.
+ otherwise assign lead to specified partner_id
"""
if context is None:
context = {}
- context.update({'active_ids': ids})
+ partner_ids = {}
+ for lead in self.browse(cr, uid, ids, context=context):
+ if action == 'create':
+ if not partner_id:
+ partner_id = self._lead_create_partner(cr, uid, lead, context=context)
+ self._lead_create_partner_address(cr, uid, lead, partner_id, context=context)
+ self._lead_set_partner(cr, uid, lead, partner_id, context=context)
+ partner_ids[lead.id] = partner_id
+ return partner_ids
- data_obj = self.pool.get('ir.model.data')
- value = {}
+ def _send_mail_to_salesman(self, cr, uid, lead, context=None):
+ """
+ Send mail to salesman with updated Lead details.
+ @ lead: browse record of 'crm.lead' object.
+ """
+ #TOFIX: mail template should be used here instead of fix subject, body text.
+ message = self.pool.get('mail.message')
+ email_to = lead.user_id and lead.user_id.user_email
+ if not email_to:
+ return False
+
+ email_from = lead.section_id and lead.section_id.user_id and lead.section_id.user_id.user_email or email_to
+ partner = lead.partner_id and lead.partner_id.name or lead.partner_name
+ subject = "lead %s converted into opportunity" % lead.name
+ body = "Info \n Id : %s \n Subject: %s \n Partner: %s \n Description : %s " % (lead.id, lead.name, lead.partner_id.name, lead.description)
+ return message.schedule_with_attach(cr, uid, email_from, [email_to], subject, body)
- for case in self.browse(cr, uid, ids, context=context):
- context.update({'active_id': case.id})
- data_id = data_obj._get_id(cr, uid, 'crm', 'view_crm_lead2opportunity_partner')
- view_id1 = False
- if data_id:
- view_id1 = data_obj.browse(cr, uid, data_id, context=context).res_id
- value = {
- 'name': _('Create Partner'),
- 'view_type': 'form',
- 'view_mode': 'form,tree',
- 'res_model': 'crm.lead2opportunity.partner',
- 'view_id': False,
- 'context': context,
- 'views': [(view_id1, 'form')],
- 'type': 'ir.actions.act_window',
- 'target': 'new',
- 'nodestroy': True
+ def allocate_salesman(self, cr, uid, ids, user_ids, team_id=False, context=None):
+ index = 0
+ for lead_id in ids:
+ value = {}
+ if team_id:
+ value['section_id'] = team_id
+ if index < len(user_ids):
+ value['user_id'] = user_ids[index]
+ index += 1
+ if value:
+ self.write(cr, uid, [lead_id], value, context=context)
+ return True
+
+ def schedule_phonecall(self, cr, uid, ids, schedule_time, call_summary, desc, phone, contact_name, user_id=False, section_id=False, categ_id=False, action='schedule', context=None):
+ """
+ action :('schedule','Schedule a call'), ('log','Log a call')
+ """
+ phonecall = self.pool.get('crm.phonecall')
+ model_data = self.pool.get('ir.model.data')
+ phonecall_dict = {}
+ if not categ_id:
+ res_id = model_data._get_id(cr, uid, 'crm', 'categ_phone2')
+ if res_id:
+ categ_id = model_data.browse(cr, uid, res_id, context=context).res_id
+ for lead in self.browse(cr, uid, ids, context=context):
+ if not section_id:
+ section_id = lead.section_id and lead.section_id.id or False
+ if not user_id:
+ user_id = lead.user_id and lead.user_id.id or False
+ vals = {
+ 'name' : call_summary,
+ 'opportunity_id' : lead.id,
+ 'user_id' : user_id or False,
+ 'categ_id' : categ_id or False,
+ 'description' : desc or '',
+ 'date' : schedule_time,
+ 'section_id' : section_id or False,
+ 'partner_id': lead.partner_id and lead.partner_id.id or False,
+ 'partner_address_id': lead.partner_address_id and lead.partner_address_id.id or False,
+ 'partner_phone' : phone or lead.phone or (lead.partner_address_id and lead.partner_address_id.phone or False),
+ 'partner_mobile' : lead.partner_address_id and lead.partner_address_id.mobile or False,
+ 'priority': lead.priority,
}
- return value
+
+ new_id = phonecall.create(cr, uid, vals, context=context)
+ phonecall.case_open(cr, uid, [new_id])
+ if action == 'log':
+ phonecall.case_close(cr, uid, [new_id])
+ phonecall_dict[lead.id] = new_id
+ return phonecall_dict
+
+
+ def redirect_opportunity_view(self, cr, uid, opportunity_id, context=None):
+ models_data = self.pool.get('ir.model.data')
+
+ # Get Opportunity views
+ form_view = models_data.get_object_reference(cr, uid, 'crm', 'crm_case_form_view_oppor')
+ tree_view = models_data.get_object_reference(cr, uid, 'crm', 'crm_case_tree_view_oppor')
+ return {
+ 'name': _('Opportunity'),
+ 'view_type': 'form',
+ 'view_mode': 'tree, form',
+ 'res_model': 'crm.lead',
+ 'domain': [('type', '=', 'opportunity')],
+ 'res_id': int(opportunity_id),
+ 'view_id': False,
+ 'views': [(form_view and form_view[1] or False, 'form'),
+ (tree_view and tree_view[1] or False, 'tree'),
+ (False, 'calendar'), (False, 'graph')],
+ 'type': 'ir.actions.act_window',
+ }
+
def message_new(self, cr, uid, msg, custom_values=None, context=None):
"""Automatically calls when new email message arrives"""
@@ -395,10 +748,11 @@ class crm_lead(crm_case, osv.osv):
self.write(cr, uid, [res_id], vals, context)
return res_id
- def message_update(self, cr, uid, ids, msg, vals={}, default_act='pending', context=None):
+ def message_update(self, cr, uid, ids, msg, vals=None, default_act='pending', context=None):
if isinstance(ids, (str, int, long)):
ids = [ids]
-
+ if vals == None:
+ vals = {}
super(crm_lead, self).message_update(cr, uid, ids, msg, context=context)
if msg.get('priority') in dict(crm.AVAILABLE_PRIORITIES):
@@ -432,24 +786,17 @@ class crm_lead(crm_case, osv.osv):
This opens Meeting's calendar view to schedule meeting on current Opportunity
@return : Dictionary value for created Meeting view
"""
+ if context is None:
+ context = {}
value = {}
+ data_obj = self.pool.get('ir.model.data')
for opp in self.browse(cr, uid, ids, context=context):
- data_obj = self.pool.get('ir.model.data')
-
# Get meeting views
- result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_meetings_filter')
- res = data_obj.read(cr, uid, result, ['res_id'])
- id1 = data_obj._get_id(cr, uid, 'crm', 'crm_case_calendar_view_meet')
- id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_form_view_meet')
- id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_tree_view_meet')
- if id1:
- id1 = data_obj.browse(cr, uid, id1, context=context).res_id
- if id2:
- id2 = data_obj.browse(cr, uid, id2, context=context).res_id
- if id3:
- id3 = data_obj.browse(cr, uid, id3, context=context).res_id
-
- context = {
+ tree_view = data_obj.get_object_reference(cr, uid, 'crm', 'crm_case_tree_view_meet')
+ form_view = data_obj.get_object_reference(cr, uid, 'crm', 'crm_case_form_view_meet')
+ calander_view = data_obj.get_object_reference(cr, uid, 'crm', 'crm_case_calendar_view_meet')
+ search_view = data_obj.get_object_reference(cr, uid, 'crm', 'view_crm_case_meetings_filter')
+ context.update({
'default_opportunity_id': opp.id,
'default_partner_id': opp.partner_id and opp.partner_id.id or False,
'default_user_id': uid,
@@ -457,7 +804,7 @@ class crm_lead(crm_case, osv.osv):
'default_email_from': opp.email_from,
'default_state': 'open',
'default_name': opp.name
- }
+ })
value = {
'name': _('Meetings'),
'context': context,
@@ -465,9 +812,9 @@ class crm_lead(crm_case, osv.osv):
'view_mode': 'calendar,form,tree',
'res_model': 'crm.meeting',
'view_id': False,
- 'views': [(id1, 'calendar'), (id2, 'form'), (id3, 'tree')],
+ 'views': [(calander_view and calander_view[1] or False, 'calendar'), (form_view and form_view[1] or False, 'form'), (tree_view and tree_view[1] or False, 'tree')],
'type': 'ir.actions.act_window',
- 'search_view_id': res['res_id'],
+ 'search_view_id': search_view and search_view[1] or False,
'nodestroy': True
}
return value
diff --git a/addons/crm/crm_lead_demo.xml b/addons/crm/crm_lead_demo.xml
index 576f258facc..830b572676d 100644
--- a/addons/crm/crm_lead_demo.xml
+++ b/addons/crm/crm_lead_demo.xml
@@ -1,6 +1,6 @@
-
+
@@ -9,8 +9,8 @@
-
-
+
+
@@ -92,7 +92,7 @@
-
+
diff --git a/addons/crm/crm_lead_menu.xml b/addons/crm/crm_lead_menu.xml
index 9b0581844a5..2ec2db18509 100644
--- a/addons/crm/crm_lead_menu.xml
+++ b/addons/crm/crm_lead_menu.xml
@@ -31,7 +31,6 @@
parent="base.menu_base_partner" sequence="1" />
@@ -60,16 +59,23 @@
Opportunities
crm.lead
- tree,form,graph,calendar,kanban
+ kanban,tree,form,graph,calendar
[('type','=','opportunity')]
{'search_default_user_id':uid,'search_default_new':1, 'search_default_open':1, 'search_default_section_id':section_id, 'stage_type': 'opportunity', 'default_type': 'opportunity'}
-
+
With opportunities you can manage and keep track of your sales pipeline by creating specific customer- or prospect-related sales documents to follow up potential sales. Information such as expected revenue, opportunity stage, expected closing date, communication history and much more can be stored. Opportunities can be connected to the email gateway: new emails may create opportunities, each of them automatically gets the history of the conversation with the customer.
You and your team(s) will be able to plan meetings and phone calls from opportunities, convert them into quotations, manage related documents, track all customer related activities, and much more.
+
+
+ kanban
+
+
+
+
tree
diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml
index 16a90e4e44d..e9c77b3bdc6 100644
--- a/addons/crm/crm_lead_view.xml
+++ b/addons/crm/crm_lead_view.xml
@@ -35,7 +35,7 @@
crm.case.categ
form
- {'object_id': 'crm.lead'}
+
[('object_id.model', '=', 'crm.lead')]
Create specific categories that fit your company's activities to better classify and analyse your leads and opportunities. Such categories could for instance reflect your product structure or the different types of sales you do.
@@ -59,10 +59,11 @@
widget="selection"
domain="[('object_id.model','=','crm.lead')]"/>
+ type="action"
+ />
@@ -142,6 +143,29 @@
type="object" icon="gtk-convert" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -170,58 +194,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -304,31 +276,46 @@
+
+
+
+
+
-
-
+
oe_kanban_color_red
+
-
+
+
+
+
+ -
+
+
-
-
-
-
+
-
-
-
@@ -344,13 +331,14 @@
-
+
@@ -443,7 +431,7 @@
Opportunities
crm.lead
form
-
10
+
20
@@ -561,7 +549,7 @@
-
+
@@ -571,34 +559,6 @@
context="{'mail.compose.message.mode':'reply', 'message_id':active_id}"
icon="terp-mail-replied" type="action" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
Schedule a Meeting
-
+ {'default_partner_id': active_id}
@@ -51,7 +51,7 @@
crm.meeting
calendar,tree,form,gantt
- {"search_default_user_id":uid, 'search_default_section_id': section_id, 'virtual_id' : True}
+ {"search_default_user_id":uid, 'search_default_section_id': section_id}
The meeting calendar is shared between the sales teams and fully integrated with other applications such as the employee holidays or the business opportunities. You can also synchronize meetings with your mobile phone using the caldav interface.
diff --git a/addons/crm/crm_meeting_view.xml b/addons/crm/crm_meeting_view.xml
index 636cb8289fb..c04e00e5fcc 100644
--- a/addons/crm/crm_meeting_view.xml
+++ b/addons/crm/crm_meeting_view.xml
@@ -10,7 +10,7 @@
form
[('object_id.model', '=', 'crm.meeting')]
- {'object_id':'crm.meeting'}
+
Create different meeting categories to better organize and classify your meetings.
@@ -45,7 +45,6 @@
widget="selection" />
-
@@ -67,7 +66,7 @@
-
+
@@ -231,24 +230,11 @@
-
+
+
-
-
-
-
-
-
-
-
@@ -294,14 +280,18 @@
-
-
-
+
+
+
+
+
-
diff --git a/addons/crm/crm_phonecall.py b/addons/crm/crm_phonecall.py
index 9cfdddf159c..b9bb6d359b1 100644
--- a/addons/crm/crm_phonecall.py
+++ b/addons/crm/crm_phonecall.py
@@ -102,11 +102,6 @@ class crm_phonecall(crm_base, osv.osv):
def case_close(self, cr, uid, ids, *args):
"""Overrides close for crm_case for setting close date
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of case Ids
- @param *args: Tuple Value for additional Params
"""
res = True
for phone in self.browse(cr, uid, ids):
@@ -121,11 +116,6 @@ class crm_phonecall(crm_base, osv.osv):
def case_reset(self, cr, uid, ids, *args):
"""Resets case as Todo
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of case Ids
- @param *args: Tuple Value for additional Params
"""
res = super(crm_phonecall, self).case_reset(cr, uid, ids, args, 'crm.phonecall')
self.write(cr, uid, ids, {'duration': 0.0})
@@ -134,25 +124,147 @@ class crm_phonecall(crm_base, osv.osv):
def case_open(self, cr, uid, ids, *args):
"""Overrides cancel for crm_case for setting Open Date
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of case's Ids
- @param *args: Give Tuple Value
"""
res = super(crm_phonecall, self).case_open(cr, uid, ids, *args)
self.write(cr, uid, ids, {'date_open': time.strftime('%Y-%m-%d %H:%M:%S')})
return res
+ def schedule_another_phonecall(self, cr, uid, ids, schedule_time, call_summary, \
+ user_id=False, section_id=False, categ_id=False, action='schedule', context=None):
+ """
+ action :('schedule','Schedule a call'), ('log','Log a call')
+ """
+ model_data = self.pool.get('ir.model.data')
+ phonecall_dict = {}
+ if not categ_id:
+ res_id = model_data._get_id(cr, uid, 'crm', 'categ_phone2')
+ if res_id:
+ categ_id = model_data.browse(cr, uid, res_id, context=context).res_id
+ for call in self.browse(cr, uid, ids, context=context):
+ if not section_id:
+ section_id = call.section_id and call.section_id.id or False
+ if not user_id:
+ user_id = call.user_id and call.user_id.id or False
+ vals = {
+ 'name' : call_summary,
+ 'user_id' : user_id or False,
+ 'categ_id' : categ_id or False,
+ 'description' : call.description or False,
+ 'date' : schedule_time,
+ 'section_id' : section_id or False,
+ 'partner_id': call.partner_id and call.partner_id.id or False,
+ 'partner_address_id': call.partner_address_id and call.partner_address_id.id or False,
+ 'partner_phone' : call.partner_phone,
+ 'partner_mobile' : call.partner_mobile,
+ 'priority': call.priority,
+ }
+
+ new_id = self.create(cr, uid, vals, context=context)
+ self.case_open(cr, uid, [new_id])
+ if action == 'log':
+ self.case_close(cr, uid, [new_id])
+ phonecall_dict[call.id] = new_id
+ return phonecall_dict
+
+ def _call_create_partner(self, cr, uid, phonecall, context=None):
+ partner = self.pool.get('res.partner')
+ partner_id = partner.create(cr, uid, {
+ 'name': phonecall.name,
+ 'user_id': phonecall.user_id.id,
+ 'comment': phonecall.description,
+ 'address': []
+ })
+ return partner_id
+
+ def _call_set_partner(self, cr, uid, ids, partner_id, context=None):
+ return self.write(cr, uid, ids, {'partner_id' : partner_id}, context=context)
+
+ def _call_create_partner_address(self, cr, uid, phonecall, partner_id, context=None):
+ address = self.pool.get('res.partner.address')
+ return address.create(cr, uid, {
+ 'partner_id': partner_id,
+ 'name': phonecall.name,
+ 'phone': phonecall.partner_phone,
+ })
+
+ def convert_partner(self, cr, uid, ids, action='create', partner_id=False, context=None):
+ """
+ This function convert partner based on action.
+ if action is 'create', create new partner with contact and assign lead to new partner_id.
+ otherwise assign lead to specified partner_id
+ """
+ if context is None:
+ context = {}
+ partner_ids = {}
+ for call in self.browse(cr, uid, ids, context=context):
+ if action == 'create':
+ if not partner_id:
+ partner_id = self._call_create_partner(cr, uid, call, context=context)
+ self._call_create_partner_address(cr, uid, call, partner_id, context=context)
+ self._call_set_partner(cr, uid, [call.id], partner_id, context=context)
+ partner_ids[call.id] = partner_id
+ return partner_ids
+
+
+ def redirect_phonecall_view(self, cr, uid, phonecall_id, context=None):
+ model_data = self.pool.get('ir.model.data')
+ # Select the view
+ tree_view = model_data.get_object_reference(cr, uid, 'crm', 'crm_case_phone_tree_view')
+ form_view = model_data.get_object_reference(cr, uid, 'crm', 'crm_case_phone_form_view')
+ search_view = model_data.get_object_reference(cr, uid, 'crm', 'view_crm_case_phonecalls_filter')
+ value = {
+ 'name': _('Phone Call'),
+ 'view_type': 'form',
+ 'view_mode': 'tree,form',
+ 'res_model': 'crm.phonecall',
+ 'res_id' : int(phonecall_id),
+ 'views': [(form_view and form_view[1] or False, 'form'), (tree_view and tree_view[1] or False, 'tree'), (False, 'calendar')],
+ 'type': 'ir.actions.act_window',
+ 'search_view_id': search_view and search_view[1] or False,
+ }
+ return value
+
+
+ def convert_opportunity(self, cr, uid, ids, opportunity_summary=False, partner_id=False, planned_revenue=0.0, probability=0.0, context=None):
+ partner = self.pool.get('res.partner')
+ address = self.pool.get('res.partner.address')
+ opportunity = self.pool.get('crm.lead')
+ opportunity_dict = {}
+ default_contact = False
+ for call in self.browse(cr, uid, ids, context=context):
+ if not partner_id:
+ partner_id = call.partner_id and call.partner_id.id or False
+ if partner_id:
+ address_id = partner.address_get(cr, uid, [partner_id])['default']
+ if address_id:
+ default_contact = address.browse(cr, uid, address_id, context=context)
+ opportunity_id = opportunity.create(cr, uid, {
+ 'name': opportunity_summary or call.name,
+ 'planned_revenue': planned_revenue,
+ 'probability': probability,
+ 'partner_id': partner_id or False,
+ 'partner_address_id': default_contact and default_contact.id,
+ 'phone': default_contact and default_contact.phone,
+ 'mobile': default_contact and default_contact.mobile,
+ 'section_id': call.section_id and call.section_id.id or False,
+ 'description': call.description or False,
+ 'priority': call.priority,
+ 'type': 'opportunity',
+ 'phone': call.partner_phone or False,
+ })
+ vals = {
+ 'partner_id': partner_id,
+ 'opportunity_id' : opportunity_id,
+ }
+ self.write(cr, uid, [call.id], vals)
+ self.case_close(cr, uid, [call.id])
+ opportunity.case_open(cr, uid, [opportunity_id])
+ opportunity_dict[call.id] = opportunity_id
+ return opportunity_dict
+
def action_make_meeting(self, cr, uid, ids, context=None):
"""
This opens Meeting's calendar view to schedule meeting on current Phonecall
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Phonecall to Meeting IDs
- @param context: A standard dictionary for contextual values
-
@return : Dictionary value for created Meeting view
"""
value = {}
diff --git a/addons/crm/crm_phonecall_demo.xml b/addons/crm/crm_phonecall_demo.xml
index 8f0661ab8be..e80930284f4 100644
--- a/addons/crm/crm_phonecall_demo.xml
+++ b/addons/crm/crm_phonecall_demo.xml
@@ -83,9 +83,6 @@
-
-
-
diff --git a/addons/crm/crm_phonecall_view.xml b/addons/crm/crm_phonecall_view.xml
index 54ea8bd7dfc..23f871d1581 100644
--- a/addons/crm/crm_phonecall_view.xml
+++ b/addons/crm/crm_phonecall_view.xml
@@ -10,7 +10,7 @@
form
[('object_id.model', '=', 'crm.phonecall')]
- {'object_id':'crm.phonecall'}
+
Create specific phone call categories to better define the type of calls tracked in the system.
diff --git a/addons/crm/report/crm_lead_report.py b/addons/crm/report/crm_lead_report.py
index 24f48e7de86..a2215d28740 100644
--- a/addons/crm/report/crm_lead_report.py
+++ b/addons/crm/report/crm_lead_report.py
@@ -147,6 +147,7 @@ class crm_lead_report(osv.osv):
extract('epoch' from (c.date_open-c.create_date))/(3600*24) as delay_open
FROM
crm_lead c
+ WHERE c.active = 'true'
)""")
crm_lead_report()
diff --git a/addons/crm/report/crm_lead_report_view.xml b/addons/crm/report/crm_lead_report_view.xml
index 3817e269241..32fbe65c337 100644
--- a/addons/crm/report/crm_lead_report_view.xml
+++ b/addons/crm/report/crm_lead_report_view.xml
@@ -72,6 +72,17 @@
+
+
+
+
+
-
-
-
-
-
-
Leads Analysis
crm.lead.report
form
-
{'search_default_lead': 1, "search_default_user":1, "search_default_this_month":1, 'group_by_no_leaf':1, 'group_by':[]}
+
{'search_default_year': 1,'search_default_lead': 1, "search_default_user":1, "search_default_this_month":1, 'group_by_no_leaf':1, 'group_by':[]}
tree,graph
[]
Leads Analysis allows you to check different CRM related information. Check for treatment delays, number of responses given and emails sent. You can sort out your leads analysis by different groups to get accurate grained analysis.
@@ -243,7 +242,7 @@
Opportunities Analysis
crm.lead.report
form
-
{"search_default_opportunity":1,"search_default_opportunity": 1, "search_default_user":1,"search_default_this_month":1,'group_by_no_leaf':1,'group_by':[]}
+
{"search_default_year":1,"search_default_opportunity":1, "search_default_user":1,"search_default_this_month":1,'group_by_no_leaf':1,'group_by':[]}
tree,graph
Opportunities Analysis gives you an instant access to your opportunities with information such as the expected revenue, planned cost, missed deadlines or the number of interactions per opportunity. This report is mainly used by the sales manager in order to do the periodic review with the teams of the sales pipeline.
diff --git a/addons/crm/report/crm_phonecall_report.py b/addons/crm/report/crm_phonecall_report.py
index f68bea03880..ef3bcccdc9a 100644
--- a/addons/crm/report/crm_phonecall_report.py
+++ b/addons/crm/report/crm_phonecall_report.py
@@ -99,3 +99,5 @@ class crm_phonecall_report(osv.osv):
crm_phonecall c
)""")
crm_phonecall_report()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/report/crm_phonecall_report_view.xml b/addons/crm/report/crm_phonecall_report_view.xml
index 2f40ba371b9..e171388d08f 100644
--- a/addons/crm/report/crm_phonecall_report_view.xml
+++ b/addons/crm/report/crm_phonecall_report_view.xml
@@ -52,15 +52,14 @@
-
-
-
+
-
-
@@ -135,7 +134,7 @@
crm.phonecall.report
form
tree,graph
- {"search_default_User":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]}
+ {"search_default_year":1,"search_default_User":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]}
From this report, you can analyse the performance of your sales team, based on their phone calls. You can group or filter the information according to several criteria and drill down the information, by adding more groups in the report.
diff --git a/addons/crm/res_partner.py b/addons/crm/res_partner.py
index cbb05ee3e74..e2016f6d8aa 100644
--- a/addons/crm/res_partner.py
+++ b/addons/crm/res_partner.py
@@ -33,6 +33,44 @@ class res_partner(osv.osv):
'phonecall_ids': fields.one2many('crm.phonecall', 'partner_id',\
'Phonecalls'),
}
+
+ def redirect_partner_form(self, cr, uid, partner_id, context=None):
+ search_view = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'base', 'view_res_partner_filter')
+ value = {
+ 'domain': "[]",
+ 'view_type': 'form',
+ 'view_mode': 'form,tree',
+ 'res_model': 'res.partner',
+ 'res_id': int(partner_id),
+ 'view_id': False,
+ 'context': context,
+ 'type': 'ir.actions.act_window',
+ 'search_view_id': search_view and search_view[1] or False
+ }
+ return value
+
+ def make_opportunity(self, cr, uid, ids, opportunity_summary, planned_revenue=0.0, probability=0.0, partner_id=None, context=None):
+ categ = self.pool.get('crm.case.categ')
+ address = self.address_get(cr, uid, ids)
+ categ_ids = categ.search(cr, uid, [('object_id.model','=','crm.lead')])
+ lead = self.pool.get('crm.lead')
+ opportunity_ids = {}
+ for partner in self.browse(cr, uid, ids, context=context):
+ address = self.address_get(cr, uid, [partner.id])['default']
+ if not partner_id:
+ partner_id = partner.id
+ opportunity_id = lead.create(cr, uid, {
+ 'name' : opportunity_summary,
+ 'planned_revenue' : planned_revenue,
+ 'probability' : probability,
+ 'partner_id' : partner_id,
+ 'partner_address_id' : address,
+ 'categ_id' : categ_ids and categ_ids[0] or '',
+ 'state' :'draft',
+ 'type': 'opportunity'
+ })
+ opportunity_ids[partner_id] = opportunity_id
+ return opportunity_ids
res_partner()
diff --git a/addons/crm/security/crm_security.xml b/addons/crm/security/crm_security.xml
index 8ac32086cfd..3ee9c9e242f 100644
--- a/addons/crm/security/crm_security.xml
+++ b/addons/crm/security/crm_security.xml
@@ -40,6 +40,13 @@
-
+
+
+ Hide Private Meetings
+
+
+ ['|',('user_id','=',user.id),('show_as','=','busy')]
+
+
diff --git a/addons/crm/security/ir.model.access.csv b/addons/crm/security/ir.model.access.csv
index 4ea07252276..c893ed6aad7 100644
--- a/addons/crm/security/ir.model.access.csv
+++ b/addons/crm/security/ir.model.access.csv
@@ -1,48 +1,45 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_crm_segmentation_user","crm.segmentation user","model_crm_segmentation","base.group_sale_salesman",1,0,0,0
-"access_crm_segmentation_line_user","crm.segmentation.line user","model_crm_segmentation_line","base.group_sale_salesman",1,0,0,0
-"access_crm_segmentation","crm.segmentation","model_crm_segmentation","base.group_sale_manager",1,1,1,1
-"access_crm_segmentation_line","crm.segmentation.line","model_crm_segmentation_line","base.group_sale_manager",1,1,1,1
-"access_crm_case_channel_user","crm.case.channel user","model_crm_case_channel","base.group_sale_salesman",1,0,0,0
-"access_crm_case_channel_manager","crm.case.channel manager","model_crm_case_channel","base.group_sale_manager",1,1,1,1
-"access_crm_case_section","crm.case.section","model_crm_case_section","base.group_sale_salesman",1,1,1,0
-"access_crm_case_categ","crm.case.categ","model_crm_case_categ","base.group_sale_salesman",1,1,1,0
-"access_crm_meeting_manager","crm.meeting.manager","model_crm_meeting","base.group_sale_manager",1,1,1,1
-"access_crm_lead_manager","crm.lead.manager","model_crm_lead","base.group_sale_manager",1,1,1,1
-"access_crm_phonecall_manager","crm.phonecall.manager","model_crm_phonecall","base.group_sale_manager",1,1,1,1
-"access_crm_case_categ","crm.case.categ","model_crm_case_categ","base.group_user",1,0,0,0
-"access_crm_meeting","crm.meeting","model_crm_meeting","base.group_sale_salesman",1,1,1,0
-"access_crm_meeting_all","crm.meeting_allll","model_crm_meeting","base.group_user",1,0,0,0
-"access_crm_lead","crm.lead","model_crm_lead","base.group_sale_salesman",1,1,1,0
-"access_crm_lead.all","crm.lead.all","model_crm_lead","base.group_user",1,0,0,0
-"access_crm_phonecall","crm.phonecall","model_crm_phonecall","base.group_sale_salesman",1,1,1,0
-"access_crm_phonecall.all","crm.phonecall.all","model_crm_phonecall","base.group_user",1,0,0,0
-"access_crm_case_section_user","crm.case.section.user","model_crm_case_section","base.group_sale_salesman",1,1,1,0
-"access_crm_case_section_manager","crm.case.section.manager","model_crm_case_section","base.group_sale_manager",1,1,1,1
-"access_crm_case_stage","crm.case.stage","model_crm_case_stage","base.group_user",1,0,0,0
-"access_crm_case_stage_manager","crm.case.stage","model_crm_case_stage","base.group_sale_manager",1,1,1,1
-"access_crm_case_resource_type_user","crm_case_resource_type user","model_crm_case_resource_type","base.group_sale_salesman",1,1,1,0
-"access_crm_case_resource_type_manager","crm_case_resource_type manager","model_crm_case_resource_type","base.group_sale_manager",1,1,1,1
-"access_crm_phonecall_report_user","crm.phonecall.report.user","model_crm_phonecall_report","base.group_sale_salesman",1,0,0,0
-"access_crm_lead_report_manager","crm.lead.report","model_crm_lead_report","base.group_sale_manager",1,1,1,1
-"access_crm_phonecall_report_manager","crm.phonecall.report","model_crm_phonecall_report","base.group_sale_manager",1,1,1,1
-"access_res_partner_manager","res.partner.crm.manager","base.model_res_partner","base.group_sale_manager",1,0,0,0
-"access_res_partner_address_manager","res.partner.address.crm.user.manager","base.model_res_partner_address","base.group_sale_manager",1,0,0,0
-"access_res_partner_category_manager","res.partner.category.crm.manager","base.model_res_partner_category","base.group_sale_manager",1,0,0,0
-"mail_mail_message_manager","mail.message.manager","mail.model_mail_message","base.group_sale_manager",1,0,0,0
-"mail_thread_manager","mail.thread.manager","mail.model_mail_thread","base.group_sale_manager",1,1,1,1
-"access_calendar_attendee_crm_user","calendar.attendee.crm.user","model_calendar_attendee","base.group_sale_salesman",1,1,1,0
-"access_calendar_attendee_crm_manager","calendar.attendee.crm.manager","model_calendar_attendee","base.group_sale_manager",1,1,1,1
-"access_res_partner","res.partner.crm.user","base.model_res_partner","base.group_sale_salesman",1,1,1,0
-"access_res_partner_address","res.partner.address.crm.user","base.model_res_partner_address","base.group_sale_salesman",1,1,1,0
-"access_res_partner_category","res.partner.category.crm.user","base.model_res_partner_category","base.group_sale_salesman",1,1,1,0
-"mail_mailgate_thread","mail.thread","mail.model_mail_thread","base.group_sale_salesman",1,1,1,1
-"mail_gateway_mail_message_user","mail.message.user","mail.model_mail_message","base.group_sale_salesman",1,1,1,1
-"access_crm_case_categ_manager","crm.case.categ manager","model_crm_case_categ","base.group_sale_manager",1,1,1,1
-"access_base_action_rule_manager","base.action.rule manager","model_base_action_rule","base.group_sale_manager",1,1,1,1
-"access_crm_lead_report_user","crm.lead.report user","model_crm_lead_report","base.group_sale_salesman",1,1,1,1
-"access_res_partner_bank_type_crm_user","res.partner.bank.type.crm.user","base.model_res_partner_bank_type","base.group_sale_salesman",1,0,0,0
-"access_res_partner_bank_type_crm_manager","res.partner.bank.type.crm.manager","base.model_res_partner_bank_type","base.group_sale_manager",1,0,0,0
-"access_crm_lead_partner_manager","crm.lead.partner.manager","model_crm_lead","base.group_partner_manager",1,0,0,0
-"access_crm_phonecall_partner_manager","crm.phonecall.partner.manager","model_crm_phonecall","base.group_partner_manager",1,1,1,1
-"access_crm_meeting_partner_manager","crm.meeting.partner.manager","model_crm_meeting","base.group_partner_manager",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_crm_segmentation_user,crm.segmentation user,model_crm_segmentation,base.group_sale_salesman,1,0,0,0
+access_crm_segmentation_line_user,crm.segmentation.line user,model_crm_segmentation_line,base.group_sale_salesman,1,0,0,0
+access_crm_segmentation,crm.segmentation,model_crm_segmentation,base.group_sale_manager,1,1,1,1
+access_crm_segmentation_line,crm.segmentation.line,model_crm_segmentation_line,base.group_sale_manager,1,1,1,1
+access_crm_case_channel_user,crm.case.channel user,model_crm_case_channel,base.group_sale_salesman,1,0,0,0
+access_crm_case_channel_manager,crm.case.channel manager,model_crm_case_channel,base.group_sale_manager,1,1,1,1
+access_crm_case_section,crm.case.section,model_crm_case_section,base.group_sale_salesman,1,1,1,0
+access_crm_case_categ,crm.case.categ,model_crm_case_categ,base.group_sale_salesman,1,1,1,0
+access_crm_meeting_manager,crm.meeting.manager,model_crm_meeting,base.group_sale_manager,1,1,1,1
+access_crm_lead_manager,crm.lead.manager,model_crm_lead,base.group_sale_manager,1,1,1,1
+access_crm_phonecall_manager,crm.phonecall.manager,model_crm_phonecall,base.group_sale_manager,1,1,1,1
+access_crm_case_categ,crm.case.categ,model_crm_case_categ,base.group_user,1,0,0,0
+access_crm_meeting,crm.meeting,model_crm_meeting,base.group_sale_salesman,1,1,1,0
+access_crm_meeting_all,crm.meeting_allll,model_crm_meeting,base.group_user,1,0,0,0
+access_crm_lead,crm.lead,model_crm_lead,base.group_sale_salesman,1,1,1,0
+access_crm_lead.all,crm.lead.all,model_crm_lead,base.group_user,1,0,0,0
+access_crm_phonecall,crm.phonecall,model_crm_phonecall,base.group_sale_salesman,1,1,1,0
+access_crm_phonecall.all,crm.phonecall.all,model_crm_phonecall,base.group_user,1,0,0,0
+access_crm_case_section_user,crm.case.section.user,model_crm_case_section,base.group_sale_salesman,1,1,1,0
+access_crm_case_section_manager,crm.case.section.manager,model_crm_case_section,base.group_sale_manager,1,1,1,1
+access_crm_case_stage,crm.case.stage,model_crm_case_stage,base.group_user,1,0,0,0
+access_crm_case_stage_manager,crm.case.stage,model_crm_case_stage,base.group_sale_manager,1,1,1,1
+access_crm_case_resource_type_user,crm_case_resource_type user,model_crm_case_resource_type,base.group_sale_salesman,1,1,1,0
+access_crm_case_resource_type_manager,crm_case_resource_type manager,model_crm_case_resource_type,base.group_sale_manager,1,1,1,1
+access_crm_phonecall_report_user,crm.phonecall.report.user,model_crm_phonecall_report,base.group_sale_salesman,1,0,0,0
+access_crm_phonecall_report_manager,crm.phonecall.report,model_crm_phonecall_report,base.group_sale_manager,1,1,1,1
+access_res_partner_manager,res.partner.crm.manager,base.model_res_partner,base.group_sale_manager,1,0,0,0
+access_res_partner_address_manager,res.partner.address.crm.user.manager,base.model_res_partner_address,base.group_sale_manager,1,0,0,0
+access_res_partner_category_manager,res.partner.category.crm.manager,base.model_res_partner_category,base.group_sale_manager,1,0,0,0
+mail_mail_message_manager,mail.message.manager,mail.model_mail_message,base.group_sale_manager,1,0,0,0
+access_calendar_attendee_crm_user,calendar.attendee.crm.user,model_calendar_attendee,base.group_sale_salesman,1,1,1,0
+access_calendar_attendee_crm_manager,calendar.attendee.crm.manager,model_calendar_attendee,base.group_sale_manager,1,1,1,1
+access_res_partner,res.partner.crm.user,base.model_res_partner,base.group_sale_salesman,1,1,1,0
+access_res_partner_address,res.partner.address.crm.user,base.model_res_partner_address,base.group_sale_salesman,1,1,1,0
+access_res_partner_category,res.partner.category.crm.user,base.model_res_partner_category,base.group_sale_salesman,1,1,1,0
+mail_mailgate_thread,mail.thread,mail.model_mail_thread,base.group_sale_salesman,1,1,1,1
+mail_gateway_mail_message_user,mail.message.user,mail.model_mail_message,base.group_sale_salesman,1,1,1,1
+access_crm_case_categ_manager,crm.case.categ manager,model_crm_case_categ,base.group_sale_manager,1,1,1,1
+access_base_action_rule_manager,base.action.rule manager,model_base_action_rule,base.group_sale_manager,1,1,1,1
+access_crm_lead_report_user,crm.lead.report user,model_crm_lead_report,base.group_sale_salesman,1,1,1,1
+access_res_partner_bank_type_crm_user,res.partner.bank.type.crm.user,base.model_res_partner_bank_type,base.group_sale_salesman,1,0,0,0
+access_crm_lead_partner_manager,crm.lead.partner.manager,model_crm_lead,base.group_partner_manager,1,0,0,0
+access_crm_phonecall_partner_manager,crm.phonecall.partner.manager,model_crm_phonecall,base.group_partner_manager,1,1,1,1
+access_crm_meeting_partner_manager,crm.meeting.partner.manager,model_crm_meeting,base.group_partner_manager,1,1,1,1
diff --git a/addons/crm/test/customer_request.eml b/addons/crm/test/customer_request.eml
new file mode 100644
index 00000000000..2c6c5e8110d
--- /dev/null
+++ b/addons/crm/test/customer_request.eml
@@ -0,0 +1,30 @@
+Return-Path:
+X-Original-To: info@customer.com
+Delivered-To: sales@my.com
+Received: by mail.my.com (Postfix, from userid xxx)
+ id 822ECBFB67; Mon, 24 Oct 2011 07:36:51 +0200 (CEST)
+X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.my.com
+X-Spam-Level:
+X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED autolearn=ham
+ version=3.3.1
+Received: from [192.168.1.146]
+ (Authenticated sender: info@mail.customer.com)
+ by mail.customer.com (Postfix) with ESMTPSA id 07A30BFAB4
+ for ; Mon, 24 Oct 2011 07:36:50 +0200 (CEST)
+Message-ID: <4EA4F95D.904@customer.com>
+Date: Mon, 24 Oct 2011 11:06:29 +0530
+From: Mr. John Right
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.14) Gecko/20110223 Lightning/1.0b2 Thunderbird/3.1.8
+MIME-Version: 1.0
+To: sales@my.com
+Subject: Fournir votre devis avec le meilleur prix.
+Content-Type: text/plain; charset=ISO-8859-1; format=flowed
+Content-Transfer-Encoding: 8bit
+
+Bonjour l'équipe de vente,
+
+Je veux acheter vos produits et services.
+
+S'il vous plaît fournir votre cotation avec le meilleur prix.
+
+Merci
diff --git a/addons/crm/test/process/cancel_lead.yml b/addons/crm/test/process/cancel_lead.yml
new file mode 100644
index 00000000000..a5f85a14058
--- /dev/null
+++ b/addons/crm/test/process/cancel_lead.yml
@@ -0,0 +1,53 @@
+-
+ I cancel unqualified lead.
+-
+ !python {model: crm.lead}: |
+ self.case_cancel(cr, uid, [ref("crm_case_itisatelesalescampaign0")])
+-
+ I check cancelled lead.
+-
+ !assert {model: crm.lead, id: crm.crm_case_itisatelesalescampaign0, string: Lead is in cancel state}:
+ - state == "cancel"
+-
+ I reset cancelled lead into unqualified lead.
+-
+ !python {model: crm.lead}: |
+ self.case_reset(cr, uid, [ref("crm_case_itisatelesalescampaign0")])
+-
+ I check unqualified lead after reset.
+-
+ !assert {model: crm.lead, id: crm.crm_case_itisatelesalescampaign0, string: Lead is in draft state}:
+ - state == "draft"
+-
+ I put unqualified lead into pending.
+-
+ !python {model: crm.lead}: |
+ self.case_pending(cr, uid, [ref("crm_case_itisatelesalescampaign0")])
+-
+ I check status of pending lead.
+-
+ !assert {model: crm.lead, id: crm.crm_case_itisatelesalescampaign0, string: Lead is in pending state}:
+ - state == "pending"
+-
+ I Escalate the Lead to Parent Team.
+-
+ !python {model: crm.lead}: |
+ self.case_escalate(cr, uid, [ref("crm_case_itisatelesalescampaign0")])
+-
+ I check lead escalate to Parent Team.
+-
+ !assert {model: crm.lead, id: crm.crm_case_itisatelesalescampaign0, string: Escalate lead to parent team}:
+ - section_id.name == "Sales Department"
+-
+ I mark as lost the opportunity.
+-
+ !python {model: crm.lead}: |
+ self.case_mark_lost(cr, uid, [ref("crm_case_itisatelesalescampaign0")])
+-
+ I check opportunity after lost.
+-
+ !python {model: crm.lead}: |
+ lead = self.browse(cr, uid, ref('crm_case_itisatelesalescampaign0'))
+ assert lead.state == 'done', "lead is not done state"
+ assert lead.stage_id.id == ref('crm.stage_lead6'), 'Stage is not changed!'
+ assert lead.probability == 0.0, 'Probability is wrong!'
diff --git a/addons/crm/test/process/communication_with_customer.yml b/addons/crm/test/process/communication_with_customer.yml
new file mode 100644
index 00000000000..92e711ce016
--- /dev/null
+++ b/addons/crm/test/process/communication_with_customer.yml
@@ -0,0 +1,56 @@
+-
+ Customer interested in our product. so He send request by email to get more details.
+-
+ Mail script will be fetched him request from mail server. so I process that mail after read EML file
+-
+ !python {model: mail.thread}: |
+ import addons
+ request_file = open(addons.get_module_resource('crm','test', 'customer_request.eml'),'rb')
+ request_message = request_file.read()
+ self.message_process(cr, uid, 'crm.lead', request_message)
+-
+ After getting the mail, I check details of new lead of that customer.
+-
+ !python {model: crm.lead}: |
+ lead_ids = self.search(cr, uid, [('email_from','=', 'Mr. John Right ')])
+ assert lead_ids and len(lead_ids), "Lead is not created after getting request"
+ lead = self.browse(cr, uid, lead_ids[0], context=context)
+ assert not lead.partner_id, "Customer should be a new"
+ assert lead.name == "Fournir votre devis avec le meilleur prix.", "Subject does not match"
+-
+ I reply him request with welcome message.
+-
+ !python {model: mail.compose.message}: |
+ lead_ids = self.pool.get('crm.lead').search(cr, uid, [('email_from','=', 'Mr. John Right ')])
+ context.update({'active_model': 'crm.lead','active_id': lead_ids[0]})
+ id = self.create(cr, uid, {'body_text': "Merci à l'intérêt pour notre produit.nous vous contacterons bientôt. Merci", 'email_from': 'sales@mycompany.com'}, context=context)
+ try:
+ self.send_mail(cr, uid, [id], context=context)
+ except:
+ pass
+-
+ Now, I convert him into customer and put into regular customer list.
+-
+ !python {model: crm.lead}: |
+ lead_ids = self.search(cr, uid, [('email_from','=', 'Mr. John Right ')])
+ self.convert_partner(cr, uid, lead_ids, context=context)
+-
+ Now, I search customer in regular customer list.
+-
+ !python {model: crm.lead}: |
+ partner_ids = self.message_partner_by_email(cr, uid, 'Mr. John Right ')
+ assert partner_ids.get('partner_id'), "Customer is not found in regular customer list."
+-
+ I convert one phonecall request as a customer and put into regular customer list.
+-
+ !python {model: crm.phonecall}: |
+ self.convert_partner(cr, uid, [ref('crm.crm_case_phone06')], context=context)
+-
+ I check converted phonecall to partner.
+-
+ !python {model: res.partner}: |
+ partner_id = self.search(cr, uid, [('phonecall_ids', '=', ref('crm.crm_case_phone06'))])
+ assert partner_id, "Customer is not found in regular customer list."
+ data = self.browse(cr, uid, partner_id, context=context)[0]
+ assert data.user_id.id == ref("base.user_root"), "User not assign properly"
+ assert data.name == "Bad time", "User not assign properly"
diff --git a/addons/crm/test/process/lead2opportunity2win.yml b/addons/crm/test/process/lead2opportunity2win.yml
new file mode 100644
index 00000000000..dbc04abae19
--- /dev/null
+++ b/addons/crm/test/process/lead2opportunity2win.yml
@@ -0,0 +1,90 @@
+-
+ In order to test convert customer lead into opportunity,
+-
+ I open customer lead.
+-
+ !python {model: crm.lead}: |
+ self.case_open(cr, uid, [ref("crm_case_qrecorp0")])
+-
+ I check lead state is "Open".
+-
+ !assert {model: crm.lead, id: crm.crm_case_qrecorp0, string: Lead in open state}:
+ - state == "open"
+-
+ I convert lead into opportunity for exiting customer.
+-
+ !python {model: crm.lead}: |
+ self.convert_opportunity(cr, uid ,[ref("crm_case_qrecorp0")], ref("base.res_partner_agrolait"))
+-
+ I check details of converted opportunity.
+-
+ !python {model: crm.lead}: |
+ lead = self.browse(cr, uid, ref('crm_case_qrecorp0'))
+ assert lead.type == 'opportunity', 'Lead is not converted to opportunity!'
+ assert lead.partner_id.id == ref("base.res_partner_agrolait"), 'Partner missmatch!'
+ assert lead.stage_id.id == ref("stage_lead1"), 'Stage of opportunity is incorrect!'
+-
+ Now I begin communication and schedule a phone call with the customer.
+-
+ !python {model: crm.opportunity2phonecall}: |
+ import time
+ context.update({'active_model': 'crm.lead', 'active_ids': [ref('crm_case_qrecorp0')]})
+ call_id = self.create(cr, uid, {'date': time.strftime('%Y-%m-%d %H:%M:%S'),
+ 'name': "Bonjour M. Jean, Comment êtes-vous? J'ai obtenu votre demande. peut-on parler au sujet de ce pour quelques minutes?"}, context=context)
+ self.action_schedule(cr, uid, [call_id], context=context)
+-
+ I check that phonecall is scheduled for that opportunity.
+-
+ !python {model: crm.phonecall}: |
+ ids = self.search(cr, uid, [('opportunity_id', '=', ref('crm_case_qrecorp0'))])
+ assert len(ids), 'phonecall is not scheduled'
+-
+ Now I schedule Meeting with Customer.
+-
+ !python {model: crm.lead}: |
+ self.action_makeMeeting(cr, uid, [ref('crm_case_qrecorp0')])
+
+-
+ After communicated with customer, I put some notes with Contract details.
+-
+ !python {model: crm.add.note}: |
+ context.update({'active_model': 'crm.lead', 'active_id': ref('crm_case_qrecorp0')})
+ note_id = self.create(cr, uid, {'body': "ces détails envoyés par le client sur le FAX pour la qualité"})
+ self.action_add(cr, uid, [note_id], context=context)
+-
+ Finally, I won this opportunity, so I close this opportunity.
+-
+ !python {model: crm.lead}: |
+ self.case_mark_won(cr, uid, [ref("crm_case_qrecorp0")])
+-
+ I check details of the opportunity After won the opportunity.
+-
+ !python {model: crm.lead}: |
+ lead = self.browse(cr, uid, ref('crm_case_qrecorp0'))
+ assert lead.state == 'done', 'Opportunity is not in done state!'
+ assert lead.stage_id.name == 'Won', ' Stage of Opportunity is not win!'
+ assert lead.probability == 100.0, 'probability revenue should not be 100.0!'
+-
+ I convert mass lead into opportunity customer.
+-
+ !python {model: crm.lead2opportunity.partner.mass}: |
+ context.update({'active_model': 'crm.lead', 'active_ids': [ref("crm_case_employee0"), ref("crm_case_electonicgoodsdealer0")], 'active_id': ref("crm_case_qrecorp0")})
+ id = self.create(cr, uid, {'user_ids': [ref('base.user_root')], 'section_id': ref('crm.section_sales_department')}, context=context)
+ self.mass_convert(cr, uid, [id], context=context)
+-
+ Now I check First lead converted on opportunity.
+-
+ !python {model: crm.lead}: |
+ opp = self.browse(cr, uid, ref('crm_case_employee0'))
+ assert opp.name == "Need Info about Onsite Intervention", "Opportunity name not correct"
+ assert opp.type == 'opportunity', 'Lead is not converted to opportunity!'
+ assert opp.partner_id.name == "Agrolait", 'Partner missmatch!'
+ assert opp.stage_id.id == ref("stage_lead1"), 'Stage of probability is incorrect!'
+-
+ Then check for Second lead converted on opportunity.
+-
+ !python {model: crm.lead}: |
+ opp = self.browse(cr, uid, ref('crm_case_electonicgoodsdealer0'))
+ assert opp.name == "Interest in Your New Product", "Opportunity name not correct"
+ assert opp.type == 'opportunity', 'Lead is not converted to opportunity!'
+ assert opp.stage_id.id == ref("stage_lead1"), 'Stage of probability is incorrect!'
\ No newline at end of file
diff --git a/addons/crm/test/process/merge_opportunity.yml b/addons/crm/test/process/merge_opportunity.yml
new file mode 100644
index 00000000000..463e330fc10
--- /dev/null
+++ b/addons/crm/test/process/merge_opportunity.yml
@@ -0,0 +1,51 @@
+-
+ I make direct opportunity for Customer.
+-
+ !python {model: crm.partner2opportunity}: |
+ context.update({'active_model': 'res.partner', 'active_ids': [ref("base.res_partner_9")]})
+ res_id = self.create(cr, uid, {'name': "enquête pour l'achat de services"}, context=context)
+ self.make_opportunity(cr, uid, [res_id], context=context)
+-
+ I make another opportunity from phonecall for same customer.
+-
+ !python {model: crm.phonecall2opportunity}: |
+ context.update({'active_model': 'crm.phonecall', 'active_ids': [ref("crm.crm_case_phone06")]})
+ res_id = self.create(cr, uid, {'name': "Quoi de prix de votre autre service?", 'partner_id': ref("base.res_partner_9")}, context=context)
+ self.make_opportunity(cr, uid, [res_id], context=context)
+-
+ Now I merge all opportunities of customer.
+-
+ !python {model: crm.lead}: |
+ opportunity_ids = self.search(cr, uid, [('partner_id','=', ref("base.res_partner_9"))])
+ self.merge_opportunity(cr, uid, opportunity_ids, context=context)
+-
+ I check for merged opportunities for customer.
+-
+ !python {model: crm.lead}: |
+ merge_id = self.search(cr, uid, [('partner_id','=', ref("base.res_partner_9"))])
+ assert merge_id, 'Fail to create Merge opportunity'
+ merge_data = self.browse(cr, uid, merge_id)[0]
+ assert merge_data.type == 'opportunity', 'Merged opportunity type not change!'
+ assert merge_data.partner_id.id == ref("base.res_partner_9"), 'Partner missmatch!'
+-
+ Now I schedule another phonecall to customer after merged.
+-
+ !python {model: crm.phonecall2phonecall}: |
+ context.update({'active_model': 'crm.phonecall', 'active_ids': [ref("crm.crm_case_phone06")]})
+ res_id = self.create(cr, uid, {'name': "vos chances sont fusionnés en un seul"}, context=context)
+ self.action_schedule(cr, uid, [res_id], context=context)
+-
+ I schedule Meeting on this phonecall.
+-
+ !python {model: crm.phonecall}: |
+ self.action_make_meeting(cr, uid, [ref("crm.crm_case_phone06")])
+-
+ I setting Phone call to Held (Done).
+-
+ !python {model: crm.phonecall}: |
+ self.case_close(cr, uid, [ref("crm.crm_case_phone06")])
+-
+ I check that the phone call is in 'Held' state.
+-
+ !assert {model: crm.phonecall, id: crm.crm_case_phone06, string: Phone call Helded}:
+ - state == "done"
diff --git a/addons/crm/test/process/segmentation.yml b/addons/crm/test/process/segmentation.yml
new file mode 100644
index 00000000000..74500049290
--- /dev/null
+++ b/addons/crm/test/process/segmentation.yml
@@ -0,0 +1,16 @@
+-
+ In order to test segmentation process which create specific partner categories criteria,
+-
+ I start the process.
+-
+ !python {model: crm.segmentation}: |
+ self.process_start(cr, uid, [ref("crm_segmentation0")],context)
+ #Todo: Need to check after segmentation started
+
+-
+ I create rule Segmentation line record for partner .
+-
+ !python {model: crm.segmentation.line}: |
+ id = self.create(cr, uid, {'name': "OpenERP partners",'expr_value': 25})
+ self.test(cr, uid, [id],partner_id=0)
+ #Todo: Need to test segmantation line record
\ No newline at end of file
diff --git a/addons/crm/test/test_crm_lead.yml b/addons/crm/test/test_crm_lead.yml
deleted file mode 100644
index d5d3c6b933b..00000000000
--- a/addons/crm/test/test_crm_lead.yml
+++ /dev/null
@@ -1,154 +0,0 @@
--
- In order to test the CRM in OpenERP, I will do a customer qualification
- process that starts with a fist contact with a customer (a lead), which will
- be converted to a business opportunity and a partner.
--
- I create a two new users "user_crm" and I assign the group "salesman".
--
- !record {model: res.users, id: res_users_usercrm0}:
- company_id: base.main_company
- context_lang: en_US
- context_section_id: crm.section_sales_department
- groups_id:
- - base.group_sale_salesman
- login: user_crm
- name: user_crm
- password: user_crm
-
-- |
- I start by creating a new lead "New Customer" and I provide an address to this
- new customer, as well as an email "info@mycustomer.com".
--
- !record {model: crm.lead, id: crm_lead_newcustomer0}:
- email_from: info@mycustomer.com
- name: New Customer
- partner_name: Capegemini
- partner_id: base.res_partner_9
- phone: (855) 924-4364
- mobile: (333) 715-1450
- section_id: crm.section_sales_department
- referred: False
-- |
- I check that the lead is in 'draft' state.
--
- !assert {model: crm.lead, id: crm_lead_newcustomer0, string: Lead in Draft}:
- - state == "draft"
--
- I open lead by click on "Open" button.
--
- !python {model: crm.lead}: |
- self.case_open(cr, uid, [ref("crm_lead_newcustomer0")])
- fields={
- 'day_open': 0.0,
- 'day_close': 0.0
- }
- self._compute_day(cr, uid, [ref("crm_lead_newcustomer0")], fields, context)
-- |
- I check that lead is now in 'open' state.
--
- !assert {model: crm.lead, id: crm_lead_newcustomer0, string: Lead in open state}:
- - state == "open"
--
- I search id for case object.
--
- !python {model: crm.case.categ}: |
- self._find_object_id(cr, uid, context)
-- |
- As the lead seems to be a real business opportunity, I will convert it to a
- partner
- and a business opportunity by clicking on the "Convert" button.
--
- !python {model: crm.lead}: |
- lead = self.browse(cr, uid, ref('crm_lead_newcustomer0'))
- action = self.convert_opportunity(cr, uid, [ref("crm_lead_newcustomer0")], {'active_ids': [ref("crm_lead_newcustomer0")]})
- assert action['res_model'] == 'crm.lead2opportunity.partner'
--
- |
- I select "create a new partner" option.
--
- !record {model: crm.lead2opportunity.partner, id: crm_lead2opportunity_partner_create_0}:
- action: 'create'
- name: 'convert'
--
- Then, Click on "Create Opportunity" button.
--
- !python {model: crm.lead2opportunity.partner}: |
- self.action_apply(cr, uid, [ref("crm_lead2opportunity_partner_create_0")], {'active_ids': [ref("crm_lead_newcustomer0")], 'active_id': ref("crm_lead_newcustomer0")})
--
- |
- I select "Link to an existing partner" option.
--
- !record {model: crm.lead2opportunity.partner, id: crm_lead2opportunity_partner_create_1}:
- action: 'exist'
--
- Then, Click on "Create Opportunity" button.
--
- !python {model: crm.lead2opportunity.partner}: |
- self.action_apply(cr, uid, [ref("crm_lead2opportunity_partner_create_1")], {'active_ids': [ref("crm_lead_newcustomer0")], 'active_id': ref("crm_lead_newcustomer0")})
--
- |
- I select "Do not link to a partner" option.
--
- !record {model: crm.lead2opportunity.partner, id: crm_lead2opportunity_partner_create_2}:
- action: 'nothing'
--
- Then, Click on "Create Opportunity" button.
--
- !python {model: crm.lead2opportunity.partner}: |
- self.action_apply(cr, uid, [ref("crm_lead2opportunity_partner_create_2")], {'active_ids': [ref("crm_lead_newcustomer0")], 'active_id': ref("crm_lead_newcustomer0")})
-- |
- In order to check the opportunity is created or not, I check type.
--
- !python {model: crm.lead}: |
- lead = self.browse(cr, uid, ref("crm_lead_newcustomer0"))
- assert lead.type == 'opportunity'
-
--
- I create mass report of lead to opprtunity partner.
--
- !record {model: crm.lead2opportunity.partner.mass, id: crm_lead2opportunity_partner_mass0}:
- user_ids:
- - base.user_root
- section_id: crm.section_sales_department
--
- Then, execute that mass wizard.
--
- !python {model: crm.lead2opportunity.partner.mass}: |
- self.mass_convert(cr, uid, [ref("crm_lead2opportunity_partner_mass0")],{'active_ids': [ref("crm_lead_newcustomer0")], 'active_id': ref("crm_lead_newcustomer0")})
--
- I close lead by click on "close" button.
--
- !python {model: crm.lead}: |
- self.case_close(cr, uid, [ref("crm_lead_newcustomer0")])
-- |
- I check that lead is now in 'done' state.
--
- !assert {model: crm.lead, id: crm_lead_newcustomer0, string: Lead in done state}:
- - state == "done"
--
- I cancel lead by click on "cancel" button.
--
- !python {model: crm.lead}: |
- self.case_cancel(cr, uid, [ref("crm_lead_newcustomer0")])
-- |
- I check that lead is now in 'cancel' state.
--
- !assert {model: crm.lead, id: crm_lead_newcustomer0, string: Lead in cancel state}:
- - state == "cancel"
-
-#-
-# |
-# yaml is also not working with smtp server and send new email.
-
-- |
- I configure with smtp server.
-- |
- And I communicate with lead through send New mail to Lead using its email address from the user who is logged in.
-- |
- I check that communication history generated when send email to lead.
-- |
- Then, I add a cc which receive copy of future communication between partner and users by mail.
-
-- |
- I Reply to last Email to lead with some document attached.and check that communication history generated or not.
-
diff --git a/addons/crm/test/test_crm_lead_case2.yml b/addons/crm/test/test_crm_lead_case2.yml
deleted file mode 100644
index 23a654d31a8..00000000000
--- a/addons/crm/test/test_crm_lead_case2.yml
+++ /dev/null
@@ -1,151 +0,0 @@
--
- In order to do complete test the CRM in OpenERP,
- I will create new full configured record and carry test on it.
-- |
- I Start by creating "Test Sales Team" with No Unlink.
- I create a crm.case.section record.
--
- !record {model: crm.case.section, id: crm_case_section_demosalesteam}:
- code: DEMO
- complete_name: Test Sales Team
- name: Test Sales Team
- allow_unlink: False
- member_ids:
- - base.user_admin
- stage_ids:
- - crm.stage_lead1
- - crm.stage_lead2
- - crm.stage_lead3
- - crm.stage_lead4
- - crm.stage_lead5
- - crm.stage_lead6
- working_hours: 0.0
- resource_calendar_id: resource.timesheet_group1
- parent_id: crm.section_sales_department
--
- I assign segmentation.
--
- !record {model: res.users, id: res_users_usercrm0}:
- context_section_id: crm_case_section_demosalesteam
-- |
- I create a new lead "Test Customer" and I provide an address to this
- demo customer and email "info@democustomer.com" and Also "Test Sales Team".
--
- !record {model: crm.lead, id: crm_lead_democustomer}:
- email_from: info@democustomer.com
- name: Test Customer
- partner_name: NotSoTinySARL
- phone: (+32).81.81.37.00
- mobile: (+32).81.81.37.00
- section_id: crm_case_section_demosalesteam
- referred: False
- type: lead
--
- I check that the lead is in 'draft' state.
--
- !assert {model: crm.lead, id: crm_lead_democustomer, string: Lead in Draft}:
- - state == "draft"
--
- I create categories.
--
- !record {model: crm.case.categ, id: crm_case_categ0}:
- name: crm_case_section_demosalesteam
- section_id: crm_case_section_demosalesteam
--
- I assigning contact detail to the Lead "Test Customer" without address.
--
- !python {model: crm.lead}: |
- self.onchange_partner_address_id(cr, uid, ref("crm_lead_democustomer"), None, email=False)
-
--
- I assigning contact detail to the Lead "Test Customer" with address.
--
- !python {model: crm.lead}: |
- self.onchange_partner_address_id(cr, uid, ref("crm_lead_democustomer"), ref("base.res_partner_address_notsotinysarl0"), email=False)
-
--
- I selecting email "Opt-out" option for the "Test Customer" Lead.
--
- !python {model: crm.lead}: |
- self.on_change_optout(cr, uid, ref("crm_lead_democustomer"), True)
-
--
- I change the Opt-out to Opt-in to show email receive preference.
--
- !python {model: crm.lead}: |
- self.on_change_optin(cr, uid, ref("crm_lead_democustomer"), True)
--
- I open lead by click on "Open" button.
--
- !python {model: crm.lead}: |
- self.case_open(cr, uid, [ref("crm_lead_democustomer")])
--
- I check that lead "Test Customer" is now in 'open' state.
--
- !assert {model: crm.lead, id: crm_lead_democustomer, string: Lead in open state}:
- - state == "open"
--
- I reset the lead "Test Customer".
--
- !python {model: crm.lead}: |
- self.case_reset(cr, uid, [ref("crm_lead_democustomer")])
--
- I again opening lead by click on "Open" button.
--
- !python {model: crm.lead}: |
- self.case_open(cr, uid, [ref("crm_lead_democustomer")])
--
- I setting stage "New" for the lead "Test Customer".
--
- !python {model: crm.lead}: |
- self.stage_next(cr, uid, [ref("crm_lead_democustomer")], context={'stage_type': 'lead'})
--
- I try to Unlink the Lead "Test Customer" demo Lead.
--
- !python {model: crm.lead}: |
- try:
- self.unlink(cr, uid, [ref("crm_lead_democustomer")])
- except:
- pass
--
- I setting Lead "Test Customer" to Pending State.
--
- !python {model: crm.lead}: |
- self.case_pending(cr, uid, [ref("crm_lead_democustomer")])
--
- I check that lead "Test Customer" is now in 'Pending' state.
--
- !assert {model: crm.lead, id: crm_lead_democustomer, string: Lead in Pending state}:
- - state == "pending"
--
- I Escalate the Lead "Test Customer" Parent "Sales Team".
--
- !python {model: crm.lead}: |
- self.case_escalate(cr, uid, [ref("crm_lead_democustomer")])
--
- I add Internal Note Saying Escalated Reason.
--
- !record {model: crm.add.note, id: crm_add_note_0}:
- body: Sales Lead Has Been Escalated Due to Some Technical reason to the parent 'Sales
- Team'
- state: unchanged
--
- I click a note button to attach the record.
--
- !python {model: crm.add.note}: |
- context['active_model'] = "crm.lead"
- context['active_ids'] = [ref("crm_lead_democustomer")]
- self.action_add(cr, uid, [ref("crm_add_note_0")], context=context)
-
--
- I Copying this lead "Test Customer" to New Lead.
--
- !python {model: crm.lead}: |
- self.copy(cr, uid, ref("crm_lead_democustomer"))
--
- I checking the Lead Copied or Not.
--
- !python {model: crm.lead}: |
- sid = self.search(cr, uid, [('name', '=', 'Test Customer'),('state', '=', 'draft')])
- if not sid:
- raise AssertionError("Lead is not copied Successfully")
diff --git a/addons/crm/test/test_crm_meeting.yml b/addons/crm/test/test_crm_meeting.yml
deleted file mode 100644
index 1aee11463dd..00000000000
--- a/addons/crm/test/test_crm_meeting.yml
+++ /dev/null
@@ -1,97 +0,0 @@
-- |
- I will test Meetings which may be customer meeting or phonecall meeting or
- internal Meeting.
-- |
- I start by creating a new Meeting.
--
- !record {model: crm.meeting, id: crm_meeting_regardingpresentation0}:
- categ_id: crm.categ_meet2
- date: !eval time.strftime('%Y-%m-%d 16:04:00')
- date_deadline: !eval "(datetime.now() + timedelta(1)).strftime('%Y-%m-%d 00:04:00')"
- duration: 8.0
- email_from: info@balmerinc.be
- location: Ahmedabad
- name: Regarding Presentation
- partner_address_id: base.res_partner_address_1
- partner_id: base.res_partner_9
- rrule_type: weekly
- section_id: crm.section_sales_department
-- |
- I check that the Meetings is in 'UnConfirmed' state.
--
- !assert {model: crm.meeting, id: crm_meeting_regardingpresentation0}:
- - state == "draft"
-- |
- I can set reminder on meeting if I put reminder "40 minutes before" .
-- |
- For that, I first create alarm.
--
- !record {model: res.alarm, id: res_alarm_minituesbefore0}:
- name: 40 minutes before
- trigger_duration: 40
- trigger_interval: minutes
- trigger_occurs: before
- trigger_related: start
-- |
- I will assign this reminder.
-
-- !python {model: crm.meeting}: |
- self.write(cr, uid, [ref('crm_meeting_regardingpresentation0')], {'alarm_id': ref("res_alarm_minituesbefore0")})
-- |
- In order to check recurrence on meetings I will set Recurrency to Custom
- and I set the fields so that the meeting will occur weekly on Monday and Friday 10 times.
--
- !python {model: crm.meeting}: |
- self.write(cr, uid, [ref("crm_meeting_regardingpresentation0")], {'fr': 1, 'mo': 1, 'th': 1, 'tu': 1, 'we':1, 'count':10, 'interval': 1, 'rrule_type': 'weekly', 'recurrency' : True})
-
-- |
- I can see from the calendar view that the meeting is scheduled on Monday and Friday
- for 10 times.
-
--
- !python {model: crm.meeting}: |
- self.fields_view_get(cr, uid, False, 'calendar', context)
-- |
- I will search for one of the recurrent event and count the number of meeting.
--
- !python {model: crm.meeting}: |
- import time
- from datetime import datetime, date, timedelta
- ids = self.search(cr, uid, [('date', '>=', time.strftime('%Y-%m-%d 00:00:00')), ('date', '<=', (datetime.now()+timedelta(31)).strftime('%Y-%m-%d 00:00:00')), ('name', '=', 'Regarding Presentation')], context={'virtual_id': True})
- assert len(ids) == 10
-
-- |
- If I want to edit meetings information for all occurrence I click on "Edit All" button.
--
- !python {model: crm.meeting}: |
- self.write(cr, uid, [ref('crm_meeting_regardingpresentation0')], {'edit_all':'True'},context)
-- |
- I can see that new meeting form is opened with same value.
- I change some data for meeting and save it.
- I can see from meeting's calendar view that all meeting occurrences are changed accordingly.
--
- !record {model: crm.meeting, id: crm.crm_meeting_regardingpresentation0}:
- alarm_id: base_calendar.alarm9
- rrule_type: weekly
-
-- |
- In order to invite people for this meetings, I click on "Invite People" button
- I can invite internal user.
--
- !record {model: base_calendar.invite.attendee, id: base_calendar_invite_attendee_0}:
- type: internal
- send_mail: False
- partner_id: base.res_partner_9
- user_ids:
- - base.user_demo
--
- I click on "Invite" button of "Invite attendee" wizard.
--
- !python {model: base_calendar.invite.attendee}: |
- self.do_invite(cr, uid, [ref('base_calendar_invite_attendee_0')], {'active_id': ref('crm_meeting_regardingpresentation0'), 'model' : 'crm.meeting', 'attendee_field':'attendee_ids'})
-
-- |
- After direct/indirect confirmation for meetings I can confirm meeting.
--
- !python {model: crm.meeting}: |
- self.case_open(cr, uid, [ref('crm_meeting_regardingpresentation0')])
diff --git a/addons/crm/test/test_crm_opportunity.yml b/addons/crm/test/test_crm_opportunity.yml
deleted file mode 100644
index 734a1cae46c..00000000000
--- a/addons/crm/test/test_crm_opportunity.yml
+++ /dev/null
@@ -1,113 +0,0 @@
-- |
- I start by creating a new Opportunity. And I select partner for opportunity.
- I can see that after selecting partner his contact and email is automatically filled.
--
- !record {model: crm.lead, id: crm_opportunity_abcfuelcounits0}:
- email_from: info@balmerinc.be
- name: 'ABC FUEL CO 829264 - 10002 units'
- partner_address_id: base.res_partner_address_1
- partner_id: base.res_partner_9
- probability: 1.0
- stage_id: crm.stage_lead1
- categ_id: crm.categ_oppor2
- section_id: crm.section_sales_department
-- |
- I check that the opportunity is in 'New' state.
--
- !assert {model: crm.lead, id: crm_opportunity_abcfuelcounits0}:
- - state == "draft"
-
-- |
- I check that phonecall record is created for that opportunity.
--
- !python {model: crm.phonecall}: |
- phone_obj = self.pool.get('crm.phonecall')
-- |
- I schedule Meeting on this current opportunity by clicking on "schedule
- Meeting".
--
- !python {model: crm.lead}: |
- self.action_makeMeeting(cr, uid, [ref("crm_opportunity_abcfuelcounits0")])
-
-- |
- I can see that Meeting's calendar view is shown.
- then I click on the date on which I want to schedule meeting.
- I fill proper data for that meeting and save it.
--
- !record {model: crm.meeting, id: crm_meeting_abcfuelcounits0}:
- date: !eval time.strftime('%Y-%m-%d 00:00:00')
- date_deadline: !eval time.strftime('%Y-%m-%d 08:00:00')
- duration: 8.0
- email_from: info@balmerinc.be
- name: 'ABC FUEL CO 829264 - 10002 units'
- opportunity_id: 'crm_opportunity_abcfuelcounits0'
- partner_address_id: base.res_partner_address_1
- partner_id: base.res_partner_9
- section_id: crm.section_sales_department
- state: open
-- |
- In order to schedule a phonecall to the partner
- I click on "schedule call" button and select planned date for the call.
--
- !record {model: crm.opportunity2phonecall, id: crm_opportunity2phonecall_abcfuelcounits0}:
- date: !eval "(datetime.now() + timedelta(1)).strftime('%Y-%m-%d 11:15:00')"
- name: 'ABC FUEL CO 829264 - 10002 units'
- section_id: crm.section_sales_department
- user_id: base.user_demo
- categ_id: crm.categ_phone1
-- |
- schedule phonecall by opportunity2phoncall wizard.
--
- !python {model: crm.opportunity2phonecall}: |
- self.action_apply(cr, uid, [ref('crm_opportunity2phonecall_abcfuelcounits0')], {'active_ids': [ref("crm_opportunity_abcfuelcounits0")]})
-- |
- I check that phonecall record is created for that opportunity.
--
- !python {model: crm.phonecall}: |
- phone_obj = self.pool.get('crm.phonecall')
- ids = phone_obj.search(cr, uid, [('name', '=', 'ABC FUEL CO 829264 - 10002 units')])
- assert len(ids)
-- |
- I can see phonecall record after click on "Schedule call" wizard.
--
- !record {model: crm.phonecall, id: crm_phonecall_abcfuelcounits0}:
- date: !eval "(datetime.now() + timedelta(1)).strftime('%Y-%m-%d 11:15:00')"
- duration: 3.0
- name: 'ABC FUEL CO 829264 - 10002 units'
- partner_address_id: base.res_partner_address_1
- partner_id: base.res_partner_9
- section_id: crm.section_sales_department
-- |
- I Merge the opportunities.
--
- for that create two opportunities first opportunity 'Test FUEL CO'.
--
- !record {model: crm.lead, id: crm_opportunity_1}:
- email_from: info@balmerinc.be
- name: 'Test FUEL CO 829264 - 10002 units'
- partner_address_id: base.res_partner_address_1
- partner_id: base.res_partner_9
- probability: 1.0
- stage_id: crm.stage_lead1
- categ_id: crm.categ_oppor2
- section_id: crm.section_sales_department
--
- I create the opportunity 'FUEL CO'.
--
- !record {model: crm.lead, id: crm_opportunity_2}:
- email_from: info@balmerinc.be
- name: 'FUEL CO 829264 - 10002 units'
- partner_address_id: base.res_partner_address_1
- partner_id: base.res_partner_9
- probability: 1.0
- stage_id: crm.stage_lead1
- categ_id: crm.categ_oppor2
- section_id: crm.section_sales_department
-- |
- I Merge two Opportunities.
--
- !python {model: crm.merge.opportunity}: |
- op_list = [ref('crm_opportunity_1'),ref('crm_opportunity_2')]
- op_ids=self.pool.get('crm.lead').browse(cr,uid,op_list)
- lead_ids = [ref('crm_lead_newcustomer0')]
- self.merge(cr, uid, op_ids, {'lead_ids': lead_ids})
diff --git a/addons/crm/test/test_crm_opportunity_case2.yml b/addons/crm/test/test_crm_opportunity_case2.yml
deleted file mode 100644
index dc0dbe517f1..00000000000
--- a/addons/crm/test/test_crm_opportunity_case2.yml
+++ /dev/null
@@ -1,45 +0,0 @@
-- |
- I start by creating a new Opportunity. And I select partner for opportunity.
- I can see that after selecting partner his contact and email is automatically filled.
--
- !record {model: crm.lead, id: crm_opportunity_demotestopportunity}:
- email_from: info@balmerinc.be
- name: 'Demo Test Opportunity'
- partner_address_id: base.res_partner_address_1
- partner_id: base.res_partner_9
- probability: 1.0
- categ_id: crm.categ_oppor2
- section_id: crm.section_sales_department
- type: opportunity
--
- I check that the opportunity is in 'New' state.
--
- !assert {model: crm.lead, id: crm_opportunity_demotestopportunity, string: Opportunity in Draft}:
- - state == "draft"
--
- I open opportunity by click on "Open" button.
--
- !python {model: crm.lead}: |
- self.case_open(cr, uid, [ref("crm_opportunity_demotestopportunity")])
--
- I change partner of the opportunity.
--
- !python {model: crm.lead}: |
- self.onchange_partner_id(cr, uid, [ref("crm_opportunity_demotestopportunity")], ref("base.res_partner_agrolait"))
-
--
- I change Contact Detail of the opportunity.
--
- !python {model: crm.lead}: |
- self.onchange_partner_address_id(cr, uid,[ref("crm_opportunity_demotestopportunity")], ref("base.res_partner_address_8invoice"))
-
--
- I change Opportunity to Won State.
--
- !python {model: crm.lead}: |
- self.case_mark_won(cr, uid, [ref("crm_opportunity_demotestopportunity")])
--
- I check that the opportunity is in 'Done' state.
--
- !assert {model: crm.lead, id: crm_opportunity_demotestopportunity, string: Opportunity is Won}:
- - state == "done"
diff --git a/addons/crm/test/test_crm_partner2opportunity.yml b/addons/crm/test/test_crm_partner2opportunity.yml
deleted file mode 100644
index fe026074f4f..00000000000
--- a/addons/crm/test/test_crm_partner2opportunity.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-- |
- I start by creating a new opportunity from partner.
--
- !record {model: crm.partner2opportunity, id: crm_partner2opportunity_id_0}:
- name: test
- planned_revenue: 0.0
- partner_id: base.res_partner_9
- probability: 0.0
--
- I click on "Create Opportunity" button of this wizard.
--
- !python {model: crm.partner2opportunity}: |
- fields = {
- 'name': 'test',
- 'planned_revenue': '0.0',
- 'partner_id': ref('base.res_partner_9'),
- 'probability': '0.0'
- }
- self.default_get(cr, uid, fields, {"active_ids": [ref("crm_partner2opportunity_id_0")]})
-- |
- In order to check the opportunity is created or not, I check type.
--
- !python {model: crm.partner2opportunity}: |
- opportunity = self.make_opportunity(cr, uid, [ref("crm_partner2opportunity_id_0")], {"active_ids": [ref("crm_partner2opportunity_id_0")]})
- assert True
diff --git a/addons/crm/test/test_crm_phonecall.yml b/addons/crm/test/test_crm_phonecall.yml
deleted file mode 100644
index 0754a5b9544..00000000000
--- a/addons/crm/test/test_crm_phonecall.yml
+++ /dev/null
@@ -1,116 +0,0 @@
-- |
- I start by creating a new phonecall.
--
- !record {model: crm.phonecall, id: crm_phonecall_interviewcall0}:
- date: !eval time.strftime('%Y-%m-%d 08:00:00')
- name: Interview call
- duration: 2.0
- section_id: crm.section_sales_department
--
- I select partner by click on "Create a Partner" button.
--
- !record {model: crm.phonecall2partner, id: crm_phonecall2partner_1}:
- action: exist
- partner_id: base.res_partner_9
-
--
- I click on "Continue" button of this wizard and make partner.
--
- !python {model: crm.phonecall2partner}: |
-
- self._select_partner(cr, uid,{"active_ids": [ref("crm_phonecall_interviewcall0")]})
- self.open_create_partner(cr, uid, [ref("crm_phonecall2partner_1")], {"active_ids": [ref("crm_phonecall_interviewcall0")]})
- self.make_partner(cr, uid, [ref("crm_phonecall2partner_1")], {"active_ids": [ref("crm_phonecall_interviewcall0")]})
-
-- |
- As the success of phonecall seems to be a real business opportunity, I will convert
- it to opportunity by clicking on the "Convert to Opportunity" button.
--
- !record {model: crm.phonecall2opportunity, id: crm_phonecall2opportunity_interviewcall0}:
- name: Interview call
- partner_id: base.res_partner_9
- planned_revenue: 0.0
- probability: 0.0
-- |
- I can see that a business opportunity is now assigned to this phonecall
--
- !assert {model: crm.phonecall, id: crm_phonecall_interviewcall0}:
- - opportunity_id != False
--
- I click on "Convert" button of this wizard.
--
- !python {model: crm.phonecall2opportunity}: |
- self.action_apply(cr, uid, [ref("crm_phonecall2opportunity_interviewcall0")], {"active_id": ref("crm_phonecall_interviewcall0")})
-- |
- And I check that the phonecall and the newly created business opportunity is linked
- to same partner.
--
- !python {model: crm.phonecall}: |
- obj_phonecall = self.browse(cr, uid, ref('crm_phonecall_interviewcall0'))
- ids = self.pool.get('crm.lead').search(cr, uid, [('name', '=', obj_phonecall.opportunity_id.name)])
- obj_opp = self.pool.get('crm.lead').browse(cr, uid, ids)[0]
- assert obj_phonecall.partner_id == obj_opp.partner_id
-- |
- I schedule Meeting on this current phonecall by clicking on "schedule
- Meeting".
--
- !python {model: crm.phonecall}: |
- self.action_make_meeting(cr, uid, [ref('crm_phonecall_interviewcall0')])
-
-- |
- I can see that Meeting's calendar view is shown.
- then I click on the date on which I want schedule meeting.
- I fill proper data for that meeting and save it.
--
- !record {model: crm.meeting, id: crm_meeting_interviewcall0}:
- alarm_id: base_calendar.alarm3
- date: !eval "'%s-%s-%s 09:00:00' %(datetime.now().year,datetime.now().month,datetime.now().day)"
- date_deadline: !eval "'%s-%s-%s 17:00:00' %(datetime.now().year,datetime.now().month,datetime.now().day)"
- duration: 8.0
- email_from: info@balmerinc.be
- name: Interview call
- partner_address_id: base.res_partner_address_1
- partner_id: base.res_partner_9
- phonecall_id: 'crm_phonecall_interviewcall0'
- state: open
-
-- |
- In order to schedule other phonecall to the partner
- I click on "schedule other call" button. and plan for other call
- I can see that it will open other phonecall view with some data same as current
- phonecall.
--
- !record {model: crm.phonecall2phonecall, id: crm_phonecall2phonecall_interviewcall0}:
- date: !eval "'%s-%s-%s 19:49:00' %(datetime.now().year,datetime.now().month,datetime.now().day)"
- name: Interview call
- section_id: crm.section_sales_department
- user_id: base.user_root
- action: schedule
- categ_id: crm.categ_phone1
--
- I click on "schedule other call" button. and plan for other call.
--
- !record {model: crm.phonecall2phonecall, id: crm_phonecall2phonecall_interviewcall1}:
- date: !eval "'%s-%s-%s 19:49:00' %(datetime.now().year,datetime.now().month,datetime.now().day)"
- name: Interview call
- section_id: crm.section_sales_department
- user_id: base.user_root
- action: log
- categ_id: crm.categ_phone1
-- |
- I click on "Schedule" button of this wizard.
--
- !python {model: crm.phonecall2phonecall}: |
- fields = {
- 'name': 'Interview call',
- 'section_id': ref('crm.section_sales_department'),
- 'user_id': ref('base.user_root'),
- 'categ_id': ref('crm.categ_phone1')
- }
- self.default_get(cr, uid, fields,{'active_id': ref('crm_phonecall_interviewcall0')})
- self.action_apply(cr, uid, [ref('crm_phonecall2phonecall_interviewcall0')], {'active_id': ref('crm_phonecall_interviewcall0')})
-- |
- I click on "Schedule" button of this wizard with log option.
--
- !python {model: crm.phonecall2phonecall}: |
- self.action_apply(cr, uid, [ref('crm_phonecall2phonecall_interviewcall1')], {'active_id': ref('crm_phonecall_interviewcall0')})
diff --git a/addons/crm/test/test_crm_phonecall_case2.yml b/addons/crm/test/test_crm_phonecall_case2.yml
deleted file mode 100644
index 1b07121183c..00000000000
--- a/addons/crm/test/test_crm_phonecall_case2.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-- |
- I start by creating a new phonecall.
--
- !record {model: crm.phonecall, id: crm_phonecall_dummycall}:
- date: !eval time.strftime('%Y-%m-%d 08:00:00')
- name: Dummy call
- duration: 0.0
- section_id: crm.section_sales_department
- partner_id: base.res_partner_agrolait
- state: open
--
- I change Contact Detail of the Partner.
--
- !python {model: crm.phonecall}: |
- self.onchange_partner_address_id(cr, uid,[ref("crm_phonecall_dummycall")], ref("base.res_partner_address_8invoice"))
-
--
- I setting Phone call to Held (Done).
--
- !python {model: crm.phonecall}: |
- self.case_close(cr, uid, [ref("crm_phonecall_dummycall")])
--
- I check that the hone call is in 'Held' state.
--
- !assert {model: crm.phonecall, id: crm_phonecall_dummycall, string: Phone call Helded}:
- - state == "done"
diff --git a/addons/crm/test/test_crm_recurrent_meeting.yml b/addons/crm/test/test_crm_recurrent_meeting.yml
deleted file mode 100644
index 297ca8d5e4e..00000000000
--- a/addons/crm/test/test_crm_recurrent_meeting.yml
+++ /dev/null
@@ -1,106 +0,0 @@
--
- In order to test recurrent meetings in OpenERP, I create meetings with different recurrency.
--
- I create a customer meeting record with daily recurrency.
--
- !record {model: crm.meeting, id: crm_meeting_pricelistdiscussion0}:
- categ_id: crm.categ_meet1
- count: 0.0
- date: '2011-01-05 00:00:00'
- date_deadline: '2011-01-05 01:00:00'
- day: 0.0
- duration: 1.0
- end_date: '2011-01-12'
- end_type: end_date
- name: Pricelist Discussion
- recurrency: true
- recurrent_uid: 0.0
- rrule: FREQ=DAILY;INTERVAL=1;UNTIL=20110112T235959Z
- rrule_type: daily
- sequence: 0.0
--
- I create another meeting record with weekly recurrency.
--
- !record {model: crm.meeting, id: crm_meeting_changesindesigning0}:
- categ_id: crm.categ_meet2
- count: 15
- date: '2011-01-22 11:05:05'
- date_deadline: '2011-01-22 16:05:05'
- day: 0.0
- duration: 5.0
- email_from: info@opensides.be
- end_type: count
- fr: true
- mo: true
- name: Changes in Designing
- partner_address_id: base.res_partner_address_1
- partner_id: base.res_partner_9
- recurrency: true
- recurrent_uid: 0.0
- rrule: FREQ=WEEKLY;BYDAY=FR,TU,TH,WE,MO;INTERVAL=1;COUNT=15
- rrule_type: weekly
- section_id: crm.section_sales_department
- sequence: 0.0
- th: true
- tu: true
- user_id: base.user_demo
- we: true
--
- I create a meeting record with monthly recurrency.
--
- !record {model: crm.meeting, id: crm_meeting_reviewneeds0}:
- categ_id: crm.categ_meet3
- count: 0.0
- date: '2011-01-20 10:02:02'
- date_deadline: '2011-01-20 16:02:02'
- day: 15
- duration: 6.0
- end_date: '2011-05-31'
- end_type: end_date
- name: Review needs
- partner_address_id: base.res_partner_address_15
- partner_id: base.res_partner_11
- recurrency: true
- recurrent_uid: 0.0
- rrule: FREQ=MONTHLY;INTERVAL=1;UNTIL=20110531T235959Z;BYMONTHDAY=15
- rrule_type: monthly
- section_id: crm.section_sales_department
- sequence: 0.0
- user_id: base.user_demo
--
- I create a record for daily scrum meeting.
--
- !record {model: crm.meeting, id: crm_meeting_scrummeeting0}:
- categ_id: crm.categ_meet2
- count: 0.0
- date: '2011-01-06 00:00:00'
- date_deadline: '2011-01-06 01:00:00'
- day: 0.0
- duration: 1.0
- name: Scrum meeting
- recurrency: true
- recurrent_uid: 0.0
- rrule: FREQ=DAILY;INTERVAL=1
- rrule_type: daily
- sequence: 0.0
--
- I create a meeting record for yearly recurrency.
--
- !record {model: crm.meeting, id: crm_meeting_updatethedata0}:
- categ_id: crm.categ_meet2
- count: 0.0
- date: '2011-01-18 13:12:49'
- date_deadline: '2011-01-19 02:30:49'
- day: 0.0
- duration: 13.300000000000001
- end_date: '2015-01-06'
- end_type: end_date
- name: Update the data
- partner_address_id: base.res_partner_address_7
- partner_id: base.res_partner_4
- recurrency: true
- recurrent_uid: 0.0
- rrule: FREQ=YEARLY;INTERVAL=1;UNTIL=20150106T235959Z
- rrule_type: yearly
- section_id: crm.section_sales_department
- sequence: 0.0
diff --git a/addons/crm/test/test_crm_segmentation.yml b/addons/crm/test/test_crm_segmentation.yml
deleted file mode 100644
index 5563f1ce52f..00000000000
--- a/addons/crm/test/test_crm_segmentation.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-- |
- I will test segmentation which create specific partner categories criteria.
--
- I create a new segmentation record.
--
- !record {model: crm.segmentation, id: crm_segmentation_id_0}:
- categ_id: base.res_partner_category_5
- exclusif: true
- name: segment
- som_interval: 0.0
- sales_purchase_active : True
--
- I start the process.
--
- !python {model: crm.segmentation}: |
- self.process_start(cr, uid, [ref("crm_segmentation_id_0")],context)
--
- I continue the segmentation process.
--
- !python {model: crm.segmentation}: |
- context.update({'start': True})
- self.process_continue(cr, uid, [ref("crm_segmentation_id_0")], context)
--
- I create the segmentation line.
--
- !record {model: crm.segmentation.line, id: crm_segmentation_line_id_0}:
- expr_name: sale
- expr_operator: '>'
- expr_value: 1000.0
- name: Rule1
- operator: or
- segmentation_id: crm_segmentation_id_0
-
--
- I check the Segmentation line record.
--
- !python {model: crm.segmentation.line}: |
- self.test(cr, uid, [ref("crm_segmentation_line_id_0")],partner_id=0)
diff --git a/addons/crm/test/test_crm_stage_changes.yml b/addons/crm/test/test_crm_stage_changes.yml
deleted file mode 100644
index 391a328bffe..00000000000
--- a/addons/crm/test/test_crm_stage_changes.yml
+++ /dev/null
@@ -1,96 +0,0 @@
--
- In order to test the changes on stage of a lead or an opportunity with OpenERP,
- I create some leads and test the stage changes.
--
- I want to change the probability to 0.0 when the opportunity is marked as lost.
- So I set its Change probability automatically true.
--
- !record {model: crm.case.stage, id: crm.stage_lead6}:
- name: Lost
- on_change: true
- probability: 0.0
- section_ids:
- - crm.section_sales_department
- sequence: 0
--
- I create a lead 'Test Lead1'.
--
- !record {model: crm.lead, id: crm_lead_openerppresentation0}:
- categ_id: crm.categ_oppor4
- day_close: 0.0
- day_open: 0.0
- name: Test Lead1
- planned_revenue: 0.0
- probability: 10.0
- section_id: crm.section_sales_department
--
- I open the lead.
--
- !python {model: crm.lead}: |
- self.case_open(cr, uid, [ref('crm_lead_openerppresentation0')])
--
- I assigning stage.
--
- !python {model: crm.lead}: |
- self.onchange_stage_id(cr, uid, [ref('crm_lead_openerppresentation0')], [], context)
--
- I assigning percent.
--
- !python {model: crm.lead}: |
- self.stage_find_percent(cr, uid, 10.0, [])
--
- I find that this lead can be converted to opportunity.
--
- !record {model: crm.lead2opportunity.partner, id: crm_lead2opportunity_partner0}:
- action: 'create'
- name: 'convert'
--
- So I convert the lead to opportunity.
--
- !python {model: crm.lead2opportunity.partner}: |
- self.action_apply(cr, uid, [ref('crm_lead2opportunity_partner0')], context={'active_ids': [ref('crm_lead_openerppresentation0')]})
--
- I check that lead is now converted to opportunity.
--
- !python {model: crm.lead}: |
- lead = self.browse(cr, uid, ref('crm_lead_openerppresentation0'))
- assert lead.type == 'opportunity', 'Lead is not converted to opportunity!'
--
- I mark this opportunity as lost.
--
- !python {model: crm.lead}: |
- self.case_mark_lost(cr, uid, [ref('crm_lead_openerppresentation0')])
--
- I check whether the probability is set according to stage change or not.
--
- !python {model: crm.lead}: |
- opportunity = self.browse(cr, uid, ref('crm_lead_openerppresentation0'))
- assert opportunity.stage_id.id == ref('crm.stage_lead6'), 'Stage is not changed!'
- assert opportunity.probability == 0.0, 'Probability is wrong!'
--
- I create one more opportunity.
--
- !record {model: crm.lead, id: crm_lead_test2}:
- name: Partner Demo
- type: opportunity
- categ_id: crm.categ_oppor3
- planned_revenue: 50000.0
- probability: 100.0
- section_id: crm.section_sales_department
--
- I open this opportunity.
--
- !python {model: crm.lead}: |
- self.case_open(cr, uid, [ref('crm_lead_test2')])
--
- I mark this opportunity as won.
--
- !python {model: crm.lead}: |
- self.case_mark_won(cr, uid, [ref('crm_lead_test2')])
--
- I check whether the stage is changed to 'Won' and probability is 100.0 or not.
--
- !python {model: crm.lead}: |
- opportunity = self.browse(cr, uid, ref('crm_lead_test2'))
- assert opportunity.stage_id.id == ref('crm.stage_lead5'), 'Stage is not changed!'
- assert opportunity.probability == 100.0, 'Probability is wrong!'
diff --git a/addons/crm/test/ui/crm_demo.yml b/addons/crm/test/ui/crm_demo.yml
new file mode 100644
index 00000000000..5ef40838466
--- /dev/null
+++ b/addons/crm/test/ui/crm_demo.yml
@@ -0,0 +1,29 @@
+-
+ I create lead record to call of partner onchange, stage onchange and Mailing opt-in onchange method.
+-
+ !record {model: crm.lead, id: crm_case_shelvehouse}:
+ name: 'Need more info about your pc2'
+ partner_id: base.res_partner_theshelvehouse0
+ type: opportunity
+ stage_id: crm.stage_lead1
+ state: draft
+ optin: True
+-
+ I create lead record to call Mailing opt-out onchange method.
+-
+ !record {model: crm.lead, id: crm_case_mediapoleunits0}:
+ name: 'Need 20 Days of Consultancy'
+ type: opportunity
+ state: draft
+ optout: True
+-
+ I create phonecall record to call partner onchange method.
+-
+ !record {model: crm.phonecall, id: crm_case_phone05}:
+ name: 'Bad time'
+ partner_id: base.res_partner_5
+-
+ I setting next stage "New" for the lead.
+-
+ !python {model: crm.lead}: |
+ self.stage_next(cr, uid, [ref("crm_case_qrecorp0")], context={'stage_type': 'lead'})
diff --git a/addons/crm/test/ui/delete_lead.yml b/addons/crm/test/ui/delete_lead.yml
new file mode 100644
index 00000000000..472b22d0d2d
--- /dev/null
+++ b/addons/crm/test/ui/delete_lead.yml
@@ -0,0 +1,5 @@
+-
+ I Unlink the Lead.
+-
+ !python {model: crm.lead}: |
+ self.unlink(cr, uid, [ref("crm_case_qrecorp0")])
diff --git a/addons/crm/test/ui/duplicate_lead.yml b/addons/crm/test/ui/duplicate_lead.yml
new file mode 100644
index 00000000000..6b349ca350c
--- /dev/null
+++ b/addons/crm/test/ui/duplicate_lead.yml
@@ -0,0 +1,5 @@
+-
+ I make duplicate the Lead.
+-
+ !python {model: crm.lead}: |
+ self.copy(cr, uid, ref("crm_case_qrecorp0"))
diff --git a/addons/crm/wizard/__init__.py b/addons/crm/wizard/__init__.py
index 3ebdceda437..2fc39c51505 100644
--- a/addons/crm/wizard/__init__.py
+++ b/addons/crm/wizard/__init__.py
@@ -24,11 +24,11 @@ import crm_add_note
import crm_lead_to_partner
import crm_lead_to_opportunity
-import crm_opportunity_to_phonecall
import crm_phonecall_to_phonecall
+import crm_opportunity_to_phonecall
import crm_phonecall_to_partner
-import crm_phonecall_to_opportunity
import crm_partner_to_opportunity
+import crm_phonecall_to_opportunity
import crm_merge_opportunities
diff --git a/addons/crm/wizard/crm_add_note.py b/addons/crm/wizard/crm_add_note.py
index 478f051fe58..6bd84bda21d 100644
--- a/addons/crm/wizard/crm_add_note.py
+++ b/addons/crm/wizard/crm_add_note.py
@@ -49,3 +49,5 @@ class crm_add_note(osv.osv_memory):
return {'type': 'ir.actions.act_window_close'}
crm_add_note()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/wizard/crm_lead_to_opportunity.py b/addons/crm/wizard/crm_lead_to_opportunity.py
index 87ab9229d26..52a79e4514c 100644
--- a/addons/crm/wizard/crm_lead_to_opportunity.py
+++ b/addons/crm/wizard/crm_lead_to_opportunity.py
@@ -54,6 +54,8 @@ class crm_lead2opportunity_partner(osv.osv_memory):
email = False
for lead in lead_obj.browse(cr, uid, opportunities, context=context):
partner_id = lead.partner_id and lead.partner_id.id or False
+
+ #TOFIX: use mail.mail_message.to_mail
email = re.findall(r'([^ ,<@]+@[^> ,]+)', lead.email_from or '')
email = map(lambda x: "'" + x + "'", email)
@@ -93,139 +95,51 @@ class crm_lead2opportunity_partner(osv.osv_memory):
def view_init(self, cr, uid, fields, context=None):
"""
This function checks for precondition before wizard executes
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param fields: List of fields for default value
- @param context: A standard dictionary for contextual values
"""
if context is None:
context = {}
lead_obj = self.pool.get('crm.lead')
-
for lead in lead_obj.browse(cr, uid, context.get('active_ids', []), context=context):
if lead.state in ['done', 'cancel']:
raise osv.except_osv(_("Warning !"), _("Closed/Cancelled Leads can not be converted into Opportunity"))
return False
- def _convert(self, cr, uid, ids, lead, partner_id, stage_ids, context=None):
- leads = self.pool.get('crm.lead')
- address_id = False
- if partner_id:
- address_id = self.pool.get('res.partner.address').search(cr, uid,
- [('partner_id', '=', partner_id)],
- order='create_date desc',
- limit=1)
- vals = {
- 'planned_revenue': lead.planned_revenue,
- 'probability': lead.probability,
- 'name': lead.name,
- 'partner_id': partner_id,
- 'user_id': (lead.user_id and lead.user_id.id),
- 'type': 'opportunity',
- 'stage_id': stage_ids and stage_ids[0] or False,
- 'date_action': time.strftime('%Y-%m-%d %H:%M:%S'),
- }
- if partner_id and address_id:
- vals['partner_address_id'] = address_id[0]
- else:
- vals['partner_address_id'] = False
+ def _convert_opportunity(self, cr, uid, ids, vals, context=None):
+ if context is None:
+ context = {}
+ lead = self.pool.get('crm.lead')
+ partner_id = self._create_partner(cr, uid, ids, context=context)
+ lead_ids = vals.get('lead_ids', [])
+ user_ids = vals.get('user_ids', False)
+ team_id = vals.get('section_id', False)
+ return lead.convert_opportunity(cr, uid, lead_ids, partner_id, user_ids, team_id, context=context)
- lead.write(vals, context=context)
- text = _('Converted to opportunity')
- leads.message_append(cr, uid, [lead], text, body_text=text, context=context)
- if lead.partner_id:
- msg_ids = [ x.id for x in lead.message_ids]
- self.pool.get('mail.message').write(cr, uid, msg_ids, {
- 'partner_id': lead.partner_id.id
- }, context=context)
- leads.log(cr, uid, lead.id, _("Lead '%s' has been converted to an opportunity.") % lead.name)
-
- def send_mail_to_salesman(self, cr, uid, lead):
- email_to = lead.user_id and lead.user_id.user_email
- if not email_to:
- return False
- message_pool = self.pool.get('mail.message')
- email_from = lead.section_id and lead.section_id.user_id and lead.section_id.user_id.user_email or email_to
- partner = lead.partner_id and lead.partner_id.name or lead.partner_name
- subject = "lead %s converted into opportunity" % lead.name
- body = "Info \n Id : %s \n Subject: %s \n Partner: %s \n Description : %s " % (lead.id, lead.name, lead.partner_id.name, lead.description)
- return message_pool.schedule_with_attach(cr, uid, email_from, [email_to], subject, body)
+ def _merge_opportunity(self, cr, uid, ids, opportunity_ids, action='merge', context=None):
+ #TOFIX: is it usefully ?
+ if context is None:
+ context = {}
+ merge_opportunity = self.pool.get('crm.merge.opportunity')
+ res = False
+ #If we convert in mass, don't merge if there is no other opportunity but no warning
+ if action == 'merge' and (len(opportunity_ids) > 1 or not context.get('mass_convert') ):
+ self.write(cr, uid, ids, {'opportunity_ids' : [(6,0, [opportunity_ids[0].id])]}, context=context)
+ context.update({'lead_ids' : record_id, "convert" : True})
+ res = merge_opportunity.merge(cr, uid, data.opportunity_ids, context=context)
+ return res
def action_apply(self, cr, uid, ids, context=None):
"""
This converts lead to opportunity and opens Opportunity view
- @param ids: ids of the leads to convert to opportunities
-
- @return : View dictionary opening the Opportunity form view
"""
if not context:
context = {}
-
- record_id = context and context.get('active_ids') or False
- if not record_id:
- return {'type': 'ir.actions.act_window_close'}
-
- leads = self.pool.get('crm.lead')
- models_data = self.pool.get('ir.model.data')
-
- # Get Opportunity views
- result = models_data._get_id(
- cr, uid, 'crm', 'view_crm_case_opportunities_filter')
- opportunity_view_search = models_data.browse(
- cr, uid, result, context=context).res_id
- opportunity_view_form = models_data._get_id(
- cr, uid, 'crm', 'crm_case_form_view_oppor')
- opportunity_view_tree = models_data._get_id(
- cr, uid, 'crm', 'crm_case_tree_view_oppor')
- if opportunity_view_form:
- opportunity_view_form = models_data.browse(
- cr, uid, opportunity_view_form, context=context).res_id
- if opportunity_view_tree:
- opportunity_view_tree = models_data.browse(
- cr, uid, opportunity_view_tree, context=context).res_id
-
- for lead in leads.browse(cr, uid, record_id, context=context):
- if lead.section_id:
- stage_ids = self.pool.get('crm.case.stage').search(cr, uid, [('sequence','>=',1), ('section_ids','=', lead.section_id.id)])
- else:
- stage_ids = self.pool.get('crm.case.stage').search(cr, uid, [('sequence','>=',1)])
-
- data = self.browse(cr, uid, ids[0], context=context)
-
-
- if data.action == 'create':
- partner_ids = []
- partner_ids = self._create_partner(cr, uid, ids, context=context)
- partner_id = partner_ids and partner_ids[0]
- elif data.action == 'exist':
- partner_id = data.partner_id and data.partner_id.id
- else:
- partner_id = False
-
- self._convert(cr, uid, ids, lead, partner_id, stage_ids, context=context)
- self.send_mail_to_salesman(cr, uid, lead)
- #If we convert in mass, don't merge if there is no other opportunity but no warning
- if data.name == 'merge' and (len(data.opportunity_ids) > 1 or not context.get('mass_convert') ):
- merge_obj = self.pool.get('crm.merge.opportunity')
- self.write(cr, uid, ids, {'opportunity_ids' : [(6,0, [data.opportunity_ids[0].id])]}, context=context)
- context.update({'lead_ids' : record_id, "convert" : True})
- return merge_obj.merge(cr, uid, data.opportunity_ids, context=context)
-
- return {
- 'name': _('Opportunity'),
- 'view_type': 'form',
- 'view_mode': 'form,tree',
- 'res_model': 'crm.lead',
- 'domain': [('type', '=', 'opportunity')],
- 'res_id': int(lead.id),
- 'view_id': False,
- 'views': [(opportunity_view_form, 'form'),
- (opportunity_view_tree, 'tree'),
- (False, 'calendar'), (False, 'graph')],
- 'type': 'ir.actions.act_window',
- 'search_view_id': opportunity_view_search
- }
+
+ lead = self.pool.get('crm.lead')
+ lead_ids = context.get('active_ids', [])
+ data = self.browse(cr, uid, ids, context=context)[0]
+ self._convert_opportunity(cr, uid, ids, {'lead_ids': lead_ids}, context=context)
+ self._merge_opportunity(cr, uid, ids, data.opportunity_ids, data.action, context=context)
+ return lead.redirect_opportunity_view(cr, uid, lead_ids[0], context=context)
crm_lead2opportunity_partner()
@@ -240,55 +154,19 @@ class crm_lead2opportunity_mass_convert(osv.osv_memory):
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
}
+ def _convert_opportunity(self, cr, uid, ids, vals, context=None):
+ data = self.browse(cr, uid, ids, context=context)[0]
+ salesteam_id = data.section_id and data.section_id.id or False
+ salesman = []
+ if data.user_ids:
+ salesman = [x.id for x in data.user_ids]
+ vals.update({'user_ids': salesman, 'section_id': salesteam_id})
+ return super(crm_lead2opportunity_mass_convert, self)._convert_opportunity(cr, uid, ids, vals, context=context)
def mass_convert(self, cr, uid, ids, context=None):
- lead_obj = self.pool.get('crm.lead')
- if not context:
- context = {}
-
- active_ids = context.get('active_ids')
- data = self.browse(cr, uid, ids, context=context)[0]
-
- salesteam = data.section_id and data.section_id.id
- if data.user_ids:
- salesmans = map(lambda x : x.id, data.user_ids)
- index = 0
- else:
- salesmans = False
-
- for lead_id in active_ids:
- value = {}
- if salesteam:
- value['section_id'] = salesteam
- if salesmans:
- value['user_id'] = salesmans[index]
- index += 1
- index = index < len(salesmans) and index or 0
- if value:
- lead_obj.write(cr, uid, [lead_id], value, context=context)
-
- context['active_ids'] = [lead_id]
- value = self.default_get(cr, uid, ['partner_id', 'opportunity_ids'], context=context)
- value['opportunity_ids'] = [(6, 0, value['opportunity_ids'])]
- self.write(cr, uid, ids, value, context=context)
-
- self.action_apply(cr, uid, ids, context=context)
-
-
-
- models_data = self.pool.get('ir.model.data')
- result = models_data._get_id(cr, uid, 'crm', 'view_crm_case_opportunities_filter')
- opportunity_view_search = models_data.browse(cr, uid, result, context=context).res_id
-
- return {
- 'name': _('Opportunity'),
- 'view_type': 'form',
- 'view_mode': 'tree,form',
- 'res_model': 'crm.lead',
- 'domain': [('type', '=', 'opportunity'), ('id', 'in', active_ids)],
- 'type': 'ir.actions.act_window',
- 'search_view_id': opportunity_view_search,
- }
-
+ value = self.default_get(cr, uid, ['partner_id', 'opportunity_ids'], context=context)
+ value['opportunity_ids'] = [(6, 0, value['opportunity_ids'])]
+ self.write(cr, uid, ids, value, context=context)
+ return self.action_apply(cr, uid, ids, context=context)
crm_lead2opportunity_mass_convert()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/wizard/crm_lead_to_opportunity_view.xml b/addons/crm/wizard/crm_lead_to_opportunity_view.xml
index 833c04c3575..5f8453768c0 100644
--- a/addons/crm/wizard/crm_lead_to_opportunity_view.xml
+++ b/addons/crm/wizard/crm_lead_to_opportunity_view.xml
@@ -65,6 +65,15 @@
+
+
+ Create a Partner
+ ir.actions.act_window
+ crm.lead2opportunity.partner
+ form
+
+ new
+
,]+)', lead.email_from or '')
- email = map(lambda x: "'" + x + "'", email)
- if email:
- cr.execute("""select partner_id from res_partner_address
- where
- substring(email from '([^ ,<@]+@[^> ,]+)') in (%s)""" % (','.join(email)))
- partner_ids = map(lambda x: x[0], cr.fetchall())
-
- # Find partner name that matches the name of the lead
- if not partner_ids and lead.partner_name:
- partner_ids = partner_obj.search(cr, uid, [('name', '=ilike', lead.partner_name)], context=context)
-
- partner_id = partner_ids and partner_ids[0] or False
- if 'partner_id' in fields:
- res.update({'partner_id': partner_id})
- if 'action' in fields:
- res.update({'action': partner_id and 'exist' or 'create'})
- if 'opportunity_ids' in fields:
- res.update({'opportunity_ids': data})
-
+ if 'partner_id' in fields:
+ res.update({'partner_id': partner_id})
+ if 'action' in fields:
+ res.update({'action': partner_id and 'exist' or 'create'})
+
return res
def open_create_partner(self, cr, uid, ids, context=None):
"""
This function Opens form of create partner.
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Lead to Partner's IDs
- @param context: A standard dictionary for contextual values
-
- @return : Dictionary value for next form.
"""
- if context is None:
- context = {}
-
view_obj = self.pool.get('ir.ui.view')
- view_id = view_obj.search(cr, uid, [('model', '=', 'crm.lead2partner'), \
- ('name', '=', 'crm.lead2partner.view')])
+ view_id = view_obj.search(cr, uid, [('model', '=', self._name), \
+ ('name', '=', self._name+'.view')])
return {
'view_mode': 'form',
'view_type': 'form',
'view_id': view_id or False,
- 'res_model': 'crm.lead2partner',
+ 'res_model': self._name,
'context': context,
'type': 'ir.actions.act_window',
'target': 'new',
- }
-
+ }
def _create_partner(self, cr, uid, ids, context=None):
"""
This function Creates partner based on action.
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Lead to Partner's IDs
- @param context: A standard dictionary for contextual values
-
- @return : Dictionary {}.
"""
if context is None:
context = {}
-
- lead_obj = self.pool.get('crm.lead')
- partner_obj = self.pool.get('res.partner')
- contact_obj = self.pool.get('res.partner.address')
- partner_ids = []
- partner_id = False
- rec_ids = context and context.get('active_ids', [])
-
- for data in self.browse(cr, uid, ids, context=context):
- for lead in lead_obj.browse(cr, uid, rec_ids, context=context):
- if data.action == 'create':
- partner_id = partner_obj.create(cr, uid, {
- 'name': lead.partner_name or lead.contact_name or lead.name,
- 'user_id': lead.user_id.id,
- 'comment': lead.description,
- 'address': []
- })
- contact_obj.create(cr, uid, {
- 'partner_id': partner_id,
- 'name': lead.contact_name,
- 'phone': lead.phone,
- 'mobile': lead.mobile,
- 'email': lead.email_from,
- 'fax': lead.fax,
- 'title': lead.title and lead.title.id or False,
- 'function': lead.function,
- 'street': lead.street,
- 'street2': lead.street2,
- 'zip': lead.zip,
- 'city': lead.city,
- 'country_id': lead.country_id and lead.country_id.id or False,
- 'state_id': lead.state_id and lead.state_id.id or False,
- })
-
- else:
- if data.partner_id:
- partner_id = data.partner_id.id
- self.assign_partner(cr, uid, lead.id, partner_id)
- partner_ids.append(partner_id)
- return partner_ids
-
-
- def assign_partner(self, cr, uid, lead_id, partner_id):
- self.pool.get("crm.lead").write(cr, uid, [lead_id], {'partner_id' : partner_id})
-
+ lead = self.pool.get('crm.lead')
+ lead_ids = context and context.get('active_ids') or []
+ data = self.browse(cr, uid, ids, context=context)[0]
+ partner_id = data.partner_id and data.partner_id.id or False
+ partner_ids = lead.convert_partner(cr, uid, lead_ids, data.action, partner_id, context=context)
+ return partner_ids[lead_ids[0]]
def make_partner(self, cr, uid, ids, context=None):
"""
This function Makes partner based on action.
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Lead to Partner's IDs
- @param context: A standard dictionary for contextual values
-
- @return : Dictionary value for created Partner form.
"""
- if context is None:
- context = {}
-
- partner_ids = self._create_partner(cr, uid, ids, context=context)
- return {'type': 'ir.actions.act_window_close'}
+ partner_id = self._create_partner(cr, uid, ids, context=context)
+ return self.pool.get('res.partner').redirect_partner_form(cr, uid, partner_id, context=context)
crm_lead2partner()
diff --git a/addons/crm/wizard/crm_merge_opportunities.py b/addons/crm/wizard/crm_merge_opportunities.py
index f092d6ad0b6..381bb9871ea 100644
--- a/addons/crm/wizard/crm_merge_opportunities.py
+++ b/addons/crm/wizard/crm_merge_opportunities.py
@@ -26,195 +26,16 @@ class crm_merge_opportunity(osv.osv_memory):
_name = 'crm.merge.opportunity'
_description = 'Merge two Opportunities'
- def _get_first_not_null_id(self, attr, ops, oldest):
- if hasattr(oldest, attr) and getattr(oldest, attr):
- return getattr(oldest, attr).id
-
- for op in ops:
- if hasattr(op, attr) and getattr(op, attr):
- return getattr(op, attr).id
- return False
-
- def _get_first_not_null(self, attr, ops, oldest):
- if hasattr(oldest, attr) and getattr(oldest, attr):
- return getattr(oldest, attr)
-
- for op in ops:
- if hasattr(op, attr) and getattr(op, attr):
- return getattr(op, attr)
- return False
-
- def _concat_all(self, attr, ops):
- return ', '.join([getattr(op, attr) for op in ops if hasattr(op, attr) and getattr(op, attr)])
-
-
- def get_attachments(self, cr, uid, id, context=None):
- proxy = self.pool.get('ir.attachment')
- ids = proxy.search(cr, uid, [('res_model', '=', 'crm.lead'), ('res_id', '=', id)], context=context)
- return proxy.browse(cr, uid, ids, context=context)
-
- def find_oldest(self, cr, uid, op_ids, context=None):
- if not context:
- context = {}
- ids = [op_id.id for op_id in op_ids]
- if context.get('convert'):
- ids = list(set(ids) - set(context.get('lead_ids', False)) )
- lead_obj = self.pool.get('crm.lead')
- op_id = lead_obj.search(cr, uid, [('id', 'in', ids)], order='create_date' , context=context)
- if not op_id:
- return False
- opps = lead_obj.browse(cr, uid, [op_id[0]], context=context)
- return opps[0]
-
- def _update_data(self, op_ids, oldest_opp):
- data = {
- 'partner_id': self._get_first_not_null_id('partner_id', op_ids, oldest_opp), # !!
- 'title': self._get_first_not_null_id('title', op_ids, oldest_opp),
- 'name' : self._get_first_not_null('name', op_ids, oldest_opp), #not lost
- 'categ_id' : self._get_first_not_null_id('categ_id', op_ids, oldest_opp), # !!
- 'channel_id' : self._get_first_not_null_id('channel_id', op_ids, oldest_opp), # !!
- 'city' : self._get_first_not_null('city', op_ids, oldest_opp), # !!
- 'company_id' : self._get_first_not_null_id('company_id', op_ids, oldest_opp), #!!
- 'contact_name' : self._get_first_not_null('contact_name', op_ids, oldest_opp), #not lost
- 'country_id' : self._get_first_not_null_id('country_id', op_ids, oldest_opp), #!!
- 'partner_address_id' : self._get_first_not_null_id('partner_address_id', op_ids, oldest_opp), #!!
- 'type_id' : self._get_first_not_null_id('type_id', op_ids, oldest_opp), #!!
- 'user_id' : self._get_first_not_null_id('user_id', op_ids, oldest_opp), #!!
- 'section_id' : self._get_first_not_null_id('section_id', op_ids, oldest_opp), #!!
- 'state_id' : self._get_first_not_null_id('state_id', op_ids, oldest_opp),
- 'description' : self._concat_all('description', op_ids), #not lost
- 'email' : self._get_first_not_null('email', op_ids, oldest_opp), # !!
- 'fax' : self._get_first_not_null('fax', op_ids, oldest_opp),
- 'mobile' : self._get_first_not_null('mobile', op_ids, oldest_opp),
- 'partner_name' : self._get_first_not_null('partner_name', op_ids, oldest_opp),
- 'phone' : self._get_first_not_null('phone', op_ids, oldest_opp),
- 'probability' : self._get_first_not_null('probability', op_ids, oldest_opp),
- 'planned_revenue' : self._get_first_not_null('planned_revenue', op_ids, oldest_opp),
- 'street' : self._get_first_not_null('street', op_ids, oldest_opp),
- 'street2' : self._get_first_not_null('street2', op_ids, oldest_opp),
- 'zip' : self._get_first_not_null('zip', op_ids, oldest_opp),
- 'state' : 'open',
- 'create_date' : self._get_first_not_null('create_date', op_ids, oldest_opp),
- 'date_action_last': self._get_first_not_null('date_action_last', op_ids, oldest_opp),
- 'date_action_next': self._get_first_not_null('date_action_next', op_ids, oldest_opp),
- 'email_from' : self._get_first_not_null('email_from', op_ids, oldest_opp),
- 'email_cc' : self._get_first_not_null('email_cc', op_ids, oldest_opp),
- 'partner_name' : self._get_first_not_null('partner_name', op_ids, oldest_opp),
- }
- return data
-
- def merge(self, cr, uid, op_ids, context=None):
- """
- :param opp_ids: list of opportunities ids to merge
- """
- opp_obj = self.pool.get('crm.lead')
- message_obj = self.pool.get('mail.message')
-
- lead_ids = context and context.get('lead_ids', []) or []
-
- if len(op_ids) <= 1:
- raise osv.except_osv(_('Warning !'),_('Please select more than one opportunities.'))
-
- opportunities = opp_obj.browse(cr, uid, lead_ids, context=context)
- opportunities_list = list(set(op_ids) - set(opportunities))
- oldest_opp = self.find_oldest(cr, uid, op_ids, context=context)
- if opportunities :
- first_opportunity = opportunities[0]
- tail_opportunities = opportunities_list
- else:
- first_opportunity = opportunities_list[0]
- tail_opportunities = opportunities_list[1:]
- data = self._update_data(op_ids, oldest_opp)
-
- #copy message into the first opportunity + merge attachement
- count = 1
- first_attachments = self.get_attachments(cr, uid, first_opportunity, context=context)
- for opp in tail_opportunities:
- attachments = self.get_attachments(cr, uid, opp, context=context)
- for first in first_attachments:
- for attachment in attachments:
- if attachment.name == first.name:
- values = dict(
- name = "%s (%s)" % (attachment.name, count,),
- res_id = first_opportunity.id,
- )
- attachment.write(values)
- count+=1
-
- for history in opp.message_ids:
- message_obj.write(cr, uid, history.id, {'res_id': first_opportunity.id, 'subject' : _("From %s : %s") % (opp.name, history.subject) }, context=context)
-
- #Notification about loss of information
- details = []
- subject = ['Merged opportunities :']
- for opp in op_ids:
- subject.append(opp.name)
- details.append(_('Merged Opportunity: %s\n Partner: %s\n Stage: %s\n Section: %s\n Salesman: %s\n Category: %s\n Channel: %s\n Company: %s\n Contact name: %s\n Email: %s\n Phone number: %s\n Fax: %s\n Mobile: %s\n State: %s\n Description: %s\n Probability: %s\n Planned revennue: %s\n Country: %s\n City: %s\n Street: %s\n Street 2: %s\n Zip 2: %s') % ( opp.name, opp.partner_id.name or '',
- opp.stage_id.name or '',
- opp.section_id.name or '',
- opp.user_id.name or '',
- opp.categ_id.name or '',
- opp.channel_id.name or '',
- opp.company_id.name or '',
- opp.contact_name or '',
- opp.email_from or '',
- opp.phone or '',
- opp.fax or '',
- opp.mobile or '',
- opp.state_id.name or '',
- opp.description or '',
- opp.probability or '',
- opp.planned_revenue or '',
- opp.country_id.name or '',
- opp.city or '',
- opp.street or '',
- opp.street2 or '',
- opp.zip or '',
- ))
- subject = subject[0] + ", ".join(subject[1:])
- details = "\n\n".join(details)
-
- opp_obj.message_append(cr, uid, [first_opportunity], subject, body_text=details)
- #data.update({'message_ids' : [(6, 0 ,self._concat_o2m('message_ids', op_ids))]})
- opp_obj.write(cr, uid, [first_opportunity.id], data, context=context)
- unlink_ids = map(lambda x: x.id, tail_opportunities)
- opp_obj.unlink(cr, uid, unlink_ids, context=context)
-
- models_data = self.pool.get('ir.model.data')
-
- # Get Opportunity views
- opportunity_view_form = models_data._get_id(
- cr, uid, 'crm', 'crm_case_form_view_oppor')
- opportunity_view_tree = models_data._get_id(
- cr, uid, 'crm', 'crm_case_tree_view_oppor')
- if opportunity_view_form:
- opportunity_view_form = models_data.browse(
- cr, uid, opportunity_view_form, context=context).res_id
- if opportunity_view_tree:
- opportunity_view_tree = models_data.browse(
- cr, uid, opportunity_view_tree, context=context).res_id
-
- return {
- 'name': _('Opportunity'),
- 'view_type': 'form',
- 'view_mode': 'tree, form',
- 'res_model': 'crm.lead',
- 'domain': [('type', '=', 'opportunity')],
- 'res_id': int(first_opportunity.id),
- 'view_id': False,
- 'views': [(opportunity_view_form, 'form'),
- (opportunity_view_tree, 'tree'),
- (False, 'calendar'), (False, 'graph')],
- 'type': 'ir.actions.act_window',
- }
-
-
def action_merge(self, cr, uid, ids, context=None):
- obj_opportunity = self.browse(cr, uid, ids[0], context=context)
- op_ids = obj_opportunity.opportunity_ids
- self.write(cr, uid, ids, {'opportunity_ids' : [(6,0, [op_ids[0].id])]}, context=context)
- context['lead_ids'] = [op_ids[0].id]
- return self.merge(cr, uid, op_ids, context)
+ lead = self.pool.get('crm.lead')
+ record = self.browse(cr, uid, ids[0], context=context)
+ opportunities = record.opportunity_ids
+ #TOFIX: why need to check lead_ids here
+ lead_ids = [opportunities[0].id]
+ self.write(cr, uid, ids, {'opportunity_ids' : [(6,0, lead_ids)]}, context=context)
+ context['lead_ids'] = lead_ids
+ merge_id = lead.merge_opportunity(cr, uid, [x.id for x in opportunities], context=context)
+ return lead.redirect_opportunity_view(cr, uid, merge_id, context=context)
_columns = {
'opportunity_ids' : fields.many2many('crm.lead', 'merge_opportunity_rel', 'merge_id', 'opportunity_id', 'Opportunities', domain=[('type', '=', 'opportunity')]),
@@ -223,13 +44,6 @@ class crm_merge_opportunity(osv.osv_memory):
def default_get(self, cr, uid, fields, context=None):
"""
This function gets default values
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current users ID for security checks,
- @param fields: List of fields for default value
- @param context: A standard dictionary for contextual values
-
- @return : default values of fields.
"""
record_ids = context and context.get('active_ids', False) or False
res = super(crm_merge_opportunity, self).default_get(cr, uid, fields, context=context)
diff --git a/addons/crm/wizard/crm_opportunity_to_phonecall.py b/addons/crm/wizard/crm_opportunity_to_phonecall.py
index b0bfbf3b817..630f9a7e889 100644
--- a/addons/crm/wizard/crm_opportunity_to_phonecall.py
+++ b/addons/crm/wizard/crm_opportunity_to_phonecall.py
@@ -21,43 +21,16 @@
from osv import osv, fields
from tools.translate import _
-import pprint
-pp = pprint.PrettyPrinter(indent=4)
import time
class crm_opportunity2phonecall(osv.osv_memory):
"""Converts Opportunity to Phonecall"""
-
+ _inherit = 'crm.phonecall2phonecall'
_name = 'crm.opportunity2phonecall'
_description = 'Opportunity to Phonecall'
- _columns = {
- 'name' : fields.char('Call summary', size=64, required=True, select=1),
- 'user_id' : fields.many2one('res.users', "Assign To"),
- 'contact_name':fields.char('Contact', size=64),
- 'phone':fields.char('Phone', size=64),
- 'partner_id' : fields.many2one('res.partner', "Partner"),
- 'date': fields.datetime('Date'),
- 'section_id': fields.many2one('crm.case.section', 'Sales Team'),
- 'categ_id': fields.many2one('crm.case.categ', 'Category', \
- domain="['|',('section_id','=',False),('section_id','=',section_id),\
- ('object_id.model', '=', 'crm.phonecall')]"),
- 'action': fields.selection([('schedule','Schedule a call'), ('log','Log a call')], 'Action', required=True),
- 'note':fields.text('Note'),
- }
-
def default_get(self, cr, uid, fields, context=None):
- """
- This function gets default values
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param fields: List of fields for default value
- @param context: A standard dictionary for contextual values
-
- @return : default values of fields.
- """
opp_obj = self.pool.get('crm.lead')
categ_id = False
data_obj = self.pool.get('ir.model.data')
@@ -66,8 +39,8 @@ class crm_opportunity2phonecall(osv.osv_memory):
categ_id = data_obj.browse(cr, uid, res_id, context=context).res_id
record_ids = context and context.get('active_ids', []) or []
- res = super(crm_opportunity2phonecall, self).default_get(cr, uid, fields, context=context)
- res.update({'action': 'log', 'date': time.strftime('%Y-%m-%d %H:%M:%S')})
+ res = {}
+ res.update({'action': 'schedule', 'date': time.strftime('%Y-%m-%d %H:%M:%S')})
for opp in opp_obj.browse(cr, uid, record_ids, context=context):
if 'name' in fields:
res.update({'name': opp.name})
@@ -87,84 +60,20 @@ class crm_opportunity2phonecall(osv.osv_memory):
res.update({'phone': opp.phone or (opp.partner_address_id and opp.partner_address_id.phone or False)})
return res
- def action_cancel(self, cr, uid, ids, context=None):
- """
- Closes Opportunity to Phonecall form
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Opportunity to Phonecall's IDs
- @param context: A standard dictionary for contextual values
- """
- return {'type': 'ir.actions.act_window_close'}
-
- def action_apply(self, cr, uid, ids, context=None):
- """
- This converts Opportunity to Phonecall and opens Phonecall view
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user's ID for security checks,
- @param ids: List of Opportunity to Phonecall IDs
- @param context: A standard dictionary for contextual values
-
- @return : Dictionary value for created Opportunity form
- """
+ def action_schedule(self, cr, uid, ids, context=None):
value = {}
- record_ids = context and context.get('active_ids', []) or []
-
- phonecall_obj = self.pool.get('crm.phonecall')
- opp_obj = self.pool.get('crm.lead')
- mod_obj = self.pool.get('ir.model.data')
- result = mod_obj._get_id(cr, uid, 'crm', 'view_crm_case_phonecalls_filter')
- res = mod_obj.read(cr, uid, result, ['res_id'])
-
- data_obj = self.pool.get('ir.model.data')
-
- # Select the view
- id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_phone_tree_view')
- id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_phone_form_view')
- if id2:
- id2 = data_obj.browse(cr, uid, id2, context=context).res_id
- if id3:
- id3 = data_obj.browse(cr, uid, id3, context=context).res_id
-
- for this in self.browse(cr, uid, ids, context=context):
- for opp in opp_obj.browse(cr, uid, record_ids, context=context):
- vals = {
- 'name' : opp.name,
- 'case_id' : opp.id,
- 'user_id' : this.user_id and this.user_id.id or False,
- 'categ_id' : this.categ_id.id,
- 'description' : opp.description or False,
- 'date' : this.date,
- 'section_id' : this.section_id.id or False,
- 'partner_id': opp.partner_id and opp.partner_id.id or False,
- 'partner_address_id': opp.partner_address_id and opp.partner_address_id.id or False,
- 'partner_phone' : opp.phone or (opp.partner_address_id and opp.partner_address_id.phone or False),
- 'partner_mobile' : opp.partner_address_id and opp.partner_address_id.mobile or False,
- 'priority': opp.priority,
- 'opportunity_id': opp.id,
- 'date_open': time.strftime('%Y-%m-%d %H:%M:%S')
- }
-
- new_case = phonecall_obj.create(cr, uid, vals, context=context)
-
- if this.action == 'log':
- phonecall_obj.case_close(cr, uid, [new_case])
- return {'type': 'ir.actions.act_window_close'}
-
- value = {
- 'name': _('Phone Call'),
- 'domain': "[('user_id','=',%s),('opportunity_id','=',%s)]" % (uid,opp.id),
- 'view_type': 'form',
- 'view_mode': 'tree,form',
- 'res_model': 'crm.phonecall',
- 'res_id' : new_case,
- 'views': [(id3, 'form'), (id2, 'tree'), (False, 'calendar')],
- 'type': 'ir.actions.act_window',
- 'search_view_id': res['res_id'],
- }
- return value
+ if context is None:
+ context = {}
+ phonecall = self.pool.get('crm.phonecall')
+ opportunity_ids = context and context.get('active_ids') or []
+ opportunity = self.pool.get('crm.lead')
+ data = self.browse(cr, uid, ids, context=context)[0]
+ call_ids = opportunity.schedule_phonecall(cr, uid, opportunity_ids, data.date, data.name, \
+ data.note, data.phone, data.contact_name, data.user_id and data.user_id.id or False, \
+ data.section_id and data.section_id.id or False, \
+ data.categ_id and data.categ_id.id or False, \
+ action=data.action, context=context)
+ return phonecall.redirect_phonecall_view(cr, uid, call_ids[opportunity_ids[0]], context=context)
crm_opportunity2phonecall()
diff --git a/addons/crm/wizard/crm_opportunity_to_phonecall_view.xml b/addons/crm/wizard/crm_opportunity_to_phonecall_view.xml
index 980b93500d2..a12bd92115c 100644
--- a/addons/crm/wizard/crm_opportunity_to_phonecall_view.xml
+++ b/addons/crm/wizard/crm_opportunity_to_phonecall_view.xml
@@ -16,24 +16,19 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
+
+
diff --git a/addons/crm/wizard/crm_partner_to_opportunity.py b/addons/crm/wizard/crm_partner_to_opportunity.py
index 4d24bd5b78f..6322d0341c1 100644
--- a/addons/crm/wizard/crm_partner_to_opportunity.py
+++ b/addons/crm/wizard/crm_partner_to_opportunity.py
@@ -35,16 +35,15 @@ class crm_partner2opportunity(osv.osv_memory):
'partner_id': fields.many2one('res.partner', 'Partner'),
}
+ def action_cancel(self, cr, uid, ids, context=None):
+ """
+ Closes Partner 2 Opportunity
+ """
+ return {'type':'ir.actions.act_window_close'}
+
def default_get(self, cr, uid, fields, context=None):
"""
This function gets default values
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param fields: List of fields for default value
- @param context: A standard dictionary for contextual values
-
- @return : default values of fields.
"""
partner_obj = self.pool.get('res.partner')
data = context and context.get('active_ids', []) or []
@@ -58,56 +57,17 @@ class crm_partner2opportunity(osv.osv_memory):
return res
def make_opportunity(self, cr, uid, ids, context=None):
- """
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param context: A standard dictionary for contextual values
- """
-
- data = context and context.get('active_ids', []) or []
- make_opportunity = self.pool.get('crm.partner2opportunity')
- data_obj = self.pool.get('ir.model.data')
- part_obj = self.pool.get('res.partner')
- categ_obj = self.pool.get('crm.case.categ')
- case_obj = self.pool.get('crm.lead')
-
- for make_opportunity_obj in make_opportunity.browse(cr, uid, ids, context=context):
- result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_opportunities_filter')
- res = data_obj.read(cr, uid, result, ['res_id'])
-
- id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_form_view_oppor')
- id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_tree_view_oppor')
- if id2:
- id2 = data_obj.browse(cr, uid, id2, context=context).res_id
- if id3:
- id3 = data_obj.browse(cr, uid, id3, context=context).res_id
-
- address = part_obj.address_get(cr, uid, data)
- categ_ids = categ_obj.search(cr, uid, [('object_id.model','=','crm.lead')])
-
- opp_id = case_obj.create(cr, uid, {
- 'name' : make_opportunity_obj.name,
- 'planned_revenue' : make_opportunity_obj.planned_revenue,
- 'probability' : make_opportunity_obj.probability,
- 'partner_id' : make_opportunity_obj.partner_id.id,
- 'partner_address_id' : address['default'],
- 'categ_id' : categ_ids and categ_ids[0] or '',
- 'state' :'draft',
- 'type': 'opportunity'
- })
- value = {
- 'name' : _('Opportunity'),
- 'view_type' : 'form',
- 'view_mode' : 'form,tree',
- 'res_model' : 'crm.lead',
- 'res_id' : opp_id,
- 'view_id' : False,
- 'views' : [(id2, 'form'), (id3, 'tree'), (False, 'calendar'), (False, 'graph')],
- 'type' : 'ir.actions.act_window',
- 'search_view_id' : res['res_id']
- }
- return value
+ partner_ids = context and context.get('active_ids', []) or []
+ partner = self.pool.get('res.partner')
+ lead = self.pool.get('crm.lead')
+ data = self.browse(cr, uid, ids, context=context)[0]
+ opportunity_ids = partner.make_opportunity(cr, uid, partner_ids,
+ data.name,
+ data.planned_revenue,
+ data.probability,
+ )
+ opportunity_id = opportunity_ids[partner_ids[0]]
+ return lead.redirect_opportunity_view(cr, uid, opportunity_id, context=context)
crm_partner2opportunity()
diff --git a/addons/crm/wizard/crm_partner_to_opportunity_view.xml b/addons/crm/wizard/crm_partner_to_opportunity_view.xml
index 1111bbbbc50..f75f3d5b90e 100644
--- a/addons/crm/wizard/crm_partner_to_opportunity_view.xml
+++ b/addons/crm/wizard/crm_partner_to_opportunity_view.xml
@@ -16,7 +16,7 @@
-
+
diff --git a/addons/crm/wizard/crm_phonecall_to_opportunity.py b/addons/crm/wizard/crm_phonecall_to_opportunity.py
index 549afa0559b..7305cbd8b5f 100644
--- a/addons/crm/wizard/crm_phonecall_to_opportunity.py
+++ b/addons/crm/wizard/crm_phonecall_to_opportunity.py
@@ -26,97 +26,31 @@ class crm_phonecall2opportunity(osv.osv_memory):
""" Converts Phonecall to Opportunity"""
_name = 'crm.phonecall2opportunity'
+ _inherit = 'crm.partner2opportunity'
_description = 'Phonecall To Opportunity'
- def action_cancel(self, cr, uid, ids, context=None):
- """
- Closes Phonecall to Opportunity form
- """
-
- return {'type':'ir.actions.act_window_close'}
-
-
- def action_apply(self, cr, uid, ids, context=None):
+ def make_opportunity(self, cr, uid, ids, context=None):
"""
This converts Phonecall to Opportunity and opens Phonecall view
"""
- record_id = context and context.get('active_id', False) or False
- if record_id:
- opp_obj = self.pool.get('crm.lead')
- phonecall_obj = self.pool.get('crm.phonecall')
- case = phonecall_obj.browse(cr, uid, record_id, context=context)
- data_obj = self.pool.get('ir.model.data')
- result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_opportunities_filter')
- res = data_obj.read(cr, uid, result, ['res_id'])
- id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_form_view_oppor')
- id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_tree_view_oppor')
- if id2:
- id2 = data_obj.browse(cr, uid, id2, context=context).res_id
- if id3:
- id3 = data_obj.browse(cr, uid, id3, context=context).res_id
-
- for this in self.browse(cr, uid, ids, context=context):
- address = None
- if this.partner_id:
- address_id = self.pool.get('res.partner').address_get(cr, uid, [this.partner_id.id])
- if address_id['default']:
- address = self.pool.get('res.partner.address').browse(cr, uid, address_id['default'], context=context)
- new_opportunity_id = opp_obj.create(cr, uid, {
- 'name': this.name,
- 'planned_revenue': this.planned_revenue,
- 'probability': this.probability,
- 'partner_id': this.partner_id and this.partner_id.id or False,
- 'partner_address_id': address and address.id,
- 'phone': address and address.phone,
- 'mobile': address and address.mobile,
- 'section_id': case.section_id and case.section_id.id or False,
- 'description': case.description or False,
- 'phonecall_id': case.id,
- 'priority': case.priority,
- 'type': 'opportunity',
- 'phone': case.partner_phone or False,
- })
- vals = {
- 'partner_id': this.partner_id.id,
- 'opportunity_id' : new_opportunity_id,
- }
- phonecall_obj.write(cr, uid, [case.id], vals)
- phonecall_obj.case_close(cr, uid, [case.id])
- opp_obj.case_open(cr, uid, [new_opportunity_id])
-
- value = {
- 'name': _('Opportunity'),
- 'view_type': 'form',
- 'view_mode': 'form,tree',
- 'res_model': 'crm.lead',
- 'res_id': int(new_opportunity_id),
- 'view_id': False,
- 'views': [(id2, 'form'), (id3, 'tree'), (False, 'calendar'), (False, 'graph')],
- 'type': 'ir.actions.act_window',
- 'search_view_id': res['res_id']
- }
- return value
-
- _columns = {
- 'name' : fields.char('Opportunity Summary', size=64, required=True, select=1),
- 'probability': fields.float('Success Probability'),
- 'planned_revenue': fields.float('Expected Revenue'),
- 'partner_id': fields.many2one('res.partner', 'Partner'),
- }
+ if not len(ids):
+ return False
+ call_ids = context and context.get('active_ids', False) or False
+ this = self.browse(cr, uid, ids[0], context=context)
+ if not call_ids:
+ return {}
+ opportunity = self.pool.get('crm.lead')
+ phonecall = self.pool.get('crm.phonecall')
+ opportunity_ids = phonecall.convert_opportunity(cr, uid, call_ids, this.name, this.partner_id and this.partner_id.id or False, \
+ this.planned_revenue, this.probability, context=context)
+ return opportunity.redirect_opportunity_view(cr, uid, opportunity_ids[call_ids[0]], context=context)
def default_get(self, cr, uid, fields, context=None):
"""
This function gets default values
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param fields: List of fields for default value
- @param context: A standard dictionary for contextual values
-
- @return : default values of fields.
"""
record_id = context and context.get('active_id', False) or False
- res = super(crm_phonecall2opportunity, self).default_get(cr, uid, fields, context=context)
+ res = {}
if record_id:
phonecall = self.pool.get('crm.phonecall').browse(cr, uid, record_id, context=context)
@@ -127,3 +61,5 @@ class crm_phonecall2opportunity(osv.osv_memory):
return res
crm_phonecall2opportunity()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/wizard/crm_phonecall_to_opportunity_view.xml b/addons/crm/wizard/crm_phonecall_to_opportunity_view.xml
index ea024831b54..d3c59f89433 100644
--- a/addons/crm/wizard/crm_phonecall_to_opportunity_view.xml
+++ b/addons/crm/wizard/crm_phonecall_to_opportunity_view.xml
@@ -19,7 +19,7 @@
-
+
diff --git a/addons/crm/wizard/crm_phonecall_to_partner.py b/addons/crm/wizard/crm_phonecall_to_partner.py
index 38e673108e4..0fa077bbf42 100644
--- a/addons/crm/wizard/crm_phonecall_to_partner.py
+++ b/addons/crm/wizard/crm_phonecall_to_partner.py
@@ -26,42 +26,12 @@ class crm_phonecall2partner(osv.osv_memory):
""" Converts phonecall to partner """
_name = 'crm.phonecall2partner'
+ _inherit = 'crm.lead2partner'
_description = 'Phonecall to Partner'
-
- _columns = {
- 'action': fields.selection([('exist', 'Link to an existing partner'), \
- ('create', 'Create a new partner')], \
- 'Action', required=True),
- 'partner_id': fields.many2one('res.partner', 'Partner')
- }
-
- def view_init(self, cr, uid, fields, context=None):
- """
- This function checks for precondition before wizard executes
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param fields: List of fields for default value
- @param context: A standard dictionary for contextual values
-
- """
- phonecall_obj = self.pool.get('crm.phonecall')
- rec_ids = context and context.get('active_ids', [])
- for phonecall in phonecall_obj.browse(cr, uid, rec_ids, context=context):
- if phonecall.partner_id:
- raise osv.except_osv(_('Warning !'),
- _('A partner is already defined on this phonecall.'))
-
+
def _select_partner(self, cr, uid, context=None):
"""
This function Searches for Partner from selected phonecall.
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param fields: List of fields for default value
- @param context: A standard dictionary for contextual values
-
- @return : Partner id if any for selected phonecall.
"""
if context is None:
context = {}
@@ -75,7 +45,7 @@ class crm_phonecall2partner(osv.osv_memory):
for phonecall in phonecall_obj.browse(cr, uid, rec_ids, context=context):
partner_ids = partner_obj.search(cr, uid, [('name', '=', phonecall.name or phonecall.name)])
if not partner_ids and phonecall.email_from:
- address_ids = contact_obj.search(cr, uid, [('email', '=', phonecall.email_from)])
+ address_ids = contact_obj.search(cr, uid, ['|', ('phone', '=', phonecall.partner_phone), ('mobile','=',phonecall.partner_mobile)])
if address_ids:
addresses = contact_obj.browse(cr, uid, address_ids)
partner_ids = addresses and [addresses[0].partner_id.id] or False
@@ -83,117 +53,20 @@ class crm_phonecall2partner(osv.osv_memory):
partner_id = partner_ids and partner_ids[0] or False
return partner_id
- _defaults = {
- 'action': lambda *a:'exist',
- 'partner_id': _select_partner
- }
-
- def open_create_partner(self, cr, uid, ids, context=None):
- """
- This function Opens form of create partner.
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Phonecall to Partner's IDs
- @param context: A standard dictionary for contextual values
-
- @return : Dictionary value for next form.
- """
-
- view_obj = self.pool.get('ir.ui.view')
- view_id = view_obj.search(cr, uid, [('model', '=', 'crm.phonecall2partner'), \
- ('name', '=', 'crm.phonecall2partner.view')])
- return {
- 'view_mode': 'form',
- 'view_type': 'form',
- 'view_id': view_id or False,
- 'res_model': 'crm.phonecall2partner',
- 'context': context,
- 'type': 'ir.actions.act_window',
- 'target': 'new',
- }
-
def _create_partner(self, cr, uid, ids, context=None):
"""
This function Creates partner based on action.
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Phonecall to Partner's IDs
- @param context: A standard dictionary for contextual values
-
- @return : Dictionary {}.
"""
if context is None:
context = {}
+ phonecall = self.pool.get('crm.phonecall')
- phonecall_obj = self.pool.get('crm.phonecall')
- partner_obj = self.pool.get('res.partner')
- contact_obj = self.pool.get('res.partner.address')
- partner_ids = []
- contact_id = False
-
- rec_ids = context and context.get('active_ids', [])
-
- for data in self.browse(cr, uid, ids, context=context):
- for phonecall in phonecall_obj.browse(cr, uid, rec_ids, context=context):
- if data.action == 'create':
- partner_id = partner_obj.create(cr, uid, {
- 'name': phonecall.name or phonecall.name,
- 'user_id': phonecall.user_id.id,
- 'comment': phonecall.description,
- })
- contact_id = contact_obj.create(cr, uid, {
- 'partner_id': partner_id,
- 'name': phonecall.name,
- 'phone': phonecall.partner_phone,
- })
-
- else:
- if data.partner_id:
- partner_id = data.partner_id.id
- contact_id = partner_obj.address_get(cr, uid, [partner_id])['default']
-
- partner_ids.append(partner_id)
-
- vals = {}
- if partner_id:
- vals.update({'partner_id': partner_id})
- if contact_id:
- vals.update({'partner_address_id': contact_id})
- phonecall_obj.write(cr, uid, [phonecall.id], vals)
- return partner_ids
-
- def make_partner(self, cr, uid, ids, context=None):
- """
- This function Makes partner based on action.
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Phonecall to Partner's IDs
- @param context: A standard dictionary for contextual values
-
- @return : Dictionary value for created Partner form.
- """
-
- partner_ids = self._create_partner(cr, uid, ids, context=context)
- mod_obj = self.pool.get('ir.model.data')
- result = mod_obj._get_id(cr, uid, 'base', 'view_res_partner_filter')
- res = mod_obj.read(cr, uid, result, ['res_id'])
-
- value = {
- 'domain': "[]",
- 'view_type': 'form',
- 'view_mode': 'form,tree',
- 'res_model': 'res.partner',
- 'res_id': partner_ids and int(partner_ids[0]) or False,
- 'view_id': False,
- 'context': context,
- 'type': 'ir.actions.act_window',
- 'search_view_id': res['res_id']
- }
- return value
+ data = self.browse(cr, uid, ids, context=context)[0]
+ call_ids = context and context.get('active_ids') or []
+ partner_id = data.partner_id and data.partner_id.id or False
+ partner_ids = phonecall.convert_partner(cr, uid, call_ids, data.action, partner_id, context=context)
+ return partner_ids[call_ids[0]]
crm_phonecall2partner()
diff --git a/addons/crm/wizard/crm_phonecall_to_phonecall.py b/addons/crm/wizard/crm_phonecall_to_phonecall.py
index 2872acad4eb..d68591ab0b7 100644
--- a/addons/crm/wizard/crm_phonecall_to_phonecall.py
+++ b/addons/crm/wizard/crm_phonecall_to_phonecall.py
@@ -25,108 +25,50 @@ from tools.translate import _
import time
class crm_phonecall2phonecall(osv.osv_memory):
- """ Converts Phonecall to Phonecall"""
-
_name = 'crm.phonecall2phonecall'
_description = 'Phonecall To Phonecall'
+ _columns = {
+ 'name' : fields.char('Call summary', size=64, required=True, select=1),
+ 'user_id' : fields.many2one('res.users',"Assign To"),
+ 'contact_name':fields.char('Contact', size=64),
+ 'phone':fields.char('Phone', size=64),
+ 'categ_id': fields.many2one('crm.case.categ', 'Category', \
+ domain="['|',('section_id','=',False),('section_id','=',section_id),\
+ ('object_id.model', '=', 'crm.phonecall')]"),
+ 'date': fields.datetime('Date'),
+ 'section_id':fields.many2one('crm.case.section','Sales Team'),
+ 'action': fields.selection([('schedule','Schedule a call'), ('log','Log a call')], 'Action', required=True),
+ 'partner_id' : fields.many2one('res.partner', "Partner"),
+ 'note':fields.text('Note')
+ }
+
+
def action_cancel(self, cr, uid, ids, context=None):
"""
Closes Phonecall to Phonecall form
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Phonecall to Phonecall's IDs
- @param context: A standard dictionary for contextual values
"""
return {'type':'ir.actions.act_window_close'}
- def action_apply(self, cr, uid, ids, context=None):
- """
- This converts Phonecall to Phonecall and opens Phonecall view
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Phonecall to Phonecall IDs
- @param context: A standard dictionary for contextual values
-
- @return : Dictionary value for created Opportunity form
- """
- res = {}
- record_id = context and context.get('active_id', False) or False
- phonecall_obj = self.pool.get('crm.phonecall')
-
- if record_id:
- data_obj = self.pool.get('ir.model.data')
-
- # Get Phonecall views
- result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_phonecalls_filter')
- res = data_obj.read(cr, uid, result, ['res_id'])
- id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_phone_form_view')
- id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_phone_tree_view')
- if id2:
- id2 = data_obj.browse(cr, uid, id2, context=context).res_id
- if id3:
- id3 = data_obj.browse(cr, uid, id3, context=context).res_id
-
- phonecall = phonecall_obj.browse(cr, uid, record_id, context=context)
-
- for this in self.browse(cr, uid, ids, context=context):
- values = {
- 'name': this.name,
- 'user_id': this.user_id and this.user_id.id,
- 'categ_id': this.categ_id.id,
- 'section_id': this.section_id.id or (phonecall.section_id and phonecall.section_id.id),
- 'description': phonecall.description or '',
- 'partner_id': phonecall.partner_id.id,
- 'partner_address_id': phonecall.partner_address_id.id,
- 'partner_mobile': phonecall.partner_mobile or False,
- 'priority': phonecall.priority,
- 'partner_phone': phonecall.partner_phone or False,
- 'date': this.date
- }
- phonecall_id = phonecall_obj.create(cr, uid, values, context=context)
- if this.action == 'schedule':
- phonecall_obj.case_open(cr, uid, [phonecall_id])
- elif this.action == 'log':
- phonecall_obj.case_close(cr, uid, [phonecall_id])
-
- res = {
- 'name': _('Phone Call'),
- 'view_type': 'form',
- 'view_mode': 'form',
- 'res_model': 'crm.phonecall',
- 'view_id': False,
- 'views': [(id2, 'form'), (id3, 'tree'), (False, 'calendar'), (False, 'graph')],
- 'type': 'ir.actions.act_window',
- 'res_id': phonecall_id,
- 'domain': [('id', '=', phonecall_id)],
- 'search_view_id': res['res_id']
- }
- return res
-
- _columns = {
- 'name' : fields.char('Call summary', size=64, required=True, select=1),
- 'user_id' : fields.many2one('res.users',"Assign To"),
- 'categ_id': fields.many2one('crm.case.categ', 'Category', \
- domain="['|',('section_id','=',False),('section_id','=',section_id),\
- ('object_id.model', '=', 'crm.phonecall')]"),
- 'date': fields.datetime('Date'),
- 'section_id':fields.many2one('crm.case.section','Sales Team'),
- 'action': fields.selection([('schedule','Schedule a call'), ('log','Log a call')], 'Action', required=True),
- 'partner_id' : fields.many2one('res.partner', "Partner"),
- }
+ def action_schedule(self, cr, uid, ids, context=None):
+ value = {}
+ if context is None:
+ context = {}
+ phonecall = self.pool.get('crm.phonecall')
+ phonecall_ids = context and context.get('active_ids') or []
+ for this in self.browse(cr, uid, ids, context=context):
+ phocall_ids = phonecall.schedule_another_phonecall(cr, uid, phonecall_ids, this.date, this.name, \
+ this.user_id and this.user_id.id or False, \
+ this.section_id and this.section_id.id or False, \
+ this.categ_id and this.categ_id.id or False, \
+ action=this.action, context=context)
+ return phonecall.redirect_phonecall_view(cr, uid, phocall_ids[phonecall_ids[0]], context=context)
+
def default_get(self, cr, uid, fields, context=None):
"""
This function gets default values
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param fields: List of fields for default value
- @param context: A standard dictionary for contextual values
-
- @return : default values of fields.
+
"""
res = super(crm_phonecall2phonecall, self).default_get(cr, uid, fields, context=context)
record_id = context and context.get('active_id', False) or False
diff --git a/addons/crm/wizard/crm_phonecall_to_phonecall_view.xml b/addons/crm/wizard/crm_phonecall_to_phonecall_view.xml
index 794634da4f1..572fbb8b9a1 100644
--- a/addons/crm/wizard/crm_phonecall_to_phonecall_view.xml
+++ b/addons/crm/wizard/crm_phonecall_to_phonecall_view.xml
@@ -22,8 +22,8 @@
-
-
+
+
diff --git a/addons/crm_caldav/__openerp__.py b/addons/crm_caldav/__openerp__.py
index 8f1812862c5..0cbf6e172cd 100644
--- a/addons/crm_caldav/__openerp__.py
+++ b/addons/crm_caldav/__openerp__.py
@@ -22,7 +22,7 @@
{
- 'name': 'Calendar Synchronizing',
+ 'name': 'Meetings Synchronization',
'version': '1.1',
'category': 'Customer Relationship Management',
'complexity': "normal",
diff --git a/addons/crm_caldav/i18n/ar.po b/addons/crm_caldav/i18n/ar.po
new file mode 100644
index 00000000000..7865b4a8797
--- /dev/null
+++ b/addons/crm_caldav/i18n/ar.po
@@ -0,0 +1,46 @@
+# Arabic translation for openobject-addons
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2011-01-11 11:15+0000\n"
+"PO-Revision-Date: 2011-12-05 08:17+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Arabic \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-12-06 05:28+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
+
+#. module: crm_caldav
+#: model:ir.actions.act_window,name:crm_caldav.action_caldav_browse
+msgid "Caldav Browse"
+msgstr ""
+
+#. module: crm_caldav
+#: model:ir.model,name:crm_caldav.model_crm_meeting
+msgid "Meeting"
+msgstr "إجتماعات"
+
+#. module: crm_caldav
+#: model:ir.module.module,shortdesc:crm_caldav.module_meta_information
+msgid "Extended Module to Add CalDav feature on Meeting"
+msgstr ""
+
+#. module: crm_caldav
+#: model:ir.module.module,description:crm_caldav.module_meta_information
+msgid ""
+"\n"
+" New Features in Meeting:\n"
+" * Share meeting with other calendar clients like sunbird\n"
+msgstr ""
+
+#. module: crm_caldav
+#: model:ir.ui.menu,name:crm_caldav.menu_caldav_browse
+msgid "Synchronyze this calendar"
+msgstr ""
diff --git a/addons/crm_caldav/i18n/oc.po b/addons/crm_caldav/i18n/oc.po
new file mode 100644
index 00000000000..58d92403c46
--- /dev/null
+++ b/addons/crm_caldav/i18n/oc.po
@@ -0,0 +1,50 @@
+# Occitan (post 1500) translation for openobject-addons
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2011-01-11 11:15+0000\n"
+"PO-Revision-Date: 2011-11-20 09:20+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Occitan (post 1500) \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
+"X-Generator: Launchpad (build 14299)\n"
+
+#. module: crm_caldav
+#: model:ir.actions.act_window,name:crm_caldav.action_caldav_browse
+msgid "Caldav Browse"
+msgstr "Navigar dins CalDav"
+
+#. module: crm_caldav
+#: model:ir.model,name:crm_caldav.model_crm_meeting
+msgid "Meeting"
+msgstr "Rendètz-vos"
+
+#. module: crm_caldav
+#: model:ir.module.module,shortdesc:crm_caldav.module_meta_information
+msgid "Extended Module to Add CalDav feature on Meeting"
+msgstr "Modul espandit per apondre la foncionalitat CalDav a las acampadas"
+
+#. module: crm_caldav
+#: model:ir.module.module,description:crm_caldav.module_meta_information
+msgid ""
+"\n"
+" New Features in Meeting:\n"
+" * Share meeting with other calendar clients like sunbird\n"
+msgstr ""
+"\n"
+" Foncionalitats novèlas per las acampadas :\n"
+" * Partiment d'acampadas amb d'autres clients de calendièrs coma "
+"sunbird\n"
+
+#. module: crm_caldav
+#: model:ir.ui.menu,name:crm_caldav.menu_caldav_browse
+msgid "Synchronyze this calendar"
+msgstr "Sincronizar aqueste calendièr"
diff --git a/addons/crm_claim/__openerp__.py b/addons/crm_claim/__openerp__.py
index ae493c5dac2..7949ea48376 100644
--- a/addons/crm_claim/__openerp__.py
+++ b/addons/crm_claim/__openerp__.py
@@ -21,7 +21,7 @@
{
- 'name': 'Claims',
+ 'name': 'Claims Management',
'version': '1.0',
'category': 'Customer Relationship Management',
'complexity': "easy",
@@ -48,7 +48,9 @@ automatically new claims based on incoming emails.
'demo_xml': [
'crm_claim_demo.xml',
],
- 'test': ['test/test_crm_claim.yml'],
+ 'test': ['test/process/claim.yml',
+ 'test/ui/claim_demo.yml'
+ ],
'installable': True,
'active': False,
'certificate' : '00612027414703404749',
diff --git a/addons/crm_claim/crm_claim.py b/addons/crm_claim/crm_claim.py
index 9700a5a24b2..7875d6a2f1a 100644
--- a/addons/crm_claim/crm_claim.py
+++ b/addons/crm_claim/crm_claim.py
@@ -46,6 +46,7 @@ class crm_claim(crm.crm_case, osv.osv):
_columns = {
'id': fields.integer('ID', readonly=True),
'name': fields.char('Claim Subject', size=128, required=True),
+ 'active': fields.boolean('Active'),
'action_next': fields.char('Next Action', size=200),
'date_action_next': fields.datetime('Next Action Date'),
'description': fields.text('Description'),
@@ -95,6 +96,7 @@ class crm_claim(crm.crm_case, osv.osv):
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.case', context=c),
'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
+ 'active': lambda *a: 1
}
def onchange_partner_id(self, cr, uid, ids, part, email=False):
@@ -105,8 +107,7 @@ class crm_claim(crm.crm_case, osv.osv):
if not part:
return {'value': {'partner_address_id': False,
'email_from': False,
- 'partner_phone': False,
- 'partner_mobile': False
+ 'partner_phone': False
}}
addr = self.pool.get('res.partner').address_get(cr, uid, [part], ['contact'])
data = {'partner_address_id': addr['contact']}
@@ -121,7 +122,7 @@ class crm_claim(crm.crm_case, osv.osv):
if not add:
return {'value': {'email_from': False}}
address = self.pool.get('res.partner.address').browse(cr, uid, add)
- return {'value': {'email_from': address.email, 'partner_phone': address.phone, 'partner_mobile': address.mobile}}
+ return {'value': {'email_from': address.email, 'partner_phone': address.phone}}
def case_open(self, cr, uid, ids, *args):
"""Opens Claim"""
@@ -130,8 +131,6 @@ class crm_claim(crm.crm_case, osv.osv):
if l.state == 'draft':
message = _("The claim '%s' has been opened.") % l.name
self.log(cr, uid, l.id, message)
- value = {'date_open': time.strftime('%Y-%m-%d %H:%M:%S')}
- self.write(cr, uid, [l.id], value)
stage_id = self.stage_find(cr, uid, l.section_id.id or False, [('sequence','>',0)])
if stage_id:
self.stage_set(cr, uid, [l.id], stage_id)
diff --git a/addons/crm_claim/crm_claim_demo.xml b/addons/crm_claim/crm_claim_demo.xml
index 0f8488628b5..8279e04eb6f 100644
--- a/addons/crm_claim/crm_claim_demo.xml
+++ b/addons/crm_claim/crm_claim_demo.xml
@@ -15,8 +15,6 @@
-
-
@@ -31,8 +29,6 @@
-
-
@@ -47,8 +43,6 @@
-
-
@@ -63,8 +57,6 @@
-
-
@@ -79,8 +71,6 @@
-
-
@@ -88,14 +78,12 @@
-
-
@@ -104,14 +92,12 @@
-
-
diff --git a/addons/crm_claim/crm_claim_view.xml b/addons/crm_claim/crm_claim_view.xml
index a2ad01e0651..08237d06094 100644
--- a/addons/crm_claim/crm_claim_view.xml
+++ b/addons/crm_claim/crm_claim_view.xml
@@ -14,7 +14,7 @@
form
[('object_id.model', '=', 'crm.claim')]
- {'object_id':'crm.claim'}
+
Create claim categories to better manage and classify your claims. Some example of claims can be: preventive action, corrective action.
@@ -151,7 +151,7 @@
-
+
@@ -161,32 +161,6 @@
context="{'mail.compose.message.mode':'reply'}"
icon="terp-mail-replied" type="action" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+Date: Tue, 25 Oct 2011 13:41:17 +0530
+From: Mr. John Right
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.14) Gecko/20110223 Lightning/1.0b2 Thunderbird/3.1.8
+MIME-Version: 1.0
+To: claims@my.com
+Subject: demande de =?ISO-8859-1?Q?r=E8glement_de_votre_produit=2E?=
+Content-Type: text/plain; charset=ISO-8859-1; format=flowed
+Content-Transfer-Encoding: 8bit
+
+J'ai acheté votre produit il ya quelques jours. maintenant certains
+problèmes sont survenus sur votre produit.
+je demande donc à convertir cette demande que la réclamation et de
+résoudre les problèmes le plus tôt possible.
+
+Merci
+
diff --git a/addons/crm_claim/test/process/claim.yml b/addons/crm_claim/test/process/claim.yml
new file mode 100644
index 00000000000..e20436cd3c6
--- /dev/null
+++ b/addons/crm_claim/test/process/claim.yml
@@ -0,0 +1,46 @@
+-
+ Customer requests a claim after the sale of our product. He sends claim request by email.
+-
+ Mail script will be fetched him request from mail server. so I process that mail after read EML file
+-
+ !python {model: mail.thread}: |
+ import addons
+ request_file = open(addons.get_module_resource('crm_claim','test', 'customer_claim.eml'),'rb')
+ request_message = request_file.read()
+ self.message_process(cr, uid, 'crm.claim', request_message)
+-
+ After getting the mail, I check details of new claim of that customer.
+-
+ !python {model: crm.claim}: |
+ from openerp import tools
+ claim_ids = self.search(cr, uid, [('email_from','=', 'Mr. John Right ')])
+ assert claim_ids and len(claim_ids), "Claim is not created after getting request"
+ claim = self.browse(cr, uid, claim_ids[0], context=context)
+ assert claim.name == tools.ustr("demande derèglement de votre produit."), "Subject does not match"
+-
+ I open customer claim.
+-
+ !python {model: crm.claim}: |
+ claim_ids = self.search(cr, uid, [('email_from','=', 'Mr. John Right ')])
+ self.case_open(cr, uid, claim_ids)
+-
+ I check Claim Details after open.
+-
+ !python {model: crm.claim}: |
+ claim_ids = self.search(cr, uid, [('email_from','=', 'Mr. John Right ')])
+ claim = self.browse(cr, uid, claim_ids[0])
+ assert claim.state == "open", "Claim is not in Open state"
+ assert claim.stage_id.id == ref("crm.stage_lead1"), "Claim is not in New stage"
+-
+ After complete all service from our side, I close this claim.
+-
+ !python {model: crm.claim}: |
+ claim_ids = self.search(cr, uid, [('email_from','=', 'Mr. John Right ')])
+ self.case_close(cr, uid, claim_ids)
+-
+ I check Claim details after closed.
+-
+ !python {model: crm.claim}: |
+ claim_ids = self.search(cr, uid, [('email_from','=', 'Mr. John Right ')])
+ claim = self.browse(cr, uid, claim_ids[0])
+ assert claim.state == "done", "Claim is not in close state"
diff --git a/addons/crm_claim/test/test_crm_claim.yml b/addons/crm_claim/test/test_crm_claim.yml
deleted file mode 100644
index 9ee130329a7..00000000000
--- a/addons/crm_claim/test/test_crm_claim.yml
+++ /dev/null
@@ -1,44 +0,0 @@
-- |
- I check claims which contain customer claim information about document
- related problem, product related problem.
-- |
- I start by creating new claims for Damaged product as Value Claims with priority High and specify
- date of claim at which claim is created.
--
- !record {model: crm.claim, id: crm_claim_damagedproduct0}:
- categ_id: crm_claim.categ_claim2
- date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
- email_from: info@balmerinc.be
- name: 'Damaged product '
- partner_address_id: base.res_partner_address_1
- partner_id: base.res_partner_9
- priority: '2'
- section_id: crm.section_sales_department
-
-- |
- I check that the claims is in 'draft' state.
--
- !assert {model: crm.claim, id: crm_claim_damagedproduct0}:
- - state == 'draft'
-- |
- I can change that stage by next button right on it.
--
- !python {model: crm.claim}: |
- self.stage_next(cr, uid, [ref('crm_claim_damagedproduct0')])
-- |
- I make this claim as Open.
--
- !python {model: crm.claim}: |
- self.case_open(cr, uid, [ref('crm_claim_damagedproduct0')])
-- |
- I am changing partner Assigned to the Claim.
--
- !python {model: crm.claim}: |
- self.onchange_partner_id(cr, uid, [ref('crm_claim_damagedproduct0')], [])
- self.onchange_partner_id(cr, uid, [ref('crm_claim_damagedproduct0')], ref('base.res_partner_10'))
-- |
- I am changing partner Address to the Claim.
--
- !python {model: crm.claim}: |
- self.onchange_partner_address_id(cr, uid, [ref('crm_claim_damagedproduct0')], [], email = False)
-
diff --git a/addons/crm_claim/test/ui/claim_demo.yml b/addons/crm_claim/test/ui/claim_demo.yml
new file mode 100644
index 00000000000..520434fcd90
--- /dev/null
+++ b/addons/crm_claim/test/ui/claim_demo.yml
@@ -0,0 +1,15 @@
+-
+ I create claim record to call of partner onchange method.
+-
+ !record {model: crm.claim, id: crm_case_claim04}:
+ name: 'Damaged Product'
+ partner_id: base.res_partner_6
+-
+ I Update the message for claim.
+-
+ !python {model: crm.claim}: |
+ try:
+ self.message_update(cr, uid,[ref('crm_case_claim04')], {'subject': 'Claim Update record','body_text': 'first training session completed',})
+ except:
+ pass
+
\ No newline at end of file
diff --git a/addons/crm_fundraising/__openerp__.py b/addons/crm_fundraising/__openerp__.py
index 2d75f9e69b7..993b3dc6434 100644
--- a/addons/crm_fundraising/__openerp__.py
+++ b/addons/crm_fundraising/__openerp__.py
@@ -51,7 +51,7 @@ fund status.
'demo_xml': [
'crm_fundraising_demo.xml',
],
- 'test': ['test/test_crm_fund.yml'],
+ 'test': ['test/process/fund-rising.yml'],
'installable': True,
'active': False,
'certificate' : '00871545204231528989',
diff --git a/addons/crm_fundraising/crm_fundraising.py b/addons/crm_fundraising/crm_fundraising.py
index 07ba7460dec..37c5bb8ccee 100644
--- a/addons/crm_fundraising/crm_fundraising.py
+++ b/addons/crm_fundraising/crm_fundraising.py
@@ -112,3 +112,5 @@ class crm_fundraising(crm.crm_case, osv.osv):
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_fundraising/crm_fundraising_view.xml b/addons/crm_fundraising/crm_fundraising_view.xml
index 7c89b68590a..cc58b793c17 100644
--- a/addons/crm_fundraising/crm_fundraising_view.xml
+++ b/addons/crm_fundraising/crm_fundraising_view.xml
@@ -14,7 +14,7 @@
form
[('object_id.model', '=', 'crm.fundraising')]
- {'object_id':'crm.fundraising'}
+
Manage and define the fund raising categories you want to be maintained in the system.
@@ -136,7 +136,7 @@
-
+
@@ -146,32 +146,6 @@
context="{'mail.compose.message.mode':'reply', 'message_id':active_id}"
icon="terp-mail-replied" type="action" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+Date: Tue, 25 Oct 2011 13:41:17 +0530
+From: Mr. John Right
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.14) Gecko/20110223 Lightning/1.0b2 Thunderbird/3.1.8
+MIME-Version: 1.0
+To: contribute@my.com
+Subject: Demande de controbute dans votre fonds.
+Content-Type: text/plain; charset=ISO-8859-1; format=flowed
+Content-Transfer-Encoding: 8bit
+
+Client est très heureux d'utiliser notre produit et il l'intérêt de donner une partie des fonds dans notre produit. Il a donc envoyé la demande par courriel pour les collectes de fonds.
+
+Merci
+
diff --git a/addons/crm_fundraising/test/process/fund-rising.yml b/addons/crm_fundraising/test/process/fund-rising.yml
new file mode 100644
index 00000000000..b49f1f5c1bd
--- /dev/null
+++ b/addons/crm_fundraising/test/process/fund-rising.yml
@@ -0,0 +1,19 @@
+-
+ Customer is very happy with our service and he interest to contribute into our fund. so He sent request by email for Fundraising.
+-
+ Mail script will be fetched him request from mail server. so I process that mail after read EML file
+-
+ !python {model: mail.thread}: |
+ import addons
+ request_file = open(addons.get_module_resource('crm_fundraising','test', 'customer_fundraising.eml'),'rb')
+ request_message = request_file.read()
+ self.message_process(cr, uid, 'crm.fundraising', request_message)
+-
+ After getting the mail, I check details of new fundraising of that customer.
+-
+ !python {model: crm.fundraising}: |
+ from openerp import tools
+ fund_ids = self.search(cr, uid, [('email_from','=', 'Mr. John Right ')])
+ assert fund_ids and len(fund_ids), "Fund is not created after getting request"
+ fund = self.browse(cr, uid, fund_ids[0], context=context)
+ assert fund.name == tools.ustr("Demande de controbute dans votre fonds."), "Subject does not match"
diff --git a/addons/crm_fundraising/test/test_crm_fund.yml b/addons/crm_fundraising/test/test_crm_fund.yml
deleted file mode 100644
index ef81afeb563..00000000000
--- a/addons/crm_fundraising/test/test_crm_fund.yml
+++ /dev/null
@@ -1,45 +0,0 @@
-- |
- I start test Fund Raising which contain information about Donation or charity
- given by user.
-- |
- I start by creating new Funds entry for donation for books to poor school children
- with cost 500000.00 and category as "Learning And Education"
- I make payment by Cheque so I make sure that the mode on fund is selected as cheque.
--
- !record {model: crm.fundraising, id: crm_fundraising_donationforbookstopoorschoolchildren0}:
- categ_id: crm_fundraising.categ_fund2
- email_from: info@balmerinc.be
- name: Donation for books to poor school children
- partner_address_id: base.res_partner_address_1
- partner_id: base.res_partner_9
- planned_cost: 500000.0
- section_id: crm.section_sales_department
- type_id: crm_fundraising.type_fund2
-- |
- I check that the Funds is in 'draft' state.
--
- !assert {model: crm.fundraising, id: crm_fundraising_donationforbookstopoorschoolchildren0}:
- - state == 'draft'
-- |
- I open Funds by click on "Open" button.
--
- !python {model: crm.fundraising}: |
- self.case_open(cr, uid, [ref('crm_fundraising_donationforbookstopoorschoolchildren0')])
--
- I create the message regarding the all details of fundraising.
--
- !python {model: crm.fundraising}: |
- msg = {
- 'subject': 'fundraising_email',
- 'body_text': 'fundraising details',
- 'from': 'Administrator ',
- 'priority':'3',
- }
- context = None
- self.message_new(cr, uid,msg,context)
-
-- |
- After a request via email now I close this fundraising Request by clicking on "Done" button.
--
- !python {model: crm.fundraising}: |
- self.case_close(cr, uid, [ref('crm_fundraising_donationforbookstopoorschoolchildren0')])
diff --git a/addons/crm_helpdesk/__openerp__.py b/addons/crm_helpdesk/__openerp__.py
index 5124c3c5817..2adf7d26dcc 100644
--- a/addons/crm_helpdesk/__openerp__.py
+++ b/addons/crm_helpdesk/__openerp__.py
@@ -49,7 +49,7 @@ and categorize your interventions with a channel and a priority level.
'demo_xml': [
'crm_helpdesk_demo.xml',
],
- 'test': ['test/test_crm_helpdesk.yml'],
+ 'test': ['test/process/help-desk.yml'],
'installable': True,
'active': False,
'certificate' : '00830691522781519309',
diff --git a/addons/crm_helpdesk/crm_helpdesk_view.xml b/addons/crm_helpdesk/crm_helpdesk_view.xml
index 5b3203f19d0..3d48a3b88ac 100644
--- a/addons/crm_helpdesk/crm_helpdesk_view.xml
+++ b/addons/crm_helpdesk/crm_helpdesk_view.xml
@@ -14,7 +14,7 @@
form
[('object_id.model', '=', 'crm.helpdesk')]
- {'object_id':'crm.helpdesk'}
+
Create and manage helpdesk categories to better manage and classify your support requests.
@@ -96,7 +96,7 @@
-
+
@@ -106,32 +106,6 @@
context="{'mail.compose.message.mode':'reply', 'message_id':active_id}"
icon="terp-mail-replied" type="action" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+Date: Tue, 25 Oct 2011 13:41:17 +0530
+From: Mr. John Right
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.14) Gecko/20110223 Lightning/1.0b2 Thunderbird/3.1.8
+MIME-Version: 1.0
+To: info@my.com
+Subject: Where is download link of user manual of your product ?
+Content-Type: text/plain; charset=ISO-8859-1; format=flowed
+Content-Transfer-Encoding: 8bit
+
+I want to download user manual of your product.
+can you provide download link?
+
+Thanks
+
diff --git a/addons/crm_helpdesk/test/process/help-desk.yml b/addons/crm_helpdesk/test/process/help-desk.yml
new file mode 100644
index 00000000000..320bd61c2af
--- /dev/null
+++ b/addons/crm_helpdesk/test/process/help-desk.yml
@@ -0,0 +1,30 @@
+-
+ Customer has Questions regarding our service. so He sent questions list by email.
+-
+ Mail script will be fetched him request from mail server. so I process that mail after read EML file
+-
+ !python {model: mail.thread}: |
+ import addons
+ request_file = open(addons.get_module_resource('crm_helpdesk','test', 'customer_question.eml'),'rb')
+ request_message = request_file.read()
+ self.message_process(cr, uid, 'crm.helpdesk', request_message)
+-
+ After getting the mail, I check details of new question of that customer.
+-
+ !python {model: crm.helpdesk}: |
+ from openerp import tools
+ question_ids = self.search(cr, uid, [('email_from','=', 'Mr. John Right ')])
+ assert question_ids and len(question_ids), "Question is not created after getting request"
+ question = self.browse(cr, uid, question_ids[0], context=context)
+ assert question.name == tools.ustr("Where is download link of user manual of your product ? "), "Subject does not match"
+-
+ Now I Update message according to provide services.
+-
+ !python {model: crm.helpdesk}: |
+ question_ids = self.search(cr, uid, [('email_from','=', 'Mr. John Right ')])
+ try:
+ self.message_update(cr, uid, question_ids, {'subject': 'Link of product', 'body_text': 'www.openerp.com'})
+ except:
+ pass
+
+
diff --git a/addons/crm_helpdesk/test/test_crm_helpdesk.yml b/addons/crm_helpdesk/test/test_crm_helpdesk.yml
deleted file mode 100644
index eb0a25d2110..00000000000
--- a/addons/crm_helpdesk/test/test_crm_helpdesk.yml
+++ /dev/null
@@ -1,57 +0,0 @@
--
- |
- I start by creating New helpdesk request regarding some functional questions.
- I select Date at which helpdesk request is created.
--
- !record {model: crm.helpdesk, id: crm_helpdesk_somefunctionalquestion0}:
- date: !eval time.strftime('%Y-%m-%d %H:%M:%S')
- email_from: info@balmerinc.be
- name: Some functional question.
- partner_address_id: base.res_partner_address_1
- partner_id: base.res_partner_9
- section_id: crm.section_sales_department
--
- I create the message.
--
- !python {model: crm.helpdesk}: |
- msg = {
- 'subject': 'test_email',
- 'body_text': 'Testing',
- 'from': 'Administrator ',
- }
- context = None
- self.message_new(cr, uid,msg,context)
-
-- |
- I check that the Helpdesk request is in 'Draft' state.
--
- !assert {model: crm.helpdesk, id: crm_helpdesk_somefunctionalquestion0}:
- - state == 'draft'
-- |
- I make it "Open".
--
- !python {model: crm.helpdesk}: |
- self.case_open(cr, uid, [ref('crm_helpdesk_somefunctionalquestion0')])
--
- Update the created message.
--
- !python {model: crm.helpdesk}: |
- vals = {}
- msg = {
- 'subject': 'test_email',
- 'body_text': 'Testing',
- 'from': 'Administrator ',
- 'priority': 'done'
- }
- context = None
- default_act = 'pending'
- try:
- self.message_update(cr, uid,[ref('crm_helpdesk_somefunctionalquestion0')], msg,context)
- except:
- pass
-- |
- After a proper communication for the request via email I make sure that the request is fulfilled and
- I close this HelpDesk Request by clicking on "Close" button.
--
- !python {model: crm.helpdesk}: |
- self.case_close(cr, uid, [ref('crm_helpdesk_somefunctionalquestion0')])
diff --git a/addons/crm_partner_assign/__init__.py b/addons/crm_partner_assign/__init__.py
index 3bb196d3193..8d4bf993aff 100644
--- a/addons/crm_partner_assign/__init__.py
+++ b/addons/crm_partner_assign/__init__.py
@@ -22,3 +22,5 @@
import partner_geo_assign
import wizard
import report
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_partner_assign/__openerp__.py b/addons/crm_partner_assign/__openerp__.py
index 9e72204e31d..94f2f622a64 100644
--- a/addons/crm_partner_assign/__openerp__.py
+++ b/addons/crm_partner_assign/__openerp__.py
@@ -21,9 +21,9 @@
{
- 'name': 'Partner Geo-Localization',
+ 'name': 'Partners Geo-Localization',
'version': '1.0',
- 'category': 'Hidden',
+ 'category': 'Customer Relationship Management',
'complexity': "normal",
'description': """
This is the module used by OpenERP SA to redirect customers to its partners, based on geolocalization.
@@ -38,6 +38,9 @@ You can also use the geolocalization without using the GPS coordinates.
""",
'author': 'OpenERP SA',
'depends': ['crm'],
+ 'demo_xml': [
+ 'res_partner_demo.xml',
+ ],
'update_xml': [
'security/ir.model.access.csv',
'res_partner_view.xml',
@@ -46,9 +49,13 @@ You can also use the geolocalization without using the GPS coordinates.
'report/crm_lead_report_view.xml',
'report/crm_partner_report_view.xml',
],
- 'test': ['test/test_crm_partner_assign.yml'],
+ 'test': [
+ 'test/process/partner_assign.yml',
+ ],
'installable': True,
'active': False,
'certificate': '00503409558942442061',
'images': ['images/partner_geo_localization.jpeg','images/partner_grade.jpeg'],
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_partner_assign/crm_lead_view.xml b/addons/crm_partner_assign/crm_lead_view.xml
index 2ec3c85353b..14e160fb397 100644
--- a/addons/crm_partner_assign/crm_lead_view.xml
+++ b/addons/crm_partner_assign/crm_lead_view.xml
@@ -8,7 +8,7 @@
-
+
@@ -27,7 +27,7 @@
-
diff --git a/addons/crm_partner_assign/partner_geo_assign.py b/addons/crm_partner_assign/partner_geo_assign.py
index 2b67f80c066..08c4f7d23b6 100644
--- a/addons/crm_partner_assign/partner_geo_assign.py
+++ b/addons/crm_partner_assign/partner_geo_assign.py
@@ -24,22 +24,25 @@ from osv import fields
import urllib,re
import random, time
from tools.translate import _
+import tools
def geo_find(addr):
+ addr = addr.encode('utf8')
+ regex = '([+-]?[0-9\.]+),([+-]?[0-9\.]+),([+-]?[0-9\.]+) '
+ url = 'http://maps.google.com/maps/geo?q=' + urllib.quote(addr) + '&output=xml&oe=utf8&sensor=false'
try:
- regex = '([+-]?[0-9\.]+),([+-]?[0-9\.]+),([+-]?[0-9\.]+) '
- url = 'http://maps.google.com/maps/geo?q=' + urllib.quote(addr) + '&output=xml&oe=utf8&sensor=false'
xml = urllib.urlopen(url).read()
- if '' in xml:
- return None
- result = re.search(regex, xml, re.M|re.I)
- if not result:
- return None
- return float(result.group(2)),float(result.group(1))
except Exception, e:
raise osv.except_osv(_('Network error'),
_('Could not contact geolocation servers, please make sure you have a working internet connection (%s)') % e)
+ if '' in xml:
+ return None
+ result = re.search(regex, xml, re.M|re.I)
+ if not result:
+ return None
+ return float(result.group(2)),float(result.group(1))
+
class res_partner_grade(osv.osv):
_order = 'sequence'
@@ -74,9 +77,13 @@ class res_partner(osv.osv):
for partner in self.browse(cr, uid, ids, context=context):
if not partner.address:
continue
- part = partner.address[0]
- addr = ', '.join(filter(None, [part.street, (part.zip or '')+' '+(part.city or ''), part.state_id and part.state_id.name, part.country_id and part.country_id.name]))
- result = geo_find(addr.encode('utf8'))
+ contact = partner.address[0] #TOFIX: should be get latitude and longitude for default contact?
+ addr = ', '.join(filter(None, [
+ contact.street,
+ "%s %s" % (contact.zip , contact.city),
+ contact.state_id and contact.state_id.name,
+ contact.country_id and contact.country_id.name]))
+ result = geo_find(tools.ustr(addr))
if result:
self.write(cr, uid, [partner.id], {
'partner_latitude': result[0],
@@ -94,14 +101,13 @@ class crm_lead(osv.osv):
'partner_assigned_id': fields.many2one('res.partner', 'Assigned Partner', help="Partner this case has been forwarded/assigned to.", select=True),
'date_assign': fields.date('Assignation Date', help="Last date this case was forwarded/assigned to a partner"),
}
+ def _merge_data(self, cr, uid, ids, oldest, fields, context=None):
+ fields += ['partner_latitude', 'partner_longitude', 'partner_assigned_id', 'date_assign']
+ return super(crm_lead, self)._merge_data(cr, uid, ids, oldest, fields, context=context)
+
def onchange_assign_id(self, cr, uid, ids, partner_assigned_id, context=None):
"""This function updates the "assignation date" automatically, when manually assign a partner in the geo assign tab
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of stage’s IDs
- @stage_id: change state id on run time """
-
+ """
if not partner_assigned_id:
return {'value':{'date_assign': False}}
else:
@@ -112,72 +118,114 @@ class crm_lead(osv.osv):
'user_id' : user_id}
}
- def assign_partner(self, cr, uid, ids, context=None):
- ok = False
- for part in self.browse(cr, uid, ids, context=context):
- if not part.country_id:
- continue
- addr = ', '.join(filter(None, [part.street, (part.zip or '')+' '+(part.city or ''), part.state_id and part.state_id.name, part.country_id and part.country_id.name]))
- result = geo_find(addr.encode('utf8'))
- if result:
- self.write(cr, uid, [part.id], {
- 'partner_latitude': result[0],
- 'partner_longitude': result[1]
- }, context=context)
+ def action_assign_partner(self, cr, uid, ids, context=None):
+ return self.assign_partner(cr, uid, ids, partner_id=False, context=context)
+ def assign_partner(self, cr, uid, ids, partner_id=False, context=None):
+ partner_ids = {}
+ res = False
+ res_partner = self.pool.get('res.partner')
+ if not partner_id:
+ partner_ids = self.search_geo_partner(cr, uid, ids, context=context)
+ for lead in self.browse(cr, uid, ids, context=context):
+ if not partner_id:
+ partner_id = partner_ids.get(lead.id, False)
+ if not partner_id:
+ continue
+ self.assign_geo_localize(cr, uid, [lead.id], lead.partner_latitude, lead.partner_longitude, context=context)
+ partner = res_partner.browse(cr, uid, partner_id, context=context)
+ if partner.user_id:
+ for lead_id in ids:
+ self.allocate_salesman(cr, uid, [lead_id], [partner.user_id.id], context=context)
+ self.write(cr, uid, [lead.id], {'date_assign': time.strftime('%Y-%m-%d'), 'partner_assigned_id': partner_id}, context=context)
+ return res
+
+
+ def assign_geo_localize(self, cr, uid, ids, latitude=False, longitude=False, context=None):
+ for lead in self.browse(cr, uid, ids, context=context):
+ if not lead.country_id:
+ continue
+ addr = ', '.join(filter(None, [
+ lead.street,
+ "%s %s" % (lead.zip, lead.city),
+ lead.state_id and lead.state_id.name or '',
+ lead.country_id and lead.country_id.name or ''
+ ]))
+ result = geo_find(tools.ustr(addr))
+ if not latitude and result:
+ latitude = result[0]
+ if not longitude and result:
+ longitude = result[1]
+ self.write(cr, uid, [lead.id], {
+ 'partner_latitude': latitude,
+ 'partner_longitude': longitude
+ }, context=context)
+ return True
+
+ def search_geo_partner(self, cr, uid, ids, context=None):
+ res_partner = self.pool.get('res.partner')
+ res_partner_ids = {}
+ self.assign_geo_localize(cr, uid, ids, context=context)
+ for lead in self.browse(cr, uid, ids, context=context):
+ partner_ids = []
+ if not lead.country_id:
+ continue
+ latitude = lead.partner_latitude
+ longitude = lead.partner_longitude
+ if latitude and longitude:
# 1. first way: in the same country, small area
- part_ids = self.pool.get('res.partner').search(cr, uid, [
- ('partner_weight','>',0),
- ('partner_latitude','>',result[0]-2), ('partner_latitude','<',result[0]+2),
- ('partner_longitude','>',result[1]-1.5), ('partner_longitude','<',result[1]+1.5),
- ('country', '=', part.country_id.id),
+ partner_ids = res_partner.search(cr, uid, [
+ ('partner_weight', '>', 0),
+ ('partner_latitude', '>', latitude - 2), ('partner_latitude', '<', latitude + 2),
+ ('partner_longitude', '>', longitude - 1.5), ('partner_longitude', '<', longitude + 1.5),
+ ('country', '=', lead.country_id.id),
], context=context)
# 2. second way: in the same country, big area
- if not part_ids:
- part_ids = self.pool.get('res.partner').search(cr, uid, [
- ('partner_weight','>',0),
- ('partner_latitude','>',result[0]-4), ('partner_latitude','<',result[0]+4),
- ('partner_longitude','>',result[1]-3), ('partner_longitude','<',result[1]+3),
- ('country', '=', part.country_id.id),
+ if not partner_ids:
+ partner_ids = res_partner.search(cr, uid, [
+ ('partner_weight', '>', 0),
+ ('partner_latitude', '>', latitude - 4), ('partner_latitude', '<', latitude + 4),
+ ('partner_longitude', '>', longitude - 3), ('partner_longitude', '<' , longitude + 3),
+ ('country', '=', lead.country_id.id),
], context=context)
# 5. fifth way: anywhere in same country
- if not part_ids:
+ if not partner_ids:
# still haven't found any, let's take all partners in the country!
- part_ids = self.pool.get('res.partner').search(cr, uid, [
- ('partner_weight','>',0),
- ('country', '=', part.country_id.id),
+ partner_ids = res_partner.search(cr, uid, [
+ ('partner_weight', '>', 0),
+ ('country', '=', lead.country_id.id),
], context=context)
# 6. sixth way: closest partner whatsoever, just to have at least one result
- if not part_ids:
+ if not partner_ids:
# warning: point() type takes (longitude, latitude) as parameters in this order!
cr.execute("""SELECT id, distance
FROM (select id, (point(partner_longitude, partner_latitude) <-> point(%s,%s)) AS distance FROM res_partner
WHERE partner_longitude is not null
AND partner_latitude is not null
AND partner_weight > 0) AS d
- ORDER BY distance LIMIT 1""", (result[1],result[0]))
+ ORDER BY distance LIMIT 1""", (longitude, latitude))
res = cr.dictfetchone()
if res:
- part_ids.append(res['id'])
+ partner_ids.append(res['id'])
- total = 0
+ total_weight = 0
toassign = []
- for part2 in self.pool.get('res.partner').browse(cr, uid, part_ids, context=context):
- total += part2.partner_weight
- toassign.append( (part2.id, total) )
+ for partner in res_partner.browse(cr, uid, partner_ids, context=context):
+ total_weight += partner.partner_weight
+ toassign.append( (partner.id, total_weight) )
+
random.shuffle(toassign) # avoid always giving the leads to the first ones in db natural order!
- mypartner = random.randint(0,total)
- for t in toassign:
- if mypartner<=t[1]:
- vals = self.onchange_assign_id(cr,uid, ids, t[0], context=context)['value']
- vals.update({'partner_assigned_id': t[0], 'date_assign': time.strftime('%Y-%m-%d')})
- self.write(cr, uid, [part.id], vals, context=context)
+ nearest_weight = random.randint(0, total_weight)
+ for partner_id, weight in toassign:
+ if nearest_weight <= weight:
+ res_partner_ids[lead.id] = partner_id
break
- ok = True
- return ok
+ return res_partner_ids
crm_lead()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_partner_assign/report/__init__.py b/addons/crm_partner_assign/report/__init__.py
index a211aeede1e..45065314b25 100644
--- a/addons/crm_partner_assign/report/__init__.py
+++ b/addons/crm_partner_assign/report/__init__.py
@@ -22,3 +22,5 @@
import crm_lead_report
import crm_partner_report
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_partner_assign/report/crm_lead_report_view.xml b/addons/crm_partner_assign/report/crm_lead_report_view.xml
index 01bbefb84d4..a0bbd62c131 100644
--- a/addons/crm_partner_assign/report/crm_lead_report_view.xml
+++ b/addons/crm_partner_assign/report/crm_lead_report_view.xml
@@ -141,7 +141,7 @@
Opp. Assignment Analysis
crm.lead.report.assign
form
- {"search_default_group_partner_date": 1, "search_default_group_grade":1,'group_by_no_leaf':1,'group_by':[]}
+ {'default_type': 'opportunity', "search_default_group_partner_date": 1, "search_default_group_grade":1,'group_by_no_leaf':1,'group_by':[]}
tree
[('type', '=', 'opportunity')]
diff --git a/addons/crm_partner_assign/report/crm_partner_report.py b/addons/crm_partner_assign/report/crm_partner_report.py
index 10e74a34b76..c5afe9b5b82 100644
--- a/addons/crm_partner_assign/report/crm_partner_report.py
+++ b/addons/crm_partner_assign/report/crm_partner_report.py
@@ -61,3 +61,5 @@ class crm_partner_report_assign(osv.osv):
)""")
crm_partner_report_assign()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_partner_assign/res_partner_demo.xml b/addons/crm_partner_assign/res_partner_demo.xml
new file mode 100644
index 00000000000..66ee1fbd5e7
--- /dev/null
+++ b/addons/crm_partner_assign/res_partner_demo.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ First
+ 1
+
+
+
+ 10
+
+
+
diff --git a/addons/crm_partner_assign/security/ir.model.access.csv b/addons/crm_partner_assign/security/ir.model.access.csv
index b5bb64ad3dd..e4067a69aed 100644
--- a/addons/crm_partner_assign/security/ir.model.access.csv
+++ b/addons/crm_partner_assign/security/ir.model.access.csv
@@ -1,6 +1,6 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_ crm_lead_report_assign","crm.lead.report.assign","model_crm_lead_report_assign","base.group_sale_salesman",1,1,1,0
-"access_ crm_lead_report_assign_all","crm.lead.report.assign.all","model_crm_lead_report_assign","base.group_user",1,0,0,0
-"access_crm_partner_report","crm.partner.report.assign.all","model_crm_partner_report_assign","base.group_sale_salesman",1,0,0,0
-"access_res_partner_grade","res.partner.grade","model_res_partner_grade","base.group_sale_salesman",1,1,1,0
-"access_res_partner_grade_manager","res.partner.grade.manager","model_res_partner_grade","base.group_sale_manager",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_ crm_lead_report_assign,crm.lead.report.assign,model_crm_lead_report_assign,base.group_sale_salesman,1,1,1,0
+access_ crm_lead_report_assign_all,crm.lead.report.assign.all,model_crm_lead_report_assign,base.group_user,1,0,0,0
+access_crm_partner_report,crm.partner.report.assign.all,model_crm_partner_report_assign,base.group_sale_salesman,1,0,0,0
+access_res_partner_grade,res.partner.grade,model_res_partner_grade,base.group_sale_salesman,1,1,1,0
+access_res_partner_grade_manager,res.partner.grade.manager,model_res_partner_grade,base.group_sale_manager,1,1,1,1
diff --git a/addons/crm_partner_assign/test/process/partner_assign.yml b/addons/crm_partner_assign/test/process/partner_assign.yml
new file mode 100644
index 00000000000..18f03c9d41c
--- /dev/null
+++ b/addons/crm_partner_assign/test/process/partner_assign.yml
@@ -0,0 +1,37 @@
+-
+ In order to test find nearest Partner functionality and assign to opportunity ,
+-
+ I Set Geo Lattitude and Longitude according to partner address.
+-
+ !python {model: res.partner}: |
+ self.geo_localize(cr, uid, [ref('base.res_partner_ericdubois0')], context)
+-
+ I check Geo Latitude and Longitude of partner after set
+-
+ !python {model: res.partner}: |
+ partner = self.browse(cr, uid, ref('base.res_partner_ericdubois0'))
+ assert partner.partner_latitude == 50.4530495 , "Latitude is wrong"
+ assert partner.partner_longitude == 3.9693885 , "Longitude is wrong"
+-
+ I assign nearest partner to opportunity.
+-
+ !python {model: crm.lead}: |
+ self.assign_partner(cr, uid, [ref('crm.crm_case_abcfuelcounits0')], context=context)
+-
+ I check assigned partner of opportunity who is nearest Geo Latitude and Longitude of opportunity.
+-
+ !python {model: crm.lead}: |
+ lead = self.browse(cr, uid, ref('crm.crm_case_abcfuelcounits0'))
+ assert lead.partner_assigned_id.id == ref('base.res_partner_ericdubois0') , "Opportuniy is not assigned nearest partner"
+ assert lead.partner_latitude == 50.8495239 , "Latitude is wrong"
+ assert lead.partner_longitude == 4.3667002 , "Longitude is wrong"
+-
+ I forward this opportunity to its nearest partner.
+-
+ !python {model: crm.lead.forward.to.partner}: |
+ context.update({'active_model': 'crm.lead', 'active_id': ref('crm.crm_case_abcfuelcounits0'), 'active_ids': [ref('crm.crm_case_abcfuelcounits0')]})
+ forward_id = self.create(cr, uid, {'email_from': 'test@openerp.com', 'send_to': 'partner'}, context=context)
+ try:
+ self.action_forward(cr, uid, [forward_id], context=context)
+ except:
+ pass
diff --git a/addons/crm_partner_assign/test/test_crm_partner_assign.yml b/addons/crm_partner_assign/test/test_crm_partner_assign.yml
deleted file mode 100644
index 359fa8454f6..00000000000
--- a/addons/crm_partner_assign/test/test_crm_partner_assign.yml
+++ /dev/null
@@ -1,137 +0,0 @@
--
- In order to test Forward Partner functionality, I create an opportunity and forward it to partner.
--
- I assign an email address to Administrator.
--
- !record {model: res.users, id: base.user_root}:
- user_email: admin@openerp.com
--
- I create some partner grades.
--
- I create a grade 'First'.
--
- !record {model: res.partner.grade, id: res_partner_grade_first0}:
- name: First
- sequence: 1
--
- I create another grade 'Second'.
--
- !record {model: res.partner.grade, id: res_partner_grade_second0}:
- name: Second
- sequence: 2
--
- I create one more grade 'Third'.
--
- !record {model: res.partner.grade, id: res_partner_grade_third0}:
- name: Third
- sequence: 3
--
- I assign grade 'First' to the partner 'Axelor'.
--
- !record {model: res.partner, id: base.res_partner_desertic_hispafuentes}:
- grade_id: res_partner_grade_first0
--
- I change the User email id or partner if needed.
--
- !python {model: res.partner}: |
- self.geo_localize(cr, uid, [ref('base.res_partner_desertic_hispafuentes')], context)
--
- I assgin a reply-to email address to Sales Team.
--
- !record {model: crm.case.section, id: crm.section_sales_department}:
- reply_to: sales_openerp@openerp.com
--
- I create an opportunity 'Questionnaire on OpenERP'.
--
- !record {model: crm.lead, id: crm_lead_questionnaireonopenerp0}:
- categ_id: crm.categ_oppor7
- section_id: crm.section_sales_department
- country_id: base.fr
- date_assign: '2011-02-07'
- day_close: 0.0
- day_open: 0.0
- email_from: info@axelor.com
- name: Questionnaire on OpenERP
- partner_address_id: base.res_partner_address_3000
- partner_assigned_id: base.res_partner_desertic_hispafuentes
- partner_id: base.res_partner_desertic_hispafuentes
- partner_latitude: 0.0
- partner_longitude: 0.0
- phone: +33 1 64 61 04 01
- planned_revenue: 0.0
- probability: 0.0
- type: opportunity
--
- I change the assigned partner.
--
- !python {model: crm.lead}: |
- self.onchange_assign_id(cr, uid, [ref('crm_lead_questionnaireonopenerp0')], ref('base.res_partner_desertic_hispafuentes'), context)
- self.assign_partner(cr, uid, [ref('crm_lead_questionnaireonopenerp0')], context)
--
- I change the User email id or partner if needed.
--
- !python {model: crm.lead.forward.to.partner}: |
- context.update({'history': 'latest', })
- user = ref('base.user_root')
- self.on_change_email(cr, uid, [ref('crm_lead_questionnaireonopenerp0')], user)
- self.on_change_partner(cr, uid, [ref('crm_lead_questionnaireonopenerp0')], ref('base.res_partner_desertic_hispafuentes'))
--
- I change in history define.
--
- !python {model: crm.lead.forward.to.partner}: |
- context.update({'history': 'info', })
- self.on_change_history(cr, uid, [ref('crm_lead_questionnaireonopenerp0')], context.get('history'), context)
--
- I check the case history.
--
- !python {model: crm.lead.forward.to.partner}: |
- context.update({'history': 'latest', })
- self._get_case_history(cr, uid, context.get('history'), ref('crm_lead_questionnaireonopenerp0'), context=context)
-
- context.update({'history': 'info', })
- self._get_case_history(cr, uid, context.get('history'), ref('crm_lead_questionnaireonopenerp0'), context=context)
-
- context.update({'history': 'whole', })
- self._get_case_history(cr, uid, context.get('history'), ref('crm_lead_questionnaireonopenerp0'), context=context)
--
- I get lead details.
--
- !python {model: crm.lead.forward.to.partner}: |
- self.get_lead_details(cr, uid, ref('crm_lead_questionnaireonopenerp0'), context)
--
- I click on Forward button.
--
- !python {model: crm.lead.forward.to.partner}: |
- from tools import config
- vals = {
- 'subject': 'email',
- 'email_to': 'info@axelor.com',
- 'email_from': 'Administrator ',
- 'reply_to': 'sales_openerp@openerp.com',
- 'state': 'draft',
- 'history': 'latest',
- }
- ids = self.create(cr, uid, vals, context={'active_id': ref('crm_lead_questionnaireonopenerp0'), 'active_model': 'crm.lead'})
- host = config.get('smtp_user', '127.0.0.1')
- assert config.get(host, True), 'SMTP not configured !'
- try:
- self.action_forward(cr, uid, [ids], context={'active_id': ref('crm_lead_questionnaireonopenerp0'), 'active_model': 'crm.lead'})
- except:
- pass
--
- I create the opportunity.
--
- !record {model: crm.lead, id: crm_opportunity2}:
- email_from: info@balmerinc.be
- name: 'FUEL CO 829264 - 10002 units'
- partner_address_id: base.res_partner_address_1
- partner_id: base.res_partner_9
- probability: 1.0
- stage_id: crm.stage_lead1
- categ_id: crm.categ_oppor2
- section_id: crm.section_sales_department
-- |
- I Update the data.
--
- !python {model: crm.merge.opportunity}: |
- self._update_data([ref('crm_opportunity2')], ref('crm_lead_questionnaireonopenerp0'))
diff --git a/addons/crm_partner_assign/wizard/__init__.py b/addons/crm_partner_assign/wizard/__init__.py
index be6c1533722..9224173145b 100644
--- a/addons/crm_partner_assign/wizard/__init__.py
+++ b/addons/crm_partner_assign/wizard/__init__.py
@@ -20,4 +20,3 @@
##############################################################################
import crm_forward_to_partner
-import crm_merge_opportunity
diff --git a/addons/crm_partner_assign/wizard/crm_forward_to_partner.py b/addons/crm_partner_assign/wizard/crm_forward_to_partner.py
index cdaf8f19b12..565f99b9db1 100644
--- a/addons/crm_partner_assign/wizard/crm_forward_to_partner.py
+++ b/addons/crm_partner_assign/wizard/crm_forward_to_partner.py
@@ -24,6 +24,7 @@ import time
import re
from osv import osv, fields
from tools.translate import _
+from mail.mail_message import to_email
class crm_lead_forward_to_partner(osv.osv_memory):
"""Forwards lead history"""
@@ -34,6 +35,7 @@ class crm_lead_forward_to_partner(osv.osv_memory):
'send_to': fields.selection([('user', 'User'), ('partner', 'Partner'), \
('email', 'Email Address')], 'Send to', required=True),
'user_id': fields.many2one('res.users', "User"),
+ 'attachment_ids': fields.many2many('ir.attachment','lead_forward_to_partner_attachment_rel', 'wizard_id', 'attachment_id', 'Attachments'),
'partner_id' : fields.many2one('res.partner', 'Partner'),
'address_id' : fields.many2one('res.partner.address', 'Address'),
'history': fields.selection([('info', 'Case Information'), ('latest', 'Latest email'), ('whole', 'Whole Story')], 'Send history', required=True),
@@ -46,48 +48,8 @@ class crm_lead_forward_to_partner(osv.osv_memory):
}
- def get_whole_history(self, cr, uid, ids, context=None):
- """This function gets whole communication history and returns as top posting style
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of history IDs
- @param context: A standard dictionary for contextual values
- """
- whole = []
- for hist_id in ids:
- whole.append(self.get_latest_history(cr, uid, hist_id, context=context))
- whole = '\n\n'.join(whole)
- return whole or ''
-
- def get_latest_history(self, cr, uid, hist_id, context=None):
- """This function gets latest communication and returns as top posting style
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param hist_id: Id of latest history
- @param context: A standard dictionary for contextual values
- """
- log_pool = self.pool.get('mail.message')
- hist = log_pool.browse(cr, uid, hist_id, context=context)
- header = '-------- Original Message --------'
- sender = 'From: %s' %(hist.email_from or '')
- to = 'To: %s' % (hist.email_to or '')
- sentdate = 'Date: %s' % (hist.date or '')
- desc = '\n%s'%(hist.body_text)
- original = [header, sender, to, sentdate, desc]
- original = '\n'.join(original)
- return original
-
+
def on_change_email(self, cr, uid, ids, user):
- """This function fills email information based on user selected
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Mail’s IDs
- @param user: Changed User id
- @param partner: Changed Partner id
- """
if not user:
return {'value': {'email_to': False}}
email = self.pool.get('res.users')._get_email_from(cr, uid, [user])[user]
@@ -98,54 +60,19 @@ class crm_lead_forward_to_partner(osv.osv_memory):
* info: Forward the case information
* whole: Send the whole history
* latest: Send the latest histoy
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of history IDs
- @param context: A standard dictionary for contextual values
"""
#TODO: ids and context are not comming
- res = False
+ res = {}
res_id = context.get('active_id')
- msg_val = self._get_case_history(cr, uid, history_type, res_id, context=context)
- if msg_val:
- res = {'value': {'body_text' : '\n\n' + msg_val}}
+ model = context.get('active_model')
+ lead = self.pool.get(model).browse(cr, uid, res_id, context)
+ body_text = self._get_message_body_text(cr, uid, lead, history_type, context=context)
+ if body_text:
+ res = {'value': {'body_text' : body_text}}
return res
-
- def _get_case_history(self, cr, uid, history_type, res_id, context=None):
- if not res_id:
- return
-
- msg_val = ''
- case_info = self.get_lead_details(cr, uid, res_id, context=context)
- model_pool = self.pool.get('crm.lead')
-
- if history_type == 'info':
- msg_val = case_info
-
- elif history_type == 'whole':
- log_ids = model_pool.browse(cr, uid, res_id, context=context).message_ids
- log_ids = map(lambda x: x.id, filter(lambda x: x.email_from, log_ids))
- msg_val = case_info + '\n\n' + self.get_whole_history(cr, uid, log_ids, context=context)
-
- elif history_type == 'latest':
- log_ids = model_pool.browse(cr, uid, res_id, context=context).message_ids
- log_ids = filter(lambda x: x.email_from and x.id, log_ids)
- if not log_ids:
- msg_val = case_info
- else:
- msg_val = case_info + '\n\n' + self.get_latest_history(cr, uid, log_ids[0].id, context=context)
-
- return msg_val
-
+
def on_change_partner(self, cr, uid, ids, partner_id):
"""This function fills address information based on partner/user selected
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of Mail’s IDs
- @param user: Changed User id
- @param partner: Changed Partner id
"""
if not partner_id:
return {'value' : {'email_to' : False, 'address_id': False}}
@@ -158,11 +85,11 @@ class crm_lead_forward_to_partner(osv.osv_memory):
partner = partner_obj.browse(cr, uid, [partner_id])
user_id = partner and partner[0].user_id or False
email = user_id and user_id.user_email or ''
- data.update({'email_cc' : email})
+ data.update({'email_cc' : email, 'user_id': user_id and user_id.id or False})
return {
'value' : data,
'domain' : {'address_id' : partner_id and "[('partner_id', '=', partner_id)]" or "[]"}
- }
+ }
def on_change_address(self, cr, uid, ids, address_id):
email = ''
@@ -170,155 +97,125 @@ class crm_lead_forward_to_partner(osv.osv_memory):
email = self.pool.get('res.partner.address').browse(cr, uid, address_id).email
return {'value': {'email_to' : email}}
- def send_mail(self, cr, uid, ids, context=None):
- if context is None:
- context = {}
- super(crm_lead_forward_to_partner, self).send_mail(cr, uid, ids, context=context)
- self.action_forward(cr, uid, ids, context)
- return {'type': 'ir.actions.act_window_close'}
-
def action_forward(self, cr, uid, ids, context=None):
"""
Forward the lead to a partner
"""
if context is None:
context = {}
+ res = {'type': 'ir.actions.act_window_close'}
+ model = context.get('active_model')
+ if model not in ('crm.lead'):
+ return res
+
this = self.browse(cr, uid, ids[0], context=context)
- case_pool = self.pool.get(context.get('active_model'))
- res_id = context and context.get('active_id', False) or False
- case = case_pool.browse(cr, uid, res_id, context=context)
- context.update({'mail': 'forward'})
-
- to_write = {'date_assign': time.strftime('%Y-%m-%d')}
- if (this.send_to == 'partner' and this.partner_id):
- to_write['partner_assigned_id'] = this.partner_id.id
-
- if this.send_to == 'user':
- to_write.update({'user_id' : this.user_id.id})
- email_re = r'([^ ,<@]+@[^> ,]+)'
- email_cc = re.findall(email_re, case.email_cc or '')
- new_cc = []
- if case.email_cc:
- new_cc.append(case.email_cc)
- for to in this.email_to.split(','):
- email_to = re.findall(email_re, to)
- email_to = email_to and email_to[0] or ''
- if email_to not in email_cc:
- new_cc.append(to)
- to_write.update({'email_cc' : ', '.join(new_cc) })
- case_pool.write(cr, uid, case.id, to_write, context=context)
- return {'type': 'ir.actions.act_window_close'}
-
- def get_lead_details(self, cr, uid, lead_id, context=None):
- body = []
- lead_proxy = self.pool.get('crm.lead')
- lead = lead_proxy.browse(cr, uid, lead_id, context=context)
- if not lead.type or lead.type == 'lead' or not lead.partner_address_id:
- field_names = [
- 'partner_name', 'title', 'function', 'street', 'street2',
- 'zip', 'city', 'country_id', 'state_id', 'email_from',
- 'phone', 'fax', 'mobile', 'categ_id', 'description',
- ]
-
- for field_name in field_names:
- field_definition = lead_proxy._columns[field_name]
- value = None
-
- if field_definition._type == 'selection':
- if hasattr(field_definition.selection, '__call__'):
- key = field_definition.selection(lead_proxy, cr, uid, context=context)
- else:
- key = field_definition.selection
- value = dict(key).get(lead[field_name], lead[field_name])
- elif field_definition._type == 'many2one':
- if lead[field_name]:
- value = lead[field_name].name_get()[0][1]
- else:
- value = lead[field_name]
-
- body.append("%s: %s" % (field_definition.string, value or ''))
- elif lead.type == 'opportunity':
- pa = lead.partner_address_id
- body += [
- "Partner: %s" % (lead.partner_id and lead.partner_id.name_get()[0][1]),
- "Contact: %s" % (pa.name or ''),
- "Title: %s" % (pa.title or ''),
- "Function: %s" % (pa.function or ''),
- "Street: %s" % (pa.street or ''),
- "Street2: %s" % (pa.street2 or ''),
- "Zip: %s" % (pa.zip or ''),
- "City: %s" % (pa.city or ''),
- "Country: %s" % (pa.country_id and pa.country_id.name_get()[0][1] or ''),
- "State: %s" % (pa.state_id and pa.state_id.name_get()[0][1] or ''),
- "Email: %s" % (pa.email or ''),
- "Phone: %s" % (pa.phone or ''),
- "Fax: %s" % (pa.fax or ''),
- "Mobile: %s" % (pa.mobile or ''),
- "Lead Category: %s" % (lead.categ_id and lead.categ_id.name or ''),
- "Details: %s" % (lead.description or ''),
- ]
- return "\n".join(body + ['---'])
-
- def default_get(self, cr, uid, fields, context=None):
- """
- This function gets default values
- """
-
- if context is None:
- context = {}
-
- defaults = super(crm_lead_forward_to_partner, self).default_get(cr, uid, fields, context=context)
- active_id = context.get('active_id')
- if not active_id:
- return defaults
-
- lead_proxy = self.pool.get('crm.lead')
- partner_obj = self.pool.get('res.partner')
- lead = lead_proxy.browse(cr, uid, active_id, context=context)
-
- email_cc = ''
- email = ''
- if lead.partner_assigned_id:
- partner = partner_obj.browse(cr, uid, [lead.partner_assigned_id.id])
- user_id = partner and partner[0].user_id or False
- email_cc = user_id and user_id.user_email or ''
-
- addr = partner_obj.address_get(cr, uid, [partner[0].id], ['contact'])
- email = self.pool.get('res.partner.address').browse(cr, uid, addr['contact']).email
-
- body = self._get_case_history(cr, uid, defaults.get('history', 'latest'), lead.id, context=context)
- defaults.update({
- 'subject' : '%s: %s - %s' % (_('Fwd'), 'Openerp lead forward', lead.name),
- 'body_text' : body,
- 'email_cc' : email_cc,
- 'email_to' : email or 'dummy@dummy.ly'
- })
- return defaults
-
-class crm_lead_mass_forward_to_partner(osv.osv_memory):
- _name = 'crm.lead.mass.forward.to.partner'
- _inherit = 'crm.lead.forward.to.partner'
-
- def action_mass_forward(self, cr, uid, ids, context=None):
- if not context:
- context = {}
-
- active_ids = context.get('active_ids')
- case_obj = self.pool.get('crm.lead')
- for case in case_obj.browse(cr, uid, active_ids, context=context):
- if not case.partner_assigned_id:
- case_obj.assign_partner(cr,uid, [case.id], context=context)
- case = case_obj.browse(cr, uid, case.id, context=context)
-
- if not case.partner_assigned_id:
- continue
-
- context.update({'active_id' : case.id})
+ lead = self.pool.get(model)
+ lead_id = context and context.get('active_id', False) or False
+ lead_ids = lead_id and [lead_id] or []
+ mode = context.get('mail.compose.message.mode')
+ if mode == 'mass_mail':
+ lead_ids = context and context.get('active_ids', []) or []
value = self.default_get(cr, uid, ['body_text', 'email_to', 'email_cc', 'subject', 'history'], context=context)
self.write(cr, uid, ids, value, context=context)
- self.action_forward(cr,uid, ids, context=context)
+ context['mail.compose.message.mode'] = mode
- return {'type': 'ir.actions.act_window_close'}
+ self.send_mail(cr, uid, ids, context=context)
+ for case in lead.browse(cr, uid, lead_ids, context=context):
+ if (this.send_to == 'partner' and this.partner_id):
+ lead.assign_partner(cr, uid, [case.id], this.partner_id.id, context=context)
+ if this.send_to == 'user':
+ lead.allocate_salesman(cr, uid, [case.id], [this.user_id.id], context=context)
+ email_cc = to_email(case.email_cc)
+ email_cc = email_cc and email_cc[0] or ''
+ new_cc = []
+ if email_cc:
+ new_cc.append(email_cc)
+ for to in this.email_to.split(','):
+ email_to = to_email(to)
+ email_to = email_to and email_to[0] or ''
+ if email_to not in new_cc:
+ new_cc.append(to)
+ update_vals = {'email_cc' : ', '.join(new_cc) }
+ lead.write(cr, uid, case.id, update_vals, context=context)
+ return res
+
+ def _get_info_body_text(self, cr, uid, lead, context=None):
+ field_names = []
+ proxy = self.pool.get(lead._name)
+ if lead.type == 'opportunity':
+ field_names += ['partner_id']
+ field_names += [
+ 'partner_name' , 'title', 'function', 'street', 'street2',
+ 'zip', 'city', 'country_id', 'state_id', 'email_from',
+ 'phone', 'fax', 'mobile', 'categ_id', 'description',
+ ]
+ return proxy._mail_body_text(cr, uid, lead, field_names, context=context)
+
+ def _get_message_body_text(self, cr, uid, lead, mode='whole', context=None):
+ """This function gets whole communication history and returns as top posting style
+ """
+ mail_message = self.pool.get('mail.message')
+ message_ids = []
+ body = self._get_info_body_text(cr, uid, lead, context=context)
+ if mode in ('whole', 'latest'):
+ message_ids = lead.message_ids
+ message_ids = map(lambda x: x.id, filter(lambda x: x.email_from, message_ids))
+ if mode == 'latest' and len(message_ids):
+ message_ids = [message_ids[0]]
+ for message in mail_message.browse(cr, uid, message_ids, context=context):
+ header = '-------- Original Message --------'
+ sender = 'From: %s' %(message.email_from or '')
+ to = 'To: %s' % (message.email_to or '')
+ sentdate = 'Date: %s' % (message.date or '')
+ desc = '\n%s'%(message.body_text)
+ original = [header, sender, to, sentdate, desc, '\n']
+ original = '\n'.join(original)
+ body += original
+ return body or ''
+
+ def get_value(self, cr, uid, model, res_id, context=None):
+ if context is None:
+ context = {}
+ res = super(crm_lead_forward_to_partner, self).get_value(cr, uid, model, res_id, context=context)
+ if model not in ("crm.lead"):
+ return res
+ proxy = self.pool.get(model)
+ partner = self.pool.get('res.partner')
+ lead = proxy.browse(cr, uid, res_id, context=context)
+ mode = context.get('mail.compose.message.mode')
+ if mode == "forward":
+ body_type = context.get('mail.compose.message.body')
+ email_cc = res.get('email_cc', "")
+ email = res.get('email_to', "")
+ subject = '%s: %s - %s' % (_('Fwd'), 'Lead forward', lead.name)
+ body = self._get_message_body_text(cr, uid, lead, body_type, context=context)
+ partner_assigned_id = lead.partner_assigned_id and lead.partner_assigned_id.id or False
+ user_id = False
+ if not partner_assigned_id:
+ partner_assigned_id = proxy.search_geo_partner(cr, uid, [lead.id], context=None).get(lead.id, False)
+ if partner_assigned_id:
+ assigned_partner = partner.browse(cr, uid, partner_assigned_id, context=context)
+ user_id = assigned_partner.user_id and assigned_partner.user_id.id or False
+ email_cc = assigned_partner.user_id and assigned_partner.user_id.user_email or ''
+ email = assigned_partner.email
+
+ res.update({
+ 'subject' : subject,
+ 'body_text' : body,
+ 'email_cc' : email_cc,
+ 'email_to' : email,
+ 'partner_assigned_id': partner_assigned_id,
+ 'user_id': user_id,
+ })
+ return res
+
+
+ def default_get(self, cr, uid, fields, context=None):
+ if context is None:
+ context = {}
+ context['mail.compose.message.mode'] = 'forward'
+ context['mail.compose.message.body'] = 'info'
+ return super(crm_lead_forward_to_partner, self).default_get(cr, uid, fields, context=context)
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_partner_assign/wizard/crm_forward_to_partner_view.xml b/addons/crm_partner_assign/wizard/crm_forward_to_partner_view.xml
index 8bdb03cf962..645c729b164 100644
--- a/addons/crm_partner_assign/wizard/crm_forward_to_partner_view.xml
+++ b/addons/crm_partner_assign/wizard/crm_forward_to_partner_view.xml
@@ -35,7 +35,7 @@
-
+
@@ -45,7 +45,7 @@
-
+
@@ -61,56 +61,14 @@
-
- crm.new.mass.forward.mail.form
- crm.lead.mass.forward.to.partner
- form
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/addons/crm_profiling/__openerp__.py b/addons/crm_profiling/__openerp__.py
index 656f8360f0b..19f5615ee78 100644
--- a/addons/crm_profiling/__openerp__.py
+++ b/addons/crm_profiling/__openerp__.py
@@ -21,7 +21,7 @@
{
- 'name': 'Profiling Tools',
+ 'name': 'Customer Profiling',
'version': '1.3',
'category': 'Marketing',
'complexity': "easy",
@@ -41,7 +41,9 @@ It also has been merged with the earlier CRM & SRM segmentation tool because the
'init_xml': [],
'update_xml': ['security/ir.model.access.csv', 'crm_profiling_view.xml'],
'demo_xml': ['crm_profiling_demo.xml'],
- 'test': ['test/test_crm_profiling.yml'],
+ 'test': [
+ #'test/process/profiling.yml', #TODO:It's not debuging because problem to write data for open.questionnaire from partner section.
+ ],
'installable': True,
'active': False,
'certificate': '0033984979005',
diff --git a/addons/crm_profiling/crm_profiling_demo.xml b/addons/crm_profiling/crm_profiling_demo.xml
index 1789e8bace8..6a0ca130ec3 100644
--- a/addons/crm_profiling/crm_profiling_demo.xml
+++ b/addons/crm_profiling/crm_profiling_demo.xml
@@ -102,7 +102,7 @@
Profiles / crm.segmentation
-->
-
+
OpenERP partners
@@ -111,22 +111,23 @@
Bronze partners
-
+
True
Silver partners
-
+
True
Gold partners
-
+
+ True
True
diff --git a/addons/crm_profiling/security/ir.model.access.csv b/addons/crm_profiling/security/ir.model.access.csv
index 43e1528fddb..24fd7009c6a 100644
--- a/addons/crm_profiling/security/ir.model.access.csv
+++ b/addons/crm_profiling/security/ir.model.access.csv
@@ -1,7 +1,7 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_crm_profiling_answer_salesman","crm_profiling.answer.salesman","model_crm_profiling_answer","base.group_sale_salesman",1,1,1,0
-"access_crm_profiling_answer_manager","crm_profiling.answer.manager","model_crm_profiling_answer","base.group_sale_manager",1,1,1,1
-"access_crm_profiling_question_salesman","crm_profiling.question.salesman","model_crm_profiling_question","base.group_sale_salesman",1,1,1,0
-"access_crm_profiling_question_manager","crm_profiling.question.manager","model_crm_profiling_question","base.group_sale_manager",1,1,1,1
-"access_crm_profiling_questionnarie_salesman","crm_profiling.questionnarie.salesman","model_crm_profiling_questionnaire","base.group_sale_salesman",1,1,1,0
-"access_crm_profiling_questionnarie_manager","crm_profiling.questionnarie.manager","model_crm_profiling_questionnaire","base.group_sale_manager",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_crm_profiling_answer_salesman,crm_profiling.answer.salesman,model_crm_profiling_answer,base.group_sale_salesman,1,1,1,0
+access_crm_profiling_answer_manager,crm_profiling.answer.manager,model_crm_profiling_answer,base.group_sale_manager,1,1,1,1
+access_crm_profiling_question_salesman,crm_profiling.question.salesman,model_crm_profiling_question,base.group_sale_salesman,1,1,1,0
+access_crm_profiling_question_manager,crm_profiling.question.manager,model_crm_profiling_question,base.group_sale_manager,1,1,1,1
+access_crm_profiling_questionnarie_salesman,crm_profiling.questionnarie.salesman,model_crm_profiling_questionnaire,base.group_sale_salesman,1,1,1,0
+access_crm_profiling_questionnarie_manager,crm_profiling.questionnarie.manager,model_crm_profiling_questionnaire,base.group_sale_manager,1,1,1,1
diff --git a/addons/crm_profiling/test/process/profiling.yml b/addons/crm_profiling/test/process/profiling.yml
new file mode 100644
index 00000000000..91c48410f8d
--- /dev/null
+++ b/addons/crm_profiling/test/process/profiling.yml
@@ -0,0 +1,10 @@
+-
+ I check segmentation which allows users to perform segmentation within partners
+ and set the category according to question, so first compute questions(answers)
+ scenario with parther and check that category set according to questions.
+-
+ !python {model: res.partner}: |
+ data ={'form': {'quest_form3': ref("partner_quality3"), 'quest_form2': ref("nb_employees2"),'quest_form1': ref("sector1"),'questionnaire_name': ref('questionnaire1')}, 'ids': [ref('base.res_partner_ericdubois0')], 'report_type': 'pdf', 'model': 'res.partner', 'id': ref('base.res_partner_ericdubois0')}
+ data = self._questionnaire_compute(cr, uid, data, context)
+ partner = self.browse(cr, uid, ref('base.res_partner_ericdubois0'))
+ assert partner.category_id[0].id == ref("base.res_partner_category_17"), "Category not assign properly"
diff --git a/addons/crm_profiling/test/test_crm_profiling.yml b/addons/crm_profiling/test/test_crm_profiling.yml
deleted file mode 100644
index 2b70cac592b..00000000000
--- a/addons/crm_profiling/test/test_crm_profiling.yml
+++ /dev/null
@@ -1,77 +0,0 @@
-- |
- I check segmentation which allows users to perform segmentation within partners.
--
- I create a crm profiling question record.
--
- !record {model: crm_profiling.question, id: crm_profiling_question_openerppartner0}:
- answers_ids:
- - name: 'no'
- name: OpenERP partner?
--
- I create a crm profiling answer record.
--
- !record {model: crm_profiling.answer, id: crm_profiling_answer_openerppartner0}:
- name: 'yes'
- question_id: crm_profiling_question_openerppartner0
--
- I create Partner category Customers.
--
- !record {model: res.partner.category, id: res_partner_category_customers0}:
- name: Customers
-- |
- I'm creating new partner "John" with his email "info@mycustomer.com".
--
- !record {model: res.partner, id: res_partner_john0}:
- address:
- - city: Bruxelles
- country_id: base.be
- street: Rue des Palais 51, bte 33
- type: default
- zip: '1000'
- email: 'info@mycustomer.com'
- name: John
- category_id:
- - res_partner_category_customers0
- answers_ids:
- - crm_profiling_answer_openerppartner0
-
--
- Define the answers and category to partner.
--
- !python {model: res.partner}: |
- data ={'form': {'questionnaire_name': ref('res_partner_john0')}, 'ids': [ref('res_partner_john0')], 'report_type': 'pdf', 'model': 'res.partner', 'id': ref('res_partner_john0')}
- self._questionnaire_compute(cr, uid, data, context)
-- |
- I start by creating new Questionnaire.
--
- !record {model: crm_profiling.questionnaire, id: crm_profiling_questionnaire_basequestionnaire0}:
- description: First questionnaire.
- name: Base questionnaire
- questions_ids:
- - crm_profiling.activity_sector
- - crm_profiling.nb_employees
- - crm_profiling.partner_level
-- |
- I create the form for the "Base questionnaire".
--
- !python {model: crm_profiling.questionnaire}: |
- context.update({'active_id':ref('res_partner_john0')})
- data ={'form': {'questionnaire_name': ref('res_partner_john0')}, 'ids': [ref('res_partner_john0')], 'report_type': 'pdf', 'model': 'res.partner', 'id': ref('res_partner_john0')}
- self.build_form(cr, uid, data, context)
--
- I create a segmentation record.
--
- !record {model: crm.segmentation, id: crm_segmentation_test1}:
- answer_yes:
- - crm_profiling_answer_openerppartner0
- categ_id: res_partner_category_customers0
- name: test
- parent_id: crm_profiling.crm_segmentation0
- profiling_active: true
- som_interval: 0.0
-- |
- I continue the process of segmentation.
--
- !python {model: crm.segmentation}: |
- self.process_continue(cr, uid, [ref('crm_segmentation_test1')], start=False)
-
diff --git a/addons/crm_todo/__init__.py b/addons/crm_todo/__init__.py
index 891c71db7ff..528f4b2d439 100644
--- a/addons/crm_todo/__init__.py
+++ b/addons/crm_todo/__init__.py
@@ -20,3 +20,5 @@
##############################################################################
import crm_todo
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_todo/__openerp__.py b/addons/crm_todo/__openerp__.py
index f56e95281fd..d3d205ec9c0 100644
--- a/addons/crm_todo/__openerp__.py
+++ b/addons/crm_todo/__openerp__.py
@@ -21,9 +21,10 @@
{
- 'name': 'To Do List for CRM',
+ 'name': 'Tasks on CRM',
'version': '1.0',
- 'category': 'Sales',
+ "category": 'Customer Relationship Management',
+ 'complexity': "easy",
'description': """
Todo list for CRM leads and opportunities.
""",
@@ -35,4 +36,8 @@ Todo list for CRM leads and opportunities.
'demo': [
'crm_todo_demo.xml',
],
+ 'installable': True,
+ 'active': False,
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_todo/crm_todo.py b/addons/crm_todo/crm_todo.py
index ba7445ecef1..b1f6aa05af0 100644
--- a/addons/crm_todo/crm_todo.py
+++ b/addons/crm_todo/crm_todo.py
@@ -35,3 +35,5 @@ class crm_todo(osv.osv):
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_todo/crm_todo_view.xml b/addons/crm_todo/crm_todo_view.xml
index 94d5b1a0cbe..c098f908b8a 100644
--- a/addons/crm_todo/crm_todo_view.xml
+++ b/addons/crm_todo/crm_todo_view.xml
@@ -46,13 +46,15 @@
- Todo List
+ My Tasks
project.task
- {'set_editable':True,'set_visible':True,'gtd':True,'user_invisible':True, 'search_default_user_id':uid, "search_default_current": 1, "search_default_open": 1, "lead_id": 1}
+ {'set_editable':True,'set_visible':True,'gtd':True,'user_invisible':True, "search_default_open": 1, "lead_id": 1}
+
+ [('user_id','=',uid)]
form
tree,form,calendar,gantt,graph,kanban
-
diff --git a/addons/decimal_precision/__init__.py b/addons/decimal_precision/__init__.py
index 708ad26bbe1..ea6c1b4d1ca 100644
--- a/addons/decimal_precision/__init__.py
+++ b/addons/decimal_precision/__init__.py
@@ -22,3 +22,5 @@
#import decimal_precision
from decimal_precision import get_precision
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/decimal_precision/__openerp__.py b/addons/decimal_precision/__openerp__.py
index b8ac25eb379..0aafef9fe1f 100644
--- a/addons/decimal_precision/__openerp__.py
+++ b/addons/decimal_precision/__openerp__.py
@@ -30,7 +30,7 @@ The decimal precision is configured per company.
"author": "OpenERP SA",
"version": "0.1",
"depends": ["base"],
- "category" : "Hidden",
+ "category" : "Hidden/Dependency",
'complexity': "easy",
"init_xml": [],
"update_xml": [
@@ -44,3 +44,5 @@ The decimal precision is configured per company.
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/decimal_precision/security/ir.model.access.csv b/addons/decimal_precision/security/ir.model.access.csv
index d53a5fef141..aa203eae141 100644
--- a/addons/decimal_precision/security/ir.model.access.csv
+++ b/addons/decimal_precision/security/ir.model.access.csv
@@ -1,3 +1,3 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_decimal_precision_config","decimal.precision configuration","model_decimal_precision",base.group_system,1,1,1,1
-"access_decimal_precision_all","decimal.precision","model_decimal_precision",,1,0,0,0
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_decimal_precision_config,decimal.precision configuration,model_decimal_precision,base.group_system,1,1,1,1
+access_decimal_precision_all,decimal.precision,model_decimal_precision,,1,0,0,0
diff --git a/addons/delivery/delivery_view.xml b/addons/delivery/delivery_view.xml
index deb13679355..c46253777d2 100644
--- a/addons/delivery/delivery_view.xml
+++ b/addons/delivery/delivery_view.xml
@@ -233,7 +233,7 @@
tree,form
[('invoice_state','=','2binvoiced'),('state','=','done'),('type','=','out')]
- {'contact_display': 'partner'}
+ {'default_invoice_state': '2binvoiced', 'default_type': 'out', 'contact_display': 'partner'}
diff --git a/addons/delivery/i18n/cs.po b/addons/delivery/i18n/cs.po
index b703e4b42c8..7cb6f787ed1 100644
--- a/addons/delivery/i18n/cs.po
+++ b/addons/delivery/i18n/cs.po
@@ -4,111 +4,112 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.4\n"
+"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2009-02-03 19:47+0000\n"
-"Last-Translator: Fabien (Open ERP) \n"
-"Language-Team: \n"
+"PO-Revision-Date: 2011-11-25 14:16+0000\n"
+"Last-Translator: Jiří Hajda \n"
+"Language-Team: Czech \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:55+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-11-26 05:49+0000\n"
+"X-Generator: Launchpad (build 14381)\n"
+"X-Poedit-Language: Czech\n"
#. module: delivery
#: report:sale.shipping:0
msgid "Order Ref."
-msgstr ""
+msgstr "Odkaz objednávky"
#. module: delivery
#: model:product.template,name:delivery.delivery_product_product_template
msgid "Delivery by Poste"
-msgstr ""
+msgstr "Dodání podle zaslání"
#. module: delivery
#: view:delivery.grid:0
msgid "Destination"
-msgstr ""
+msgstr "Cíl"
#. module: delivery
#: field:stock.move,weight_net:0
msgid "Net weight"
-msgstr ""
+msgstr "Čistá hmotnost"
#. module: delivery
#: view:stock.picking:0
msgid "Delivery Order"
-msgstr ""
+msgstr "Objednávka doručení"
#. module: delivery
#: code:addons/delivery/delivery.py:141
#, python-format
msgid "No price available !"
-msgstr ""
+msgstr "Žádná dostupná cena !"
#. module: delivery
#: model:ir.model,name:delivery.model_delivery_grid_line
msgid "Delivery Grid Line"
-msgstr ""
+msgstr "Řádek dodací sítě"
#. module: delivery
#: view:delivery.grid:0
msgid "Delivery grids"
-msgstr ""
+msgstr "Dodací sítě"
#. module: delivery
#: selection:delivery.grid.line,type:0
#: selection:delivery.grid.line,variable_factor:0
#: field:stock.picking,volume:0
msgid "Volume"
-msgstr ""
+msgstr "Objem"
#. module: delivery
#: sql_constraint:sale.order:0
msgid "Order Reference must be unique !"
-msgstr ""
+msgstr "Odkaz objednávky musí být jedinečný !"
#. module: delivery
#: field:delivery.grid,line_ids:0
msgid "Grid Line"
-msgstr ""
+msgstr "Řádek sítě"
#. module: delivery
#: model:ir.actions.report.xml,name:delivery.report_shipping
msgid "Delivery order"
-msgstr ""
+msgstr "Objednávka doručení"
#. module: delivery
#: view:res.partner:0
msgid "Deliveries Properties"
-msgstr ""
+msgstr "Vlastnosti doručení"
#. module: delivery
#: model:ir.actions.act_window,name:delivery.action_picking_tree4
msgid "Picking to be invoiced"
-msgstr ""
+msgstr "Navádění k fakturaci"
#. module: delivery
#: help:delivery.grid,sequence:0
msgid "Gives the sequence order when displaying a list of delivery grid."
-msgstr ""
+msgstr "Dává pořadí posloupnosti, když zobrazuje seznam dodací sítě."
#. module: delivery
#: view:delivery.grid:0
#: field:delivery.grid,country_ids:0
msgid "Countries"
-msgstr ""
+msgstr "Země"
#. module: delivery
#: report:sale.shipping:0
msgid "Delivery Order :"
-msgstr ""
+msgstr "Objednávka doručení :"
#. module: delivery
#: field:delivery.grid.line,variable_factor:0
msgid "Variable Factor"
-msgstr ""
+msgstr "Proměnný koeficient"
#. module: delivery
#: model:ir.actions.act_window,help:delivery.action_delivery_grid_form
@@ -118,11 +119,15 @@ msgid ""
"can define several price lists for one delivery method, per country or a "
"zone in a specific country defined by a postal code range."
msgstr ""
+"Ceník dodání vám umožní spočítat cenu a prodejní cenu přepravy podle "
+"hmotnosti výrobků a dalších kritérií. Můžete určit několik ceníků pro jednu "
+"dodací metodu podle země nebo zóny ve specifické zemi určené podle rozsahu "
+"počtovního kódu."
#. module: delivery
#: selection:delivery.grid.line,price_type:0
msgid "Fixed"
-msgstr ""
+msgstr "Pevné"
#. module: delivery
#: view:delivery.sale.order:0
@@ -137,23 +142,24 @@ msgstr "Způsob doručení"
#. module: delivery
#: model:ir.model,name:delivery.model_stock_move
msgid "Stock Move"
-msgstr ""
+msgstr "Přesun zásob"
#. module: delivery
#: code:addons/delivery/delivery.py:141
#, python-format
msgid "No line matched this order in the choosed delivery grids !"
msgstr ""
+"Neodpovídají žádné řádky této objednávce, pokud je vybrána dodací síť !"
#. module: delivery
#: field:stock.picking,carrier_tracking_ref:0
msgid "Carrier Tracking Ref"
-msgstr ""
+msgstr "Odkaz sledování přepravce"
#. module: delivery
#: field:stock.picking,weight_net:0
msgid "Net Weight"
-msgstr ""
+msgstr "Čistá hmotnost"
#. module: delivery
#: model:ir.actions.act_window,help:delivery.action_delivery_carrier_form
@@ -162,57 +168,60 @@ msgid ""
"Each delivery method can be assigned to a price list which computes the "
"price of the delivery according to the products sold or delivered."
msgstr ""
+"Vytvořit a spravovat dodací metody, které chcete pro vaše prodejní aktivity. "
+"Každá dodací metoda může být přiřazena k ceníku, který spočítá cenu přepravy "
+"podle výrobků prodaných nebo dodaných."
#. module: delivery
#: code:addons/delivery/stock.py:98
#, python-format
msgid "Warning"
-msgstr ""
+msgstr "Varování"
#. module: delivery
#: view:delivery.grid:0
msgid "Grid definition"
-msgstr ""
+msgstr "Určení sítě"
#. module: delivery
#: view:delivery.sale.order:0
msgid "_Cancel"
-msgstr ""
+msgstr "_Zrušit"
#. module: delivery
#: field:delivery.grid.line,operator:0
msgid "Operator"
-msgstr ""
+msgstr "Operátor"
#. module: delivery
#: model:ir.model,name:delivery.model_res_partner
msgid "Partner"
-msgstr ""
+msgstr "Partner"
#. module: delivery
#: model:ir.model,name:delivery.model_sale_order
msgid "Sales Order"
-msgstr ""
+msgstr "Prodejní objednávka"
#. module: delivery
#: model:ir.model,name:delivery.model_delivery_grid
msgid "Delivery Grid"
-msgstr ""
+msgstr "Dodací síť"
#. module: delivery
#: report:sale.shipping:0
msgid "Invoiced to"
-msgstr ""
+msgstr "Fakturováno"
#. module: delivery
#: model:ir.model,name:delivery.model_stock_picking
msgid "Picking List"
-msgstr ""
+msgstr "Naváděcí seznam"
#. module: delivery
#: model:ir.model,name:delivery.model_delivery_sale_order
msgid "Make Delievery"
-msgstr ""
+msgstr "Provést dodání"
#. module: delivery
#: model:ir.module.module,description:delivery.module_meta_information
@@ -224,16 +233,22 @@ msgid ""
"\n"
" "
msgstr ""
+"Umožní vám přidat dodací metody v prodejním příkazu a navádění.\n"
+" Můžete určit vaše ceny přepravce and dodací sítě.\n"
+" Když vytváříte faktury z navádění, OpenERP je schopný přidat a spočítat "
+"dodací řádky.\n"
+"\n"
+" "
#. module: delivery
#: view:delivery.grid.line:0
msgid "Grid Lines"
-msgstr ""
+msgstr "Řádky sítě"
#. module: delivery
#: field:delivery.grid.line,grid_id:0
msgid "Grid"
-msgstr ""
+msgstr "Síť"
#. module: delivery
#: help:delivery.grid,active:0
@@ -241,31 +256,33 @@ msgid ""
"If the active field is set to False, it will allow you to hide the delivery "
"grid without removing it."
msgstr ""
+"Pokud je aktivní pole nastaveno na Nepravda, umožní vám to skrýt dodací síť "
+"bez jejího odebrání."
#. module: delivery
#: field:delivery.grid,zip_to:0
msgid "To Zip"
-msgstr ""
+msgstr "Na PSČ"
#. module: delivery
#: report:sale.shipping:0
msgid "Order Date"
-msgstr ""
+msgstr "Datum objednání"
#. module: delivery
#: field:delivery.grid,name:0
msgid "Grid Name"
-msgstr ""
+msgstr "Jméno sítě"
#. module: delivery
#: view:stock.move:0
msgid "Weights"
-msgstr ""
+msgstr "Váhy"
#. module: delivery
#: field:stock.picking,number_of_packages:0
msgid "Number of Packages"
-msgstr ""
+msgstr "Počet balíků"
#. module: delivery
#: selection:delivery.grid.line,type:0
@@ -274,7 +291,7 @@ msgstr ""
#: field:stock.move,weight:0
#: field:stock.picking,weight:0
msgid "Weight"
-msgstr ""
+msgstr "Váha"
#. module: delivery
#: help:delivery.carrier,active:0
@@ -282,179 +299,181 @@ msgid ""
"If the active field is set to False, it will allow you to hide the delivery "
"carrier without removing it."
msgstr ""
+"Pokud je aktivní pole nastaveno na Nepravda, umožní vám to skrýt dodacího "
+"přepravce bez jeho odebrání."
#. module: delivery
#: code:addons/delivery/wizard/delivery_sale_order.py:95
#, python-format
msgid "No grid available !"
-msgstr ""
+msgstr "Žádná dostupná síť !"
#. module: delivery
#: selection:delivery.grid.line,operator:0
msgid ">="
-msgstr ""
+msgstr ">="
#. module: delivery
#: code:addons/delivery/wizard/delivery_sale_order.py:66
#: code:addons/delivery/wizard/delivery_sale_order.py:98
#, python-format
msgid "Order not in draft state !"
-msgstr ""
+msgstr "Objednávka není ve stavu koncept !"
#. module: delivery
#: constraint:res.partner:0
msgid "Error ! You can not create recursive associated members."
-msgstr ""
+msgstr "Chyba ! Nemůžete vytvořit rekurzivní asociované členy."
#. module: delivery
#: report:sale.shipping:0
msgid "Lot"
-msgstr ""
+msgstr "Dávka"
#. module: delivery
#: constraint:stock.move:0
msgid "You try to assign a lot which is not from the same product"
-msgstr ""
+msgstr "Snažíte se přiřadit dávku, která není ze stejného výrobku"
#. module: delivery
#: field:delivery.carrier,active:0
#: field:delivery.grid,active:0
msgid "Active"
-msgstr ""
+msgstr "Aktivní"
#. module: delivery
#: report:sale.shipping:0
msgid "Shipping Date"
-msgstr ""
+msgstr "Datum expedice"
#. module: delivery
#: field:delivery.carrier,product_id:0
msgid "Delivery Product"
-msgstr ""
+msgstr "Dodání výrobku"
#. module: delivery
#: view:delivery.grid.line:0
msgid "Condition"
-msgstr ""
+msgstr "Podmínka"
#. module: delivery
#: field:delivery.grid.line,standard_price:0
msgid "Cost Price"
-msgstr ""
+msgstr "Výrobní cena"
#. module: delivery
#: selection:delivery.grid.line,price_type:0
#: field:delivery.grid.line,type:0
msgid "Variable"
-msgstr ""
+msgstr "Proměnné"
#. module: delivery
#: help:res.partner,property_delivery_carrier:0
msgid "This delivery method will be used when invoicing from picking."
-msgstr ""
+msgstr "Dodací metoda bude použita při fakturaci z nasvádění."
#. module: delivery
#: field:delivery.grid.line,max_value:0
msgid "Maximum Value"
-msgstr ""
+msgstr "Maximální hodnota"
#. module: delivery
#: report:sale.shipping:0
msgid "Quantity"
-msgstr ""
+msgstr "Množství"
#. module: delivery
#: field:delivery.grid,zip_from:0
msgid "Start Zip"
-msgstr ""
+msgstr "Počáteční PSČ"
#. module: delivery
#: help:sale.order,carrier_id:0
msgid ""
"Complete this field if you plan to invoice the shipping based on picking."
-msgstr ""
+msgstr "Vyplňte toto pole, pokud plánujete fakturovat přepravu při navádění."
#. module: delivery
#: field:delivery.carrier,partner_id:0
msgid "Carrier Partner"
-msgstr ""
+msgstr "Přepravní partner"
#. module: delivery
#: view:res.partner:0
msgid "Sales & Purchases"
-msgstr ""
+msgstr "Prodeje & Nákupy"
#. module: delivery
#: selection:delivery.grid.line,operator:0
msgid "<="
-msgstr ""
+msgstr "<="
#. module: delivery
#: constraint:stock.move:0
msgid "You must assign a production lot for this product"
-msgstr ""
+msgstr "Pro tento výrobek musíte přiřadit výrobní dávku."
#. module: delivery
#: view:delivery.sale.order:0
msgid "Create Deliveries"
-msgstr ""
+msgstr "Vytvořit dodání"
#. module: delivery
#: model:ir.actions.act_window,name:delivery.action_delivery_cost
#: view:sale.order:0
msgid "Delivery Costs"
-msgstr ""
+msgstr "Ceny dodání"
#. module: delivery
#: report:sale.shipping:0
msgid "Description"
-msgstr ""
+msgstr "Popis"
#. module: delivery
#: model:ir.actions.act_window,name:delivery.action_delivery_grid_form
#: model:ir.ui.menu,name:delivery.menu_action_delivery_grid_form
msgid "Delivery Pricelist"
-msgstr ""
+msgstr "Ceník dodání"
#. module: delivery
#: field:delivery.carrier,price:0
#: selection:delivery.grid.line,type:0
#: selection:delivery.grid.line,variable_factor:0
msgid "Price"
-msgstr ""
+msgstr "Cena"
#. module: delivery
#: code:addons/delivery/wizard/delivery_sale_order.py:95
#, python-format
msgid "No grid matching for this carrier !"
-msgstr ""
+msgstr "Žádná síť odpovídající tomuto přepravci !"
#. module: delivery
#: model:ir.ui.menu,name:delivery.menu_delivery
msgid "Delivery"
-msgstr ""
+msgstr "Dodací"
#. module: delivery
#: selection:delivery.grid.line,type:0
#: selection:delivery.grid.line,variable_factor:0
msgid "Weight * Volume"
-msgstr ""
+msgstr "Hmotnost * Objem"
#. module: delivery
#: selection:delivery.grid.line,operator:0
msgid "="
-msgstr ""
+msgstr "="
#. module: delivery
#: code:addons/delivery/stock.py:99
#, python-format
msgid "The carrier %s (id: %d) has no delivery grid!"
-msgstr ""
+msgstr "Přepravce %s (id: %d) nemá dodací síť!"
#. module: delivery
#: field:delivery.grid.line,name:0
msgid "Name"
-msgstr ""
+msgstr "Jméno"
#. module: delivery
#: view:delivery.carrier:0
@@ -464,55 +483,55 @@ msgstr ""
#: report:sale.shipping:0
#: field:stock.picking,carrier_id:0
msgid "Carrier"
-msgstr ""
+msgstr "Přepravce"
#. module: delivery
#: view:delivery.sale.order:0
msgid "_Apply"
-msgstr ""
+msgstr "_Použít"
#. module: delivery
#: field:sale.order,id:0
msgid "ID"
-msgstr ""
+msgstr "ID"
#. module: delivery
#: code:addons/delivery/wizard/delivery_sale_order.py:66
#: code:addons/delivery/wizard/delivery_sale_order.py:98
#, python-format
msgid "The order state have to be draft to add delivery lines."
-msgstr ""
+msgstr "Stav objednávky musí být koncept pro přidání dodacích řádků."
#. module: delivery
#: model:ir.module.module,shortdesc:delivery.module_meta_information
msgid "Carriers and deliveries"
-msgstr ""
+msgstr "Přepravci a doručení"
#. module: delivery
#: field:delivery.carrier,grids_id:0
msgid "Delivery Grids"
-msgstr ""
+msgstr "Dodací síť"
#. module: delivery
#: field:delivery.grid,sequence:0
msgid "Sequence"
-msgstr ""
+msgstr "Posloupnost"
#. module: delivery
#: field:delivery.grid.line,list_price:0
msgid "Sale Price"
-msgstr ""
+msgstr "Prodejní cena"
#. module: delivery
#: view:delivery.grid:0
#: field:delivery.grid,state_ids:0
msgid "States"
-msgstr ""
+msgstr "Stavy"
#. module: delivery
#: field:delivery.grid.line,price_type:0
msgid "Price Type"
-msgstr ""
+msgstr "Typ ceny"
#~ msgid "Cancel"
#~ msgstr "Storno"
diff --git a/addons/delivery/report/shipping.rml b/addons/delivery/report/shipping.rml
index 563c3bda826..1ed7e7098bc 100644
--- a/addons/delivery/report/shipping.rml
+++ b/addons/delivery/report/shipping.rml
@@ -131,19 +131,11 @@
Invoiced to
[[ o.sale_id and o.sale_id.partner_invoice_id and o.sale_id.partner_invoice_id.name or '']]
- [[ o.sale_id and o.sale_id.partner_invoice_id and o.sale_id.partner_invoice_id.street or '']]
- [[ (o.sale_id and o.sale_id.partner_invoice_id and o.sale_id.partner_invoice_id.street2) or removeParentNode('para')]]
- [[ o.sale_id and o.sale_id.partner_invoice_id and o.sale_id.partner_invoice_id.zip or '']] [[ o.sale_id and o.sale_id.partner_invoice_id and o.sale_id.partner_invoice_id.city or '' ]]
- [[ (o.sale_id and o.sale_id.partner_invoice_id and o.sale_id.partner_invoice_id.state_id and o.sale_id.partner_invoice_id.state_id.name) or removeParentNode('para') ]]
- [[ o.sale_id and o.sale_id.partner_invoice_id and o.sale_id.partner_invoice_id.country_id and o.sale_id.partner_invoice_id.country_id.name or '']]
+ [[ o.sale_id and o.sale_id.partner_invoice_id and display_address(o.sale_id.partner_invoice_id) ]]
[[ o.address_id and o.address_id.partner_id and o.address_id.partner_id.name or '' ]]
- [[ o.address_id and o.address_id.street or '']]
- [[ o.address_id and o.address_id.street2 or removeParentNode('para')]]
- [[ o.address_id and o.address_id.zip or '']] [[ o.address_id and o.address_id.city or '']]
- [[ (o.address_id and o.address_id.state_id and o.address_id.state_id.name) or removeParentNode('para') ]]
- [[ o.address_id and o.address_id.country_id and o.address_id.country_id.name or '']]
+ [[ o.address_id and o.address_id and display_address(o.address_id) ]]
diff --git a/addons/delivery/security/ir.model.access.csv b/addons/delivery/security/ir.model.access.csv
index 52e60995519..7403b55f618 100644
--- a/addons/delivery/security/ir.model.access.csv
+++ b/addons/delivery/security/ir.model.access.csv
@@ -1,8 +1,8 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_delivery_carrier","delivery.carrier","model_delivery_carrier","base.group_sale_salesman",1,0,0,0
-"access_delivery_grid","delivery.grid","model_delivery_grid","base.group_sale_salesman",1,0,0,0
-"access_delivery_grid_line","delivery.grid.line","model_delivery_grid_line","base.group_sale_salesman",1,0,0,0
-"access_delivery_carrier_manager","delivery.carrier","model_delivery_carrier","base.group_sale_manager",1,1,1,1
-"access_delivery_grid_manager","delivery.grid","model_delivery_grid","base.group_sale_manager",1,1,1,1
-"access_delivery_grid_line_manager","delivery.grid.line","model_delivery_grid_line","base.group_sale_manager",1,1,1,1
-"access_delivery_carrier_partner_manager","delivery.carrier partner_manager","model_delivery_carrier","base.group_partner_manager",1,0,0,0
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_delivery_carrier,delivery.carrier,model_delivery_carrier,base.group_sale_salesman,1,0,0,0
+access_delivery_grid,delivery.grid,model_delivery_grid,base.group_sale_salesman,1,0,0,0
+access_delivery_grid_line,delivery.grid.line,model_delivery_grid_line,base.group_sale_salesman,1,0,0,0
+access_delivery_carrier_manager,delivery.carrier,model_delivery_carrier,base.group_sale_manager,1,1,1,1
+access_delivery_grid_manager,delivery.grid,model_delivery_grid,base.group_sale_manager,1,1,1,1
+access_delivery_grid_line_manager,delivery.grid.line,model_delivery_grid_line,base.group_sale_manager,1,1,1,1
+access_delivery_carrier_partner_manager,delivery.carrier partner_manager,model_delivery_carrier,base.group_partner_manager,1,0,0,0
diff --git a/addons/document/__openerp__.py b/addons/document/__openerp__.py
index 6b9cbd21f48..0a403dcaa35 100644
--- a/addons/document/__openerp__.py
+++ b/addons/document/__openerp__.py
@@ -21,7 +21,7 @@
{
- 'name': 'Integrated Document Management System',
+ 'name': 'Document Management System',
'version': '2.1',
'category': 'Knowledge Management',
'complexity': "normal",
diff --git a/addons/document/board_document_view.xml b/addons/document/board_document_view.xml
index 8d80b4a1497..e3b1b4c9c64 100644
--- a/addons/document/board_document_view.xml
+++ b/addons/document/board_document_view.xml
@@ -7,30 +7,18 @@
form
-
-
-
+
+
-
+
+
-
-
-
-
-
-
-
+
+
@@ -70,26 +58,23 @@
form
-
-
-
+
+
-
-
-
+
+
-
-
-
+
+
diff --git a/addons/document/dict_tools.py b/addons/document/dict_tools.py
index 10d2fdc69f3..e117b429f83 100644
--- a/addons/document/dict_tools.py
+++ b/addons/document/dict_tools.py
@@ -55,3 +55,5 @@ def dict_filter(srcdic, keys, res=None):
return res
#eof
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document/directory_content.py b/addons/document/directory_content.py
index e690e50d4b4..5b8ec3ddd93 100644
--- a/addons/document/directory_content.py
+++ b/addons/document/directory_content.py
@@ -120,4 +120,5 @@ class document_directory_content(osv.osv):
return pdf
document_directory_content()
-#eof
\ No newline at end of file
+#eof
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document/directory_report.py b/addons/document/directory_report.py
index 2726fcd5462..202725a1d3f 100644
--- a/addons/document/directory_report.py
+++ b/addons/document/directory_report.py
@@ -60,3 +60,5 @@ class ir_action_report_xml(osv.osv):
}
ir_action_report_xml()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document/document.py b/addons/document/document.py
index 774c4e53a80..9ea7f97a321 100644
--- a/addons/document/document.py
+++ b/addons/document/document.py
@@ -132,7 +132,7 @@ class document_file(osv.osv):
# fields used for file storage
'store_fname': fields.char('Stored Filename', size=200),
}
- _order = "create_date desc"
+ _order = "id desc"
def __get_def_directory(self, cr, uid, context=None):
dirobj = self.pool.get('document.directory')
@@ -254,7 +254,6 @@ class document_file(osv.osv):
del vals['file_size']
if ids and vals:
result = super(document_file,self).write(cr, uid, ids, vals, context=context)
- cr.commit() # ?
return result
def create(self, cr, uid, vals, context=None):
@@ -299,7 +298,6 @@ class document_file(osv.osv):
else:
#raise osv.except_osv(_('ValidateError'), _('File name must be unique!'))
result = super(document_file, self).create(cr, uid, vals, context)
- cr.commit() # ?
return result
def __get_partner_id(self, cr, uid, res_model, res_id, context=None):
@@ -349,3 +347,5 @@ class document_file(osv.osv):
document_file()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document/document_directory.py b/addons/document/document_directory.py
index 2a3f54f53ba..d09d2cc86d5 100644
--- a/addons/document/document_directory.py
+++ b/addons/document/document_directory.py
@@ -307,3 +307,5 @@ class document_directory_node(osv.osv):
'directory_id': fields.many2one('document.directory', 'Document directory', ondelete="set null"),
}
document_directory_node()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document/document_storage.py b/addons/document/document_storage.py
index b61b7fd65fc..fe757e7876d 100644
--- a/addons/document/document_storage.py
+++ b/addons/document/document_storage.py
@@ -786,3 +786,5 @@ document_storage()
#eof
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document/document_view.xml b/addons/document/document_view.xml
index 7564dfc938e..05e49ae89ad 100644
--- a/addons/document/document_view.xml
+++ b/addons/document/document_view.xml
@@ -372,7 +372,6 @@
Browse Files
-
@@ -414,6 +413,7 @@
diff --git a/addons/document/nodes.py b/addons/document/nodes.py
index 0c4194847c1..ee89f3d4c6c 100644
--- a/addons/document/nodes.py
+++ b/addons/document/nodes.py
@@ -1557,4 +1557,5 @@ class nodefd_static(StringIO, node_descriptor):
cr.close()
StringIO.close(self)
-#eof
\ No newline at end of file
+#eof
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document/report/__init__.py b/addons/document/report/__init__.py
index bfdeacdaae8..f5b827f04b0 100644
--- a/addons/document/report/__init__.py
+++ b/addons/document/report/__init__.py
@@ -18,4 +18,6 @@
# along with this program. If not, see .
#
##############################################################################
-import document_report
\ No newline at end of file
+import document_report
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document/report/document_report_view.xml b/addons/document/report/document_report_view.xml
index e7fa4efb5be..e6e1847cd56 100644
--- a/addons/document/report/document_report_view.xml
+++ b/addons/document/report/document_report_view.xml
@@ -120,14 +120,6 @@
-
- Files by Resource Type
- report.document.user
-
- form
- graph,tree
-
-
diff --git a/addons/document/security/ir.model.access.csv b/addons/document/security/ir.model.access.csv
index d840055e89a..36f0aa86dff 100644
--- a/addons/document/security/ir.model.access.csv
+++ b/addons/document/security/ir.model.access.csv
@@ -1,25 +1,25 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_document_directory_all","document.directory all","model_document_directory",,1,0,0,0
-"access_document_directory_group_document_manager","document.directory document manager","model_document_directory","base.group_system",1,1,1,1
-"access_document_directory_group_knowledge","document.directory modify","model_document_directory","base.group_document_user",1,1,1,1
-"access_document_directory_content_all","document.directory.content all","model_document_directory_content",,1,0,0,0
-"access_document_directory_content_group_document_manager","document.directory.content document manager","model_document_directory_content","base.group_system",1,1,1,1
-"access_document_directory_content_type_group_document_manager","document.directory.content.type document manager","model_document_directory_content_type","base.group_system",1,1,1,1
-"access_document_directory_content_type_group_system","document.directory.content.type group system","model_document_directory_content_type","base.group_user",1,0,0,0
-"access_document_storage_group_document_manager","document.storage document manager","model_document_storage","base.group_system",1,1,1,1
-"access_document_storage_group_system","document.storage group system","model_document_storage","base.group_user",1,0,0,0
-"access_document_storage_group_user","document.storage group user","model_document_storage","base.group_document_user",1,1,1,1
-"access_ir_attachment_group_user","ir.attachment user","base.model_ir_attachment","base.group_document_user",1,1,1,1
-"access_ir_attachment_group_system","ir.attachment system","base.model_ir_attachment","base.group_system",1,0,0,0
-"access_res_partner_group_user","res.partner user","base.model_res_partner","base.group_document_user",1,1,1,0
-"access_document_directory_dctx_all","document.directory.dctx all","model_document_directory_dctx",,1,0,0,0
-"access_document_directory_dctx_group_document_manager","document.directory.dctx document manager","model_document_directory_dctx","base.group_system",1,1,1,1
-"access_report_document_user_group_document_manager","report.document.user document manager","model_report_document_user","base.group_system",1,0,0,0
-"access_report_files_partner_group_document_manager","report.files.partner document manager","model_report_files_partner","base.group_system",1,0,0,0
-"access_report_document_file_group_document_manager","report.document.file document manager","model_report_document_file","base.group_system",1,0,0,0
-"access_report_document_wall_group_document_manager","report.document.wall document manager","model_report_document_wall","base.group_system",1,0,0,0
-"access_report_document_wall_group_system","report.document.wall group system","model_report_document_wall","base.group_system",1,0,0,0
-"access_report_files_partner_group_document","report.files.partner document manager","model_report_files_partner","base.group_document_user",1,0,0,0
-"access_report_document_file_group_document","report.document.file document manager","model_report_document_file","base.group_document_user",1,0,0,0
-"access_report_document_wall_group_document","report.document.wall document manager","model_report_document_wall","base.group_document_user",1,0,0,0
-"access_report_document_user_knowledgeuser","report.document.user knowledgeuser","document.model_report_document_user","base.group_document_user",1,0,0,0
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_document_directory_all,document.directory all,model_document_directory,,1,0,0,0
+access_document_directory_group_document_manager,document.directory document manager,model_document_directory,base.group_system,1,1,1,1
+access_document_directory_group_knowledge,document.directory modify,model_document_directory,base.group_document_user,1,1,1,1
+access_document_directory_content_all,document.directory.content all,model_document_directory_content,,1,0,0,0
+access_document_directory_content_group_document_manager,document.directory.content document manager,model_document_directory_content,base.group_system,1,1,1,1
+access_document_directory_content_type_group_document_manager,document.directory.content.type document manager,model_document_directory_content_type,base.group_system,1,1,1,1
+access_document_directory_content_type_group_system,document.directory.content.type group system,model_document_directory_content_type,base.group_user,1,0,0,0
+access_document_storage_group_document_manager,document.storage document manager,model_document_storage,base.group_system,1,1,1,1
+access_document_storage_group_system,document.storage group system,model_document_storage,base.group_user,1,0,0,0
+access_document_storage_group_user,document.storage group user,model_document_storage,base.group_document_user,1,1,1,1
+access_ir_attachment_group_user,ir.attachment user,base.model_ir_attachment,base.group_document_user,1,1,1,1
+access_ir_attachment_group_system,ir.attachment system,base.model_ir_attachment,base.group_system,1,0,0,0
+access_res_partner_group_user,res.partner user,base.model_res_partner,base.group_document_user,1,1,1,0
+access_document_directory_dctx_all,document.directory.dctx all,model_document_directory_dctx,,1,0,0,0
+access_document_directory_dctx_group_document_manager,document.directory.dctx document manager,model_document_directory_dctx,base.group_system,1,1,1,1
+access_report_document_user_group_document_manager,report.document.user document manager,model_report_document_user,base.group_system,1,0,0,0
+access_report_files_partner_group_document_manager,report.files.partner document manager,model_report_files_partner,base.group_system,1,0,0,0
+access_report_document_file_group_document_manager,report.document.file document manager,model_report_document_file,base.group_system,1,0,0,0
+access_report_document_wall_group_document_manager,report.document.wall document manager,model_report_document_wall,base.group_system,1,0,0,0
+access_report_document_wall_group_system,report.document.wall group system,model_report_document_wall,base.group_system,1,0,0,0
+access_report_files_partner_group_document,report.files.partner document manager,model_report_files_partner,base.group_document_user,1,0,0,0
+access_report_document_file_group_document,report.document.file document manager,model_report_document_file,base.group_document_user,1,0,0,0
+access_report_document_wall_group_document,report.document.wall document manager,model_report_document_wall,base.group_document_user,1,0,0,0
+access_report_document_user_knowledgeuser,report.document.user knowledgeuser,document.model_report_document_user,base.group_document_user,1,0,0,0
diff --git a/addons/document/std_index.py b/addons/document/std_index.py
index 4f939aab4df..fe42cfb1795 100644
--- a/addons/document/std_index.py
+++ b/addons/document/std_index.py
@@ -209,3 +209,5 @@ cntIndex.register(OpenDoc())
#eof
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document/test/document_test2.yml b/addons/document/test/document_test2.yml
index 65312eaf10d..be91bfb3644 100644
--- a/addons/document/test/document_test2.yml
+++ b/addons/document/test/document_test2.yml
@@ -80,4 +80,3 @@
-
!python {model: document.directory}: |
self.unlink(cr, uid, [ref('dir_tests')])
- cr.commit()
diff --git a/addons/document/test_cindex.py b/addons/document/test_cindex.py
index 05101a7a491..a257c2c43a5 100755
--- a/addons/document/test_cindex.py
+++ b/addons/document/test_cindex.py
@@ -51,3 +51,5 @@ for fname in args:
print "Keyboard interrupt"
#eof
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document/wizard/__init__.py b/addons/document/wizard/__init__.py
index b143b583426..c4decc58fba 100644
--- a/addons/document/wizard/__init__.py
+++ b/addons/document/wizard/__init__.py
@@ -19,3 +19,5 @@
#
##############################################################################
import document_configuration
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document/wizard/document_configuration.py b/addons/document/wizard/document_configuration.py
index 97eda4e2d62..6a69e638b4e 100644
--- a/addons/document/wizard/document_configuration.py
+++ b/addons/document/wizard/document_configuration.py
@@ -110,3 +110,5 @@ class document_configuration(osv.osv_memory):
'ressource_tree': 1
})
document_configuration()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document_ftp/i18n/ar.po b/addons/document_ftp/i18n/ar.po
new file mode 100644
index 00000000000..d0483dce57c
--- /dev/null
+++ b/addons/document_ftp/i18n/ar.po
@@ -0,0 +1,135 @@
+# Arabic translation for openobject-addons
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2011-01-11 11:15+0000\n"
+"PO-Revision-Date: 2011-11-18 07:10+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Arabic \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-11-19 05:13+0000\n"
+"X-Generator: Launchpad (build 14299)\n"
+
+#. module: document_ftp
+#: model:ir.model,name:document_ftp.model_document_ftp_configuration
+msgid "Auto Directory Configuration"
+msgstr ""
+
+#. module: document_ftp
+#: view:document.ftp.configuration:0
+msgid ""
+"Indicate the network address on which your OpenERP server should be "
+"reachable for end-users. This depends on your network topology and "
+"configuration, and will only affect the links displayed to the users. The "
+"format is HOST:PORT and the default host (localhost) is only suitable for "
+"access from the server machine itself.."
+msgstr ""
+
+#. module: document_ftp
+#: field:document.ftp.configuration,progress:0
+msgid "Configuration Progress"
+msgstr ""
+
+#. module: document_ftp
+#: model:ir.actions.url,name:document_ftp.action_document_browse
+msgid "Browse Files"
+msgstr ""
+
+#. module: document_ftp
+#: field:document.ftp.configuration,config_logo:0
+msgid "Image"
+msgstr "الصورة"
+
+#. module: document_ftp
+#: field:document.ftp.configuration,host:0
+msgid "Address"
+msgstr "العنوان"
+
+#. module: document_ftp
+#: field:document.ftp.browse,url:0
+msgid "FTP Server"
+msgstr ""
+
+#. module: document_ftp
+#: model:ir.actions.act_window,name:document_ftp.action_config_auto_directory
+msgid "FTP Server Configuration"
+msgstr ""
+
+#. module: document_ftp
+#: model:ir.module.module,description:document_ftp.module_meta_information
+msgid ""
+"This is a support FTP Interface with document management system.\n"
+" With this module you would not only be able to access documents through "
+"OpenERP\n"
+" but you would also be able to connect with them through the file system "
+"using the\n"
+" FTP client.\n"
+msgstr ""
+
+#. module: document_ftp
+#: view:document.ftp.browse:0
+msgid "_Browse"
+msgstr ""
+
+#. module: document_ftp
+#: help:document.ftp.configuration,host:0
+msgid ""
+"Server address or IP and port to which users should connect to for DMS access"
+msgstr ""
+
+#. module: document_ftp
+#: model:ir.ui.menu,name:document_ftp.menu_document_browse
+msgid "Shared Repository (FTP)"
+msgstr ""
+
+#. module: document_ftp
+#: view:document.ftp.browse:0
+msgid "_Cancel"
+msgstr ""
+
+#. module: document_ftp
+#: view:document.ftp.configuration:0
+msgid "Configure FTP Server"
+msgstr ""
+
+#. module: document_ftp
+#: model:ir.module.module,shortdesc:document_ftp.module_meta_information
+msgid "Integrated FTP Server with Document Management System"
+msgstr ""
+
+#. module: document_ftp
+#: view:document.ftp.configuration:0
+msgid "title"
+msgstr ""
+
+#. module: document_ftp
+#: model:ir.model,name:document_ftp.model_document_ftp_browse
+msgid "Document FTP Browse"
+msgstr ""
+
+#. module: document_ftp
+#: view:document.ftp.configuration:0
+msgid "Knowledge Application Configuration"
+msgstr ""
+
+#. module: document_ftp
+#: model:ir.actions.act_window,name:document_ftp.action_ftp_browse
+msgid "Document Browse"
+msgstr ""
+
+#. module: document_ftp
+#: view:document.ftp.browse:0
+msgid "Browse Document"
+msgstr ""
+
+#. module: document_ftp
+#: view:document.ftp.configuration:0
+msgid "res_config_contents"
+msgstr ""
diff --git a/addons/document_ftp/security/ir.model.access.csv b/addons/document_ftp/security/ir.model.access.csv
index 0a6c192eb56..4a08a4aa60d 100644
--- a/addons/document_ftp/security/ir.model.access.csv
+++ b/addons/document_ftp/security/ir.model.access.csv
@@ -1,2 +1 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
diff --git a/addons/document_ftp/test/document_ftp_test2.yml b/addons/document_ftp/test/document_ftp_test2.yml
index 33ce1416ec8..eb86a99407d 100644
--- a/addons/document_ftp/test/document_ftp_test2.yml
+++ b/addons/document_ftp/test/document_ftp_test2.yml
@@ -100,11 +100,11 @@
fdata = StringIO('abcd')
ftp.storbinary('STOR test2.txt', fdata)
ftp.close()
- cr.commit()
-
I look for the "test2.txt" file at the server
-
!python {model: ir.attachment }: |
+ cr.rollback() # restart transaction to see changes (FTP-FS uses its own cursor)
ids = self.search(cr, uid, [('name', '=', 'test2.txt')])
assert ids, "No test2.txt file found."
-
@@ -116,11 +116,11 @@
ftp = te.get_ftp_folder(cr, uid, self, 'Documents')
ftp.delete('test2.txt')
ftp.close()
- cr.commit()
-
I check at the server that test2.txt is deleted
-
!python {model: ir.attachment }: |
+ cr.rollback() # restart transaction to see changes (FTP-FS uses its own cursor)
ids = self.search(cr, uid, [('name', '=', 'test2.txt')])
assert not ids, "test2.txt file can still be found."
-
@@ -133,7 +133,7 @@
fdata = StringIO('abcd')
ftp.storbinary('STOR test2.txt', fdata)
ftp.close()
- cr.commit()
+ cr.rollback() # restart transaction to see changes (FTP-FS uses its own cursor)
-
I delete the test2.txt from the server (RPC).
-
diff --git a/addons/document_ftp/test/document_ftp_test4.yml b/addons/document_ftp/test/document_ftp_test4.yml
index 0a3ff33333e..9b311f64605 100644
--- a/addons/document_ftp/test/document_ftp_test4.yml
+++ b/addons/document_ftp/test/document_ftp_test4.yml
@@ -4,7 +4,6 @@
!python {model: ir.attachment}: |
from document_ftp import test_easyftp as te
ftp = te.get_plain_ftp(timeout=1.0)
- cr.commit()
- |
I create two partners 'Partner1' and 'Partner2'.
I create three partner categories: 'none', 'pat1' and 'all'
@@ -54,7 +53,6 @@
dirs = ftp.nlst()
for dir in [ 'All Partner1+2', 'No partners', 'Pat 1' ]:
assert dir in dirs, "Dir %s not in folder" % dir
- cr.commit()
-
I create a 'partners' folder by the first resource one.
-
@@ -65,6 +63,8 @@
ressource_type_id: base.model_res_partner
domain: "[('category_id','in',[active_id])]"
ressource_parent_type_id : base.model_res_partner_category
+-
+ I commit (because FTP operations are on different transaction)
-
!python {model: document.directory, id: }: |
cr.commit()
@@ -81,7 +81,6 @@
for dir in correct:
res = ftp.nlst(dir+'/Partners of Test')
assert res == correct[dir], "Dir %s falsely contains %s" %(dir, res)
- cr.commit()
-
I create an ir.attachment, attached (not related) to Partner1
-
@@ -89,6 +88,11 @@
name: File of pat1
res_model: res.partner
res_id: !eval ref("tpartner1")
+-
+ I commit (because FTP operations are on different transaction)
+-
+ !python {model: document.directory, id: }: |
+ cr.commit()
-
I check that pat1/Partner1 folder has the file.
I check that all/Partner1 folder has the file
@@ -109,6 +113,7 @@
ftp = te.get_ftp_folder(cr, uid, self, 'Documents/Partners Testing/Pat 1/Partners of Test/Partner 1')
fdata = StringIO('abcd')
ftp.storbinary('STOR pat1-dynamic.txt', fdata)
+ cr.rollback() # restart transaction to see changes (FTP-FS uses its own cursor)
-
I check at the server that the file is attached to Partner1
-
@@ -159,7 +164,8 @@
from cStringIO import StringIO
ftp = te.get_ftp_folder(cr, uid, self, 'Documents/Partners Testing/Pat 1/Partners of Test/Partner 1')
ftp.delete('pat1-dynamic.txt')
- ftp.close()
+ ftp.close()
+ cr.rollback() # restart transaction to see changes (FTP-FS uses its own cursor)
-
I delete the Partners Testing folder, "File of pat1" file, Partner and Partner category.
@@ -177,5 +183,5 @@
partner_categ_pool.unlink(cr, uid, [ref('tpat_categ_all')])
partner_pool.unlink(cr, uid, [ref('tpartner1')])
partner_pool.unlink(cr, uid, [ref('tpartner_2')])
- cr.commit()
+ cr.commit() #required because all the operations via FTP were committed
diff --git a/addons/document_ftp/test_easyftp.py b/addons/document_ftp/test_easyftp.py
index 74890b1a333..16bace4b167 100644
--- a/addons/document_ftp/test_easyftp.py
+++ b/addons/document_ftp/test_easyftp.py
@@ -68,3 +68,5 @@ def get_ftp_fulldata(ftp, fname, limit=8192):
return ''.join(data)
#eof
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document_ftp/wizard/ftp_browse.py b/addons/document_ftp/wizard/ftp_browse.py
index 6e182082aeb..e8f127c3c3b 100644
--- a/addons/document_ftp/wizard/ftp_browse.py
+++ b/addons/document_ftp/wizard/ftp_browse.py
@@ -61,3 +61,5 @@ class document_ftp_browse(osv.osv_memory):
}
document_ftp_browse()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document_ftp/wizard/ftp_configuration.py b/addons/document_ftp/wizard/ftp_configuration.py
index 0ae133bb92a..5da2ddf11e8 100644
--- a/addons/document_ftp/wizard/ftp_configuration.py
+++ b/addons/document_ftp/wizard/ftp_configuration.py
@@ -48,3 +48,5 @@ class document_ftp_configuration(osv.osv_memory):
{'url': 'ftp://'+(conf.host or 'localhost:8021')+'/' + cr.dbname+'/'})
document_ftp_configuration()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document_ics/__openerp__.py b/addons/document_ics/__openerp__.py
index 7d718266d6a..115f5250cde 100644
--- a/addons/document_ics/__openerp__.py
+++ b/addons/document_ics/__openerp__.py
@@ -21,9 +21,9 @@
{
- 'name': 'Support for iCal based on Document Management System',
+ 'name': 'iCal Support',
'version': '1.0',
- 'category': 'Hidden',
+ 'category': 'Knowledge Management',
'complexity': "normal",
'description': """
Allows to synchronise calendars with others applications.
diff --git a/addons/document_ics/security/ir.model.access.csv b/addons/document_ics/security/ir.model.access.csv
index a89c5b296a7..73da3a1aaac 100644
--- a/addons/document_ics/security/ir.model.access.csv
+++ b/addons/document_ics/security/ir.model.access.csv
@@ -1,3 +1,3 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_document_directory_ics_fields_all","document.directory.ics.fields all","model_document_directory_ics_fields",,1,0,0,0
-"access_document_directory_ics_fields_manager","document.directory.ics.fields group system","model_document_directory_ics_fields","base.group_system",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_document_directory_ics_fields_all,document.directory.ics.fields all,model_document_directory_ics_fields,,1,0,0,0
+access_document_directory_ics_fields_manager,document.directory.ics.fields group system,model_document_directory_ics_fields,base.group_system,1,1,1,1
diff --git a/addons/document_webdav/__init__.py b/addons/document_webdav/__init__.py
index ac417e18087..7cd1a38fc80 100644
--- a/addons/document_webdav/__init__.py
+++ b/addons/document_webdav/__init__.py
@@ -24,4 +24,5 @@ import webdav_server
import document_webdav
-#eof
\ No newline at end of file
+#eof
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document_webdav/__openerp__.py b/addons/document_webdav/__openerp__.py
index 5576c17ba64..303f5c70e2c 100644
--- a/addons/document_webdav/__openerp__.py
+++ b/addons/document_webdav/__openerp__.py
@@ -72,3 +72,5 @@ which needs explicit configuration in openerp-server.conf, too.
"certificate" : "001236490750845657973",
'images': ['images/dav_properties.jpeg','images/directories_structure_principals.jpeg'],
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document_webdav/cache.py b/addons/document_webdav/cache.py
index 7f03aa6da13..95ff9d31f62 100644
--- a/addons/document_webdav/cache.py
+++ b/addons/document_webdav/cache.py
@@ -37,3 +37,5 @@ def memoize(maxsize):
return wrapper
return decorating_function
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document_webdav/dav_fs.py b/addons/document_webdav/dav_fs.py
index c167d90ba42..772b7600f20 100644
--- a/addons/document_webdav/dav_fs.py
+++ b/addons/document_webdav/dav_fs.py
@@ -1023,3 +1023,5 @@ class openerp_dav_handler(dav_interface):
if cr: cr.close()
#eof
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document_webdav/document_webdav.py b/addons/document_webdav/document_webdav.py
index f5fa7b591d8..da463c9eb1b 100644
--- a/addons/document_webdav/document_webdav.py
+++ b/addons/document_webdav/document_webdav.py
@@ -127,4 +127,5 @@ class dav_file_property(osv.osv):
dav_file_property()
-#eof
\ No newline at end of file
+#eof
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document_webdav/nodes.py b/addons/document_webdav/nodes.py
index 5927eade899..d6ceca458cd 100644
--- a/addons/document_webdav/nodes.py
+++ b/addons/document_webdav/nodes.py
@@ -400,3 +400,5 @@ node_descriptor = nodes.node_descriptor
#eof
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document_webdav/redirect.py b/addons/document_webdav/redirect.py
index 71af3271ab7..7bc0883f9e8 100644
--- a/addons/document_webdav/redirect.py
+++ b/addons/document_webdav/redirect.py
@@ -106,3 +106,5 @@ class RedirectHTTPHandler(HttpLogHandler, FixSendError, HttpOptions, HTTPHandler
#eof
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document_webdav/security/ir.model.access.csv b/addons/document_webdav/security/ir.model.access.csv
index 987f7a4f90a..fa81bcee2e2 100644
--- a/addons/document_webdav/security/ir.model.access.csv
+++ b/addons/document_webdav/security/ir.model.access.csv
@@ -1,5 +1,5 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_webdav_dir_property_all","webdav.dir.property all","model_document_webdav_dir_property",,1,0,0,0
-"access_webdav_dir_property_group_doc_manager","webdav.dir.property document manager","model_document_webdav_dir_property","base.group_system",1,1,1,1
-"access_webdav_dir_property_group_system","webdav.dir.property group system","model_document_webdav_dir_property","base.group_system",1,1,1,1
-"access_webdav_file_property_all","webdav.file.property all","model_document_webdav_file_property",,1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_webdav_dir_property_all,webdav.dir.property all,model_document_webdav_dir_property,,1,0,0,0
+access_webdav_dir_property_group_doc_manager,webdav.dir.property document manager,model_document_webdav_dir_property,base.group_system,1,1,1,1
+access_webdav_dir_property_group_system,webdav.dir.property group system,model_document_webdav_dir_property,base.group_system,1,1,1,1
+access_webdav_file_property_all,webdav.file.property all,model_document_webdav_file_property,,1,1,1,1
diff --git a/addons/document_webdav/test_davclient.py b/addons/document_webdav/test_davclient.py
index b4317282c6a..3c20cfed5b8 100755
--- a/addons/document_webdav/test_davclient.py
+++ b/addons/document_webdav/test_davclient.py
@@ -704,4 +704,5 @@ class DAVClient(object):
etag = m.getheader('ETag')
return etag or True
-#eof
\ No newline at end of file
+#eof
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document_webdav/webdav.py b/addons/document_webdav/webdav.py
index 3a68fb04fed..baa394e94a1 100644
--- a/addons/document_webdav/webdav.py
+++ b/addons/document_webdav/webdav.py
@@ -341,3 +341,5 @@ def create_prop(self):
REPORT.create_prop = create_prop
#eof
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document_webdav/webdav_server.py b/addons/document_webdav/webdav_server.py
index aeff0a23f25..81435a72137 100644
--- a/addons/document_webdav/webdav_server.py
+++ b/addons/document_webdav/webdav_server.py
@@ -649,3 +649,5 @@ init_principals_redirect()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/edi/__init__.py b/addons/edi/__init__.py
new file mode 100644
index 00000000000..b4a80c0f1dd
--- /dev/null
+++ b/addons/edi/__init__.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (c) 2011 OpenERP S.A.
+#
+# 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 .
+#
+##############################################################################
+import logging
+
+import models
+import edi_service
+from models.edi import EDIMixin, edi_document
+
+# web
+try:
+ import controllers
+except ImportError:
+ logging.getLogger('init.load').warn(
+ """Could not load openerp-web section of EDI, EDI will not behave correctly
+
+To fix, launch openerp-web in embedded mode""")
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/edi/__openerp__.py b/addons/edi/__openerp__.py
new file mode 100644
index 00000000000..07b189e501d
--- /dev/null
+++ b/addons/edi/__openerp__.py
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (c) 2011 OpenERP S.A.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+{
+ 'name': 'Electronic Data Interchange (EDI)',
+ 'version': '1.0',
+ 'category': 'Tools',
+ 'complexity': "easy",
+ 'description': """
+Provides a common EDI platform that other Applications can use
+==============================================================
+
+OpenERP specifies a generic EDI format for exchanging business
+documents between different systems, and provides generic
+mechanisms to import and export them.
+
+More details about OpenERP's EDI format may be found in the
+technical OpenERP documentation at http://doc.openerp.com
+ """,
+ 'author': 'OpenERP SA',
+ 'website': 'http://www.openerp.com',
+ 'depends': ['base', 'email_template'],
+ 'icon': '/edi/static/src/img/knowledge.png',
+ 'data': [
+ 'security/ir.model.access.csv',
+ ],
+ 'test': [
+ 'test/edi_partner_test.yml',
+ ],
+ 'js': [
+ 'static/src/js/edi.js',
+ ],
+ "css": [
+ "static/src/css/edi.css"
+ ],
+ 'installable': True,
+ 'active': False,
+ 'certificate': '002046536359186',
+}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/edi/controllers/__init__.py b/addons/edi/controllers/__init__.py
new file mode 100644
index 00000000000..9f828025b8e
--- /dev/null
+++ b/addons/edi/controllers/__init__.py
@@ -0,0 +1,3 @@
+import main
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/edi/controllers/main.py b/addons/edi/controllers/main.py
new file mode 100644
index 00000000000..83c3a1608e9
--- /dev/null
+++ b/addons/edi/controllers/main.py
@@ -0,0 +1,86 @@
+import json
+import textwrap
+
+import simplejson
+import werkzeug.wrappers
+
+import web.common.http as openerpweb
+import web.controllers.main
+
+class EDI(openerpweb.Controller):
+ # http://hostname:8069/edi/view?db=XXXX&token=XXXXXXXXXXX
+ # http://hostname:8069/edi/import_url?url=URIEncodedURL
+ _cp_path = "/edi"
+
+ def template(self, req, mods='web,edi'):
+ self.wc = openerpweb.controllers_path['/web/webclient']
+ d = {}
+ d["js"] = "\n".join(''%i for i in self.wc.manifest_list(req, mods, 'js'))
+ d["css"] = "\n".join(' '%i for i in self.wc.manifest_list(req, mods, 'css'))
+ d["modules"] = simplejson.dumps(mods.split(','))
+ return d
+
+ @openerpweb.httprequest
+ def view(self, req, db, token):
+ d = self.template(req)
+ d["init"] = 'new s.edi.EdiView(null,"%s","%s").appendTo($("body"));'%(db,token)
+ r = web.controllers.main.html_template % d
+ return r
+
+ @openerpweb.httprequest
+ def import_url(self, req, url):
+ d = self.template(req)
+ d["init"] = 'new s.edi.EdiImport(null,"%s").appendTo($("body"));'%(url)
+ r = web.controllers.main.html_template % d
+ return r
+
+ @openerpweb.httprequest
+ def download(self, req, db, token):
+ result = req.session.proxy('edi').get_edi_document(db, token)
+ response = werkzeug.wrappers.Response( result, headers=[('Content-Type', 'text/html; charset=utf-8'), ('Content-Length', len(result))])
+ return response
+
+ @openerpweb.httprequest
+ def download_attachment(self, req, db, token):
+ result = req.session.proxy('edi').get_edi_document(db, token)
+ doc = json.loads(result)[0]
+ attachment = doc['__attachments'] and doc['__attachments'][0]
+ if attachment:
+ result = attachment["content"].decode('base64')
+ import email.Utils as utils
+
+ # Encode as per RFC 2231
+ filename_utf8 = attachment['file_name']
+ filename_encoded = "%s=%s" % ('filename*',
+ utils.encode_rfc2231(filename_utf8, 'utf-8'))
+ response = werkzeug.wrappers.Response(result, headers=[('Content-Type', 'application/pdf'),
+ ('Content-Disposition', 'inline; ' + filename_encoded),
+ ('Content-Length', len(result))])
+ return response
+
+ @openerpweb.httprequest
+ def binary(self, req, db, token, field_path="company_address.logo", content_type='image/png'):
+ result = req.session.proxy('edi').get_edi_document(db, token)
+ doc = json.loads(result)[0]
+ for name in field_path.split("."):
+ doc = doc[name]
+ result = doc.decode('base64')
+ response = werkzeug.wrappers.Response(result, headers=[('Content-Type', content_type),
+ ('Content-Length', len(result))])
+ return response
+
+ @openerpweb.jsonrequest
+ def get_edi_document(self, req, db, token):
+ result = req.session.proxy('edi').get_edi_document(db, token)
+ return json.loads(result)
+
+ @openerpweb.jsonrequest
+ def import_edi_url(self, req, url):
+ result = req.session.proxy('edi').import_edi_url(req.session._db, req.session._uid, req.session._password, url)
+ if len(result) == 1:
+ return {"action": web.controllers.main.clean_action(req, result[0][2])}
+ return True
+
+#
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/edi/edi_service.py b/addons/edi/edi_service.py
new file mode 100644
index 00000000000..074720a03e9
--- /dev/null
+++ b/addons/edi/edi_service.py
@@ -0,0 +1,71 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (c) 2011 OpenERP S.A.
+#
+# 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 .
+#
+##############################################################################
+import logging
+
+import netsvc
+import openerp
+
+_logger = logging.getLogger('edi.service')
+
+class edi(netsvc.ExportService):
+
+ def __init__(self, name="edi"):
+ netsvc.ExportService.__init__(self, name)
+
+ def _edi_dispatch(self, db_name, method_name, *method_args):
+ try:
+ registry = openerp.modules.registry.RegistryManager.get(db_name)
+ assert registry, 'Unknown database %s' % db_name
+ edi_document = registry['edi.document']
+ cr = registry.db.cursor()
+ res = None
+ res = getattr(edi_document, method_name)(cr, *method_args)
+ cr.commit()
+ except Exception:
+ _logger.exception('Failed to execute EDI method %s with args %r', method_name, method_args)
+ raise
+ finally:
+ cr.close()
+ return res
+
+ def exp_get_edi_document(self, db_name, edi_token):
+ return self._edi_dispatch(db_name, 'get_document', 1, edi_token)
+
+ def exp_import_edi_document(self, db_name, uid, passwd, edi_document, context=None):
+ return self._edi_dispatch(db_name, 'import_edi', uid, edi_document, None)
+
+ def exp_import_edi_url(self, db_name, uid, passwd, edi_url, context=None):
+ return self._edi_dispatch(db_name, 'import_edi', uid, None, edi_url)
+
+ def dispatch(self, method, params):
+ if method in ['import_edi_document', 'import_edi_url']:
+ (db, uid, passwd ) = params[0:3]
+ openerp.service.security.check(db, uid, passwd)
+ elif method in ['get_edi_document']:
+ # No security check for these methods
+ pass
+ else:
+ raise KeyError("Method not found: %s" % method)
+ fn = getattr(self, 'exp_'+method)
+ return fn(*params)
+
+edi()
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/edi/models/__init__.py b/addons/edi/models/__init__.py
new file mode 100644
index 00000000000..a1e61299334
--- /dev/null
+++ b/addons/edi/models/__init__.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (c) 2011 OpenERP S.A.
+#
+# 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 .
+#
+##############################################################################
+
+import edi
+import res_partner
+import res_company
+import res_currency
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/edi/models/edi.py b/addons/edi/models/edi.py
new file mode 100644
index 00000000000..b8fc8699ca2
--- /dev/null
+++ b/addons/edi/models/edi.py
@@ -0,0 +1,684 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (c) 2011 OpenERP S.A.
+#
+# 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 .
+#
+##############################################################################
+
+import base64
+import hashlib
+import json
+import logging
+import re
+import threading
+import time
+import urllib2
+
+import openerp
+import openerp.release as release
+import netsvc
+import pooler
+from osv import osv,fields,orm
+from tools.translate import _
+from tools.safe_eval import safe_eval as eval
+
+EXTERNAL_ID_PATTERN = re.compile(r'^([^.:]+)(?::([^.]+))?\.(\S+)$')
+EDI_VIEW_WEB_URL = '%s/edi/view?debug=1&db=%s&token=%s'
+EDI_PROTOCOL_VERSION = 1 # arbitrary ever-increasing version number
+EDI_GENERATOR = 'OpenERP ' + release.major_version
+EDI_GENERATOR_VERSION = release.version_info
+
+def split_external_id(ext_id):
+ match = EXTERNAL_ID_PATTERN.match(ext_id)
+ assert match, \
+ _("'%s' is an invalid external ID") % (ext_id)
+ return {'module': match.group(1),
+ 'db_uuid': match.group(2),
+ 'id': match.group(3),
+ 'full': match.group(0)}
+
+def safe_unique_id(database_id, model, record_id):
+ """Generate a unique string to represent a (database_uuid,model,record_id) pair
+ without being too long, and with a very low probability of collisions.
+ """
+ msg = "%s-%s-%s-%s" % (time.time(), database_id, model, record_id)
+ digest = hashlib.sha1(msg).digest()
+ # fold the sha1 20 bytes digest to 9 bytes
+ digest = ''.join(chr(ord(x) ^ ord(y)) for (x,y) in zip(digest[:9], digest[9:-2]))
+ # b64-encode the 9-bytes folded digest to a reasonable 12 chars ASCII ID
+ digest = base64.urlsafe_b64encode(digest)
+ return '%s-%s' % (model.replace('.','_'), digest)
+
+def last_update_for(record):
+ """Returns the last update timestamp for the given record,
+ if available, otherwise False
+ """
+ if record._model._log_access:
+ record_log = record.perm_read()[0]
+ return record_log.get('write_date') or record_log.get('create_date') or False
+ return False
+
+_logger = logging.getLogger('edi')
+
+class edi_document(osv.osv):
+ _name = 'edi.document'
+ _description = 'EDI Document'
+ _columns = {
+ 'name': fields.char("EDI token", size = 128, help="Unique identifier for retrieving an EDI document."),
+ 'document': fields.text("Document", help="EDI document content")
+ }
+ _sql_constraints = [
+ ('name_uniq', 'unique (name)', 'EDI Tokens must be unique!')
+ ]
+
+ def new_edi_token(self, cr, uid, record):
+ """Return a new, random unique token to identify this model record,
+ and to be used as token when exporting it as an EDI document.
+
+ :param browse_record record: model record for which a token is needed
+ """
+ db_uuid = self.pool.get('ir.config_parameter').get_param(cr, uid, 'database.uuid')
+ edi_token = hashlib.sha256('%s-%s-%s-%s' % (time.time(), db_uuid, record._name, record.id)).hexdigest()
+ return edi_token
+
+ def serialize(self, edi_documents):
+ """Serialize the given EDI document structures (Python dicts holding EDI data),
+ using JSON serialization.
+
+ :param [dict] edi_documents: list of EDI document structures to serialize
+ :return: UTF-8 encoded string containing the serialized document
+ """
+ serialized_list = json.dumps(edi_documents)
+ return serialized_list
+
+ def generate_edi(self, cr, uid, records, context=None):
+ """Generates a final EDI document containing the EDI serialization
+ of the given records, which should all be instances of a Model
+ that has the :meth:`~.edi` mixin. The document is not saved in the
+ database, this is done by :meth:`~.export_edi`.
+
+ :param list(browse_record) records: records to export as EDI
+ :return: UTF-8 encoded string containing the serialized records
+ """
+ edi_list = []
+ for record in records:
+ record_model_obj = self.pool.get(record._name)
+ edi_list += record_model_obj.edi_export(cr, uid, [record], context=context)
+ return self.serialize(edi_list)
+
+ def get_document(self, cr, uid, edi_token, context=None):
+ """Retrieve the EDI document corresponding to the given edi_token.
+
+ :return: EDI document string
+ :raise: ValueError if requested EDI token does not match any know document
+ """
+ _logger.debug("get_document(%s)", edi_token)
+ edi_ids = self.search(cr, uid, [('name','=', edi_token)], context=context)
+ if not edi_ids:
+ raise ValueError('Invalid EDI token: %s' % edi_token)
+ edi = self.browse(cr, uid, edi_ids[0], context=context)
+ return edi.document
+
+ def load_edi(self, cr, uid, edi_documents, context=None):
+ """Import the given EDI document structures into the system, using
+ :meth:`~.import_edi`.
+
+ :param edi_documents: list of Python dicts containing the deserialized
+ version of EDI documents
+ :return: list of (model, id, action) tuple containing the model and database ID
+ of all records that were imported in the system, plus a suggested
+ action definition dict for displaying each document.
+ """
+ ir_module = self.pool.get('ir.module.module')
+ res = []
+ for edi_document in edi_documents:
+ module = edi_document.get('__import_module') or edi_document.get('__module')
+ assert module, 'a `__module` or `__import_module` attribute is required in each EDI document'
+ if module != 'base' and not ir_module.search(cr, uid, [('name','=',module),('state','=','installed')]):
+ raise osv.except_osv(_('Missing Application'),
+ _("The document you are trying to import requires the OpenERP `%s` application. "
+ "You can install it by connecting as the administrator and opening the configuration assistant.")%(module,))
+ model = edi_document.get('__import_model') or edi_document.get('__model')
+ assert model, 'a `__model` or `__import_model` attribute is required in each EDI document'
+ model_obj = self.pool.get(model)
+ assert model_obj, 'model `%s` cannot be found, despite module `%s` being available - '\
+ 'this EDI document seems invalid or unsupported' % (model,module)
+ record_id = model_obj.edi_import(cr, uid, edi_document, context=context)
+ record_action = model_obj._edi_record_display_action(cr, uid, record_id, context=context)
+ res.append((model, record_id, record_action))
+ return res
+
+ def deserialize(self, edi_documents_string):
+ """Return deserialized version of the given EDI Document string.
+
+ :param str|unicode edi_documents_string: UTF-8 string (or unicode) containing
+ JSON-serialized EDI document(s)
+ :return: Python object representing the EDI document(s) (usually a list of dicts)
+ """
+ return json.loads(edi_documents_string)
+
+ def export_edi(self, cr, uid, records, context=None):
+ """Export the given database records as EDI documents, stores them
+ permanently with a new unique EDI token, for later retrieval via :meth:`~.get_document`,
+ and returns the list of the new corresponding ``ir.edi.document`` records.
+
+ :param records: list of browse_record of any model
+ :return: list of IDs of the new ``ir.edi.document`` entries, in the same
+ order as the provided ``records``.
+ """
+ exported_ids = []
+ for record in records:
+ document = self.generate_edi(cr, uid, [record], context)
+ token = self.new_edi_token(cr, uid, record)
+ self.create(cr, uid, {
+ 'name': token,
+ 'document': document
+ }, context=context)
+ exported_ids.append(token)
+ return exported_ids
+
+ def import_edi(self, cr, uid, edi_document=None, edi_url=None, context=None):
+ """Import a JSON serialized EDI Document string into the system, first retrieving it
+ from the given ``edi_url`` if provided.
+
+ :param str|unicode edi_document: UTF-8 string or unicode containing JSON-serialized
+ EDI Document to import. Must not be provided if
+ ``edi_url`` is given.
+ :param str|unicode edi_url: URL where the EDI document (same format as ``edi_document``)
+ may be retrieved, without authentication.
+ """
+ if edi_url:
+ assert not edi_document, 'edi_document must not be provided if edi_url is given'
+ edi_document = urllib2.urlopen(edi_url).read()
+ assert edi_document, 'EDI Document is empty!'
+ edi_documents = self.deserialize(edi_document)
+ return self.load_edi(cr, uid, edi_documents, context=context)
+
+
+class EDIMixin(object):
+ """Mixin class for Model objects that want be exposed as EDI documents.
+ Classes that inherit from this mixin class should override the
+ ``edi_import()`` and ``edi_export()`` methods to implement their
+ specific behavior, based on the primitives provided by this mixin."""
+
+ def _edi_requires_attributes(self, attributes, edi_document):
+ model_name = edi_document.get('__imported_model') or edi_document.get('__model') or self._name
+ for attribute in attributes:
+ assert edi_document.get(attribute),\
+ 'Attribute `%s` is required in %s EDI documents' % (attribute, model_name)
+
+ # private method, not RPC-exposed as it creates ir.model.data entries as
+ # SUPERUSER based on its parameters
+ def _edi_external_id(self, cr, uid, record, existing_id=None, existing_module=None,
+ context=None):
+ """Generate/Retrieve unique external ID for ``record``.
+ Each EDI record and each relationship attribute in it is identified by a
+ unique external ID, which includes the database's UUID, as a way to
+ refer to any record within any OpenERP instance, without conflict.
+
+ For OpenERP records that have an existing "External ID" (i.e. an entry in
+ ir.model.data), the EDI unique identifier for this record will be made of
+ "%s:%s:%s" % (module, database UUID, ir.model.data ID). The database's
+ UUID MUST NOT contain a colon characters (this is guaranteed by the
+ UUID algorithm).
+
+ For records that have no existing ir.model.data entry, a new one will be
+ created during the EDI export. It is recommended that the generated external ID
+ contains a readable reference to the record model, plus a unique value that
+ hides the database ID. If ``existing_id`` is provided (because it came from
+ an import), it will be used instead of generating a new one.
+ If ``existing_module`` is provided (because it came from
+ an import), it will be used instead of using local values.
+
+ :param browse_record record: any browse_record needing an EDI external ID
+ :param string existing_id: optional existing external ID value, usually coming
+ from a just-imported EDI record, to be used instead
+ of generating a new one
+ :param string existing_module: optional existing module name, usually in the
+ format ``module:db_uuid`` and coming from a
+ just-imported EDI record, to be used instead
+ of local values
+ :return: the full unique External ID to use for record
+ """
+ ir_model_data = self.pool.get('ir.model.data')
+ db_uuid = self.pool.get('ir.config_parameter').get_param(cr, uid, 'database.uuid')
+ ext_id = record.get_external_id()[record.id]
+ if not ext_id:
+ ext_id = existing_id or safe_unique_id(db_uuid, record._name, record.id)
+ # ID is unique cross-db thanks to db_uuid (already included in existing_module)
+ module = existing_module or "%s:%s" % (record._original_module, db_uuid)
+ _logger.debug("%s: Generating new external ID `%s.%s` for %r", self._name,
+ module, ext_id, record)
+ ir_model_data.create(cr, openerp.SUPERUSER_ID,
+ {'name': ext_id,
+ 'model': record._name,
+ 'module': module,
+ 'res_id': record.id})
+ else:
+ module, ext_id = ext_id.split('.')
+ if not ':' in module:
+ # this record was not previously EDI-imported
+ if not module == record._original_module:
+ # this could happen for data records defined in a module that depends
+ # on the module that owns the model, e.g. purchase defines
+ # product.pricelist records.
+ _logger.debug('Mismatching module: expected %s, got %s, for %s',
+ module, record._original_module, record)
+ # ID is unique cross-db thanks to db_uuid
+ module = "%s:%s" % (module, db_uuid)
+
+ return '%s.%s' % (module, ext_id)
+
+ def _edi_record_display_action(self, cr, uid, id, context=None):
+ """Returns an appropriate action definition dict for displaying
+ the record with ID ``rec_id``.
+
+ :param int id: database ID of record to display
+ :return: action definition dict
+ """
+ return {'type': 'ir.actions.act_window',
+ 'view_mode': 'form,tree',
+ 'view_type': 'form',
+ 'res_model': self._name,
+ 'res_id': id}
+
+ def edi_metadata(self, cr, uid, records, context=None):
+ """Return a list containing the boilerplate EDI structures for
+ exporting ``records`` as EDI, including
+ the metadata fields
+
+ The metadata fields always include::
+
+ {
+ '__model': 'some.model', # record model
+ '__module': 'module', # require module
+ '__id': 'module:db-uuid:model.id', # unique global external ID for the record
+ '__last_update': '2011-01-01 10:00:00', # last update date in UTC!
+ '__version': 1, # EDI spec version
+ '__generator' : 'OpenERP', # EDI generator
+ '__generator_version' : [6,1,0], # server version, to check compatibility.
+ '__attachments_':
+ }
+
+ :param list(browse_record) records: records to export
+ :return: list of dicts containing boilerplate EDI metadata for each record,
+ at the corresponding index from ``records``.
+ """
+ data_ids = []
+ ir_attachment = self.pool.get('ir.attachment')
+ results = []
+ for record in records:
+ ext_id = self._edi_external_id(cr, uid, record, context=context)
+ edi_dict = {
+ '__id': ext_id,
+ '__last_update': last_update_for(record),
+ '__model' : record._name,
+ '__module' : record._original_module,
+ '__version': EDI_PROTOCOL_VERSION,
+ '__generator': EDI_GENERATOR,
+ '__generator_version': EDI_GENERATOR_VERSION,
+ }
+ attachment_ids = ir_attachment.search(cr, uid, [('res_model','=', record._name), ('res_id', '=', record.id)])
+ if attachment_ids:
+ attachments = []
+ for attachment in ir_attachment.browse(cr, uid, attachment_ids, context=context):
+ attachments.append({
+ 'name' : attachment.name,
+ 'content': attachment.datas, # already base64 encoded!
+ 'file_name': attachment.datas_fname,
+ })
+ edi_dict.update(__attachments=attachments)
+ results.append(edi_dict)
+ return results
+
+ def edi_m2o(self, cr, uid, record, context=None):
+ """Return a m2o EDI representation for the given record.
+
+ The EDI format for a many2one is::
+
+ ['unique_external_id', 'Document Name']
+ """
+ edi_ext_id = self._edi_external_id(cr, uid, record, context=context)
+ relation_model = record._model
+ name = relation_model.name_get(cr, uid, [record.id], context=context)
+ name = name and name[0][1] or False
+ return [edi_ext_id, name]
+
+ def edi_o2m(self, cr, uid, records, edi_struct=None, context=None):
+ """Return a list representing a O2M EDI relationship containing
+ all the given records, according to the given ``edi_struct``.
+ This is basically the same as exporting all the record using
+ :meth:`~.edi_export` with the given ``edi_struct``, and wrapping
+ the results in a list.
+
+ Example::
+
+ [ # O2M fields would be a list of dicts, with their
+ { '__id': 'module:db-uuid.id', # own __id.
+ '__last_update': 'iso date', # update date
+ 'name': 'some name',
+ #...
+ },
+ # ...
+ ],
+ """
+ result = []
+ for record in records:
+ result += record._model.edi_export(cr, uid, [record], edi_struct=edi_struct, context=context)
+ return result
+
+ def edi_m2m(self, cr, uid, records, context=None):
+ """Return a list representing a M2M EDI relationship directed towards
+ all the given records.
+ This is basically the same as exporting all the record using
+ :meth:`~.edi_m2o` and wrapping the results in a list.
+
+ Example::
+
+ # M2M fields are exported as a list of pairs, like a list of M2O values
+ [
+ ['module:db-uuid.id1', 'Task 01: bla bla'],
+ ['module:db-uuid.id2', 'Task 02: bla bla']
+ ]
+ """
+ return [self.edi_m2o(cr, uid, r, context=context) for r in records]
+
+ def edi_export(self, cr, uid, records, edi_struct=None, context=None):
+ """Returns a list of dicts representing an edi.document containing the
+ records, and matching the given ``edi_struct``, if provided.
+
+ :param edi_struct: if provided, edi_struct should be a dictionary
+ with a skeleton of the fields to export.
+ Basic fields can have any key as value, but o2m
+ values should have a sample skeleton dict as value,
+ to act like a recursive export.
+ For example, for a res.partner record::
+
+ edi_struct: {
+ 'name': True,
+ 'company_id': True,
+ 'address': {
+ 'name': True,
+ 'street': True,
+ }
+ }
+
+ Any field not specified in the edi_struct will not
+ be included in the exported data. Fields with no
+ value (False) will be omitted in the EDI struct.
+ If edi_struct is omitted, no fields will be exported
+ """
+ if edi_struct is None:
+ edi_struct = {}
+ fields_to_export = edi_struct.keys()
+ results = []
+ for record in records:
+ edi_dict = self.edi_metadata(cr, uid, [record], context=context)[0]
+ for field in fields_to_export:
+ column = self._all_columns[field].column
+ value = getattr(record, field)
+ if not value and value not in ('', 0):
+ continue
+ elif column._type == 'many2one':
+ value = self.edi_m2o(cr, uid, value, context=context)
+ elif column._type == 'many2many':
+ value = self.edi_m2m(cr, uid, value, context=context)
+ elif column._type == 'one2many':
+ value = self.edi_o2m(cr, uid, value, edi_struct=edi_struct.get(field, {}), context=context)
+ edi_dict[field] = value
+ results.append(edi_dict)
+ return results
+
+ def edi_export_and_email(self, cr, uid, ids, template_ext_id, context=None):
+ """Export the given records just like :meth:`~.export_edi`, the render the
+ given email template, in order to trigger appropriate notifications.
+ This method is intended to be called as part of business documents'
+ lifecycle, so it silently ignores any error occurring during the process,
+ as this is usually non-critical. To avoid any delay, it is also asynchronous
+ and will spawn a short-lived thread to perform the action.
+
+ :param str template_ext_id: external id of the email.template to use for
+ the mail notifications
+ :return: True
+ """
+ def email_task():
+ db = pooler.get_db(cr.dbname)
+ local_cr = None
+ try:
+ time.sleep(3) # lame workaround to wait for commit of parent transaction
+ # grab a fresh browse_record on local cursor
+ local_cr = db.cursor()
+ web_root_url = self.pool.get('ir.config_parameter').get_param(local_cr, uid, 'web.base.url')
+ if not web_root_url:
+ _logger.warning('Ignoring EDI mail notification, web.base.url not defined in parameters')
+ return
+ mail_tmpl = self._edi_get_object_by_external_id(local_cr, uid, template_ext_id, 'email.template', context=context)
+ if not mail_tmpl:
+ # skip EDI export if the template was not found
+ _logger.warning('Ignoring EDI mail notification, template %s cannot be located', template_ext_id)
+ return
+ for edi_record in self.browse(local_cr, uid, ids, context=context):
+ edi_token = self.pool.get('edi.document').export_edi(local_cr, uid, [edi_record], context = context)[0]
+ edi_context = dict(context, edi_web_url_view=EDI_VIEW_WEB_URL % (web_root_url, local_cr.dbname, edi_token))
+ self.pool.get('email.template').send_mail(local_cr, uid, mail_tmpl.id, edi_record.id,
+ force_send=False, context=edi_context)
+ _logger.info('EDI export successful for %s #%s, email notification sent.', self._name, edi_record.id)
+ except Exception:
+ _logger.warning('Ignoring EDI mail notification, failed to generate it.', exc_info=True)
+ finally:
+ if local_cr:
+ local_cr.commit()
+ local_cr.close()
+
+ threading.Thread(target=email_task, name='EDI ExportAndEmail for %s %r' % (self._name, ids)).start()
+ return True
+
+ def _edi_get_object_by_name(self, cr, uid, name, model_name, context=None):
+ model = self.pool.get(model_name)
+ search_results = model.name_search(cr, uid, name, operator='=', context=context)
+ if len(search_results) == 1:
+ return model.browse(cr, uid, search_results[0][0], context=context)
+ return False
+
+ def _edi_generate_report_attachment(self, cr, uid, record, context=None):
+ """Utility method to generate the first PDF-type report declared for the
+ current model with ``usage`` attribute set to ``default``.
+ This must be called explicitly by models that need it, usually
+ at the beginning of ``edi_export``, before the call to ``super()``."""
+ ir_actions_report = self.pool.get('ir.actions.report.xml')
+ matching_reports = ir_actions_report.search(cr, uid, [('model','=',self._name),
+ ('report_type','=','pdf'),
+ ('usage','=','default')])
+ if matching_reports:
+ report = ir_actions_report.browse(cr, uid, matching_reports[0])
+ report_service = 'report.' + report.report_name
+ service = netsvc.LocalService(report_service)
+ (result, format) = service.create(cr, uid, [record.id], {'model': self._name}, context=context)
+ eval_context = {'time': time, 'object': record}
+ if not report.attachment or not eval(report.attachment, eval_context):
+ # no auto-saving of report as attachment, need to do it manually
+ result = base64.b64encode(result)
+ file_name = record.name_get()[0][1]
+ file_name = re.sub(r'[^a-zA-Z0-9_-]', '_', file_name)
+ file_name += ".pdf"
+ ir_attachment = self.pool.get('ir.attachment').create(cr, uid,
+ {'name': file_name,
+ 'datas': result,
+ 'datas_fname': file_name,
+ 'res_model': self._name,
+ 'res_id': record.id},
+ context=context)
+
+ def _edi_import_attachments(self, cr, uid, record_id, edi_document, context=None):
+ ir_attachment = self.pool.get('ir.attachment')
+ for attachment in edi_document.get('__attachments', []):
+ # check attachment data is non-empty and valid
+ file_data = None
+ try:
+ file_data = base64.b64decode(attachment.get('content'))
+ except TypeError:
+ pass
+ assert file_data, 'Incorrect/Missing attachment file content'
+ assert attachment.get('name'), 'Incorrect/Missing attachment name'
+ assert attachment.get('file_name'), 'Incorrect/Missing attachment file name'
+ assert attachment.get('file_name'), 'Incorrect/Missing attachment file name'
+ ir_attachment.create(cr, uid, {'name': attachment['name'],
+ 'datas_fname': attachment['file_name'],
+ 'res_model': self._name,
+ 'res_id': record_id,
+ # should be pure 7bit ASCII
+ 'datas': str(attachment['content']),
+ }, context=context)
+
+
+ def _edi_get_object_by_external_id(self, cr, uid, external_id, model, context=None):
+ """Returns browse_record representing object identified by the model and external_id,
+ or None if no record was found with this external id.
+
+ :param external_id: fully qualified external id, in the EDI form
+ ``module:db_uuid:identifier``.
+ :param model: model name the record belongs to.
+ """
+ ir_model_data = self.pool.get('ir.model.data')
+ # external_id is expected to have the form: ``module:db_uuid:model.random_name``
+ ext_id_members = split_external_id(external_id)
+ db_uuid = self.pool.get('ir.config_parameter').get_param(cr, uid, 'database.uuid')
+ module = ext_id_members['module']
+ ext_id = ext_id_members['id']
+ modules = []
+ ext_db_uuid = ext_id_members['db_uuid']
+ if ext_db_uuid:
+ modules.append('%s:%s' % (module, ext_id_members['db_uuid']))
+ if ext_db_uuid is None or ext_db_uuid == db_uuid:
+ # local records may also be registered without the db_uuid
+ modules.append(module)
+ data_ids = ir_model_data.search(cr, uid, [('model','=',model),
+ ('name','=',ext_id),
+ ('module','in',modules)])
+ if data_ids:
+ model = self.pool.get(model)
+ data = ir_model_data.browse(cr, uid, data_ids[0], context=context)
+ result = model.browse(cr, uid, data.res_id, context=context)
+ return result
+
+ def edi_import_relation(self, cr, uid, model, value, external_id, context=None):
+ """Imports a M2O/M2M relation EDI specification ``[external_id,value]`` for the
+ given model, returning the corresponding database ID:
+
+ * First, checks if the ``external_id`` is already known, in which case the corresponding
+ database ID is directly returned, without doing anything else;
+ * If the ``external_id`` is unknown, attempts to locate an existing record
+ with the same ``value`` via name_search(). If found, the given external_id will
+ be assigned to this local record (in addition to any existing one)
+ * If previous steps gave no result, create a new record with the given
+ value in the target model, assign it the given external_id, and return
+ the new database ID
+ """
+ _logger.debug("%s: Importing EDI relationship [%r,%r]", model, external_id, value)
+ target = self._edi_get_object_by_external_id(cr, uid, external_id, model, context=context)
+ need_new_ext_id = False
+ if not target:
+ _logger.debug("%s: Importing EDI relationship [%r,%r] - ID not found, trying name_get",
+ self._name, external_id, value)
+ target = self._edi_get_object_by_name(cr, uid, value, model, context=context)
+ need_new_ext_id = True
+ if not target:
+ _logger.debug("%s: Importing EDI relationship [%r,%r] - name not found, creating it!",
+ self._name, external_id, value)
+ # also need_new_ext_id here, but already been set above
+ model = self.pool.get(model)
+ res_id, name = model.name_create(cr, uid, value, context=context)
+ target = model.browse(cr, uid, res_id, context=context)
+ if need_new_ext_id:
+ ext_id_members = split_external_id(external_id)
+ # module name is never used bare when creating ir.model.data entries, in order
+ # to avoid being taken as part of the module's data, and cleanup up at next update
+ module = "%s:%s" % (ext_id_members['module'], ext_id_members['db_uuid'])
+ # create a new ir.model.data entry for this value
+ self._edi_external_id(cr, uid, target, existing_id=ext_id_members['id'], existing_module=module, context=context)
+ return target.id
+
+ def edi_import(self, cr, uid, edi_document, context=None):
+ """Imports a dict representing an edi.document into the system.
+
+ :param dict edi_document: EDI document to import
+ :return: the database ID of the imported record
+ """
+ assert self._name == edi_document.get('__import_model') or \
+ ('__import_model' not in edi_document and self._name == edi_document.get('__model')), \
+ "EDI Document Model and current model do not match: '%s' (EDI) vs '%s' (current)" % \
+ (edi_document['__model'], self._name)
+
+ # First check the record is now already known in the database, in which case it is ignored
+ ext_id_members = split_external_id(edi_document['__id'])
+ existing = self._edi_get_object_by_external_id(cr, uid, ext_id_members['full'], self._name, context=context)
+ if existing:
+ _logger.info("'%s' EDI Document with ID '%s' is already known, skipping import!", self._name, ext_id_members['full'])
+ return existing.id
+
+ record_values = {}
+ o2m_todo = {} # o2m values are processed after their parent already exists
+ for field_name, field_value in edi_document.iteritems():
+ # skip metadata and empty fields
+ if field_name.startswith('__') or field_value is None or field_value is False:
+ continue
+ field_info = self._all_columns.get(field_name)
+ if not field_info:
+ _logger.warning('Ignoring unknown field `%s` when importing `%s` EDI document', field_name, self._name)
+ continue
+ field = field_info.column
+ # skip function/related fields
+ if isinstance(field, fields.function):
+ _logger.warning("Unexpected function field value found in '%s' EDI document: '%s'" % (self._name, field_name))
+ continue
+ relation_model = field._obj
+ if field._type == 'many2one':
+ record_values[field_name] = self.edi_import_relation(cr, uid, relation_model,
+ field_value[1], field_value[0],
+ context=context)
+ elif field._type == 'many2many':
+ record_values[field_name] = [self.edi_import_relation(cr, uid, relation_model, m2m_value[1],
+ m2m_value[0], context=context)
+ for m2m_value in field_value]
+ elif field._type == 'one2many':
+ # must wait until parent report is imported, as the parent relationship
+ # is often required in o2m child records
+ o2m_todo[field_name] = field_value
+ else:
+ record_values[field_name] = field_value
+
+ module_ref = "%s:%s" % (ext_id_members['module'], ext_id_members['db_uuid'])
+ record_id = self.pool.get('ir.model.data')._update(cr, uid, self._name, module_ref, record_values,
+ xml_id=ext_id_members['id'], context=context)
+
+ record_display, = self.name_get(cr, uid, [record_id], context=context)
+
+ # process o2m values, connecting them to their parent on-the-fly
+ for o2m_field, o2m_value in o2m_todo.iteritems():
+ field = self._all_columns[o2m_field].column
+ dest_model = self.pool.get(field._obj)
+ for o2m_line in o2m_value:
+ # link to parent record: expects an (ext_id, name) pair
+ o2m_line[field._fields_id] = (ext_id_members['full'], record_display[1])
+ dest_model.edi_import(cr, uid, o2m_line, context=context)
+
+ # process the attachments, if any
+ self._edi_import_attachments(cr, uid, record_id, edi_document, context=context)
+
+ return record_id
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
diff --git a/addons/edi/models/res_company.py b/addons/edi/models/res_company.py
new file mode 100644
index 00000000000..cf5efe997e0
--- /dev/null
+++ b/addons/edi/models/res_company.py
@@ -0,0 +1,60 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (c) 2011 OpenERP S.A.
+#
+# 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 .
+#
+##############################################################################
+
+from osv import fields,osv
+
+class res_company(osv.osv):
+ """Helper subclass for res.company providing util methods for working with
+ companies in the context of EDI import/export. The res.company object
+ itself is not EDI-exportable"""
+ _inherit = "res.company"
+
+ def edi_export_address(self, cr, uid, company, edi_address_struct=None, context=None):
+ """Returns a dict representation of the address of the company record, suitable for
+ inclusion in an EDI document, and matching the given edi_address_struct if provided.
+ The first found address is returned, in order of preference: invoice, contact, default.
+
+ :param browse_record company: company to export
+ :return: dict containing the address representation for the company record, or
+ an empty dict if no address can be found
+ """
+ res_partner = self.pool.get('res.partner')
+ res_partner_address = self.pool.get('res.partner.address')
+ addresses = res_partner.address_get(cr, uid, [company.partner_id.id], ['default', 'contact', 'invoice'])
+ addr_id = addresses['invoice'] or addresses['contact'] or addresses['default']
+ result = {}
+ if addr_id:
+ address = res_partner_address.browse(cr, uid, addr_id, context=context)
+ result = res_partner_address.edi_export(cr, uid, [address], edi_struct=edi_address_struct, context=context)[0]
+ if company.logo:
+ result['logo'] = company.logo # already base64-encoded
+ if company.paypal_account:
+ result['paypal_account'] = company.paypal_account
+ # bank info: include only bank account supposed to be displayed in document footers
+ res_partner_bank = self.pool.get('res.partner.bank')
+ bank_ids = res_partner_bank.search(cr, uid, [('company_id','=',company.id),('footer','=',True)], context=context)
+ if bank_ids:
+ result['bank_ids'] = res_partner_address.edi_m2m(cr, uid,
+ res_partner_bank.browse(cr, uid, bank_ids, context=context),
+ context=context)
+ return result
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/edi/models/res_currency.py b/addons/edi/models/res_currency.py
new file mode 100644
index 00000000000..0f56bc83f45
--- /dev/null
+++ b/addons/edi/models/res_currency.py
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (c) 2011 OpenERP S.A.
+#
+# 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 .
+#
+##############################################################################
+
+from osv import fields,osv
+from edi import EDIMixin
+from openerp import SUPERUSER_ID
+
+RES_CURRENCY_EDI_STRUCT = {
+ #custom: 'code'
+ 'symbol': True,
+ 'rate': True,
+}
+
+class res_currency(osv.osv, EDIMixin):
+ _inherit = "res.currency"
+
+ def edi_export(self, cr, uid, records, edi_struct=None, context=None):
+ edi_struct = dict(edi_struct or RES_CURRENCY_EDI_STRUCT)
+ edi_doc_list = []
+ for currency in records:
+ # Get EDI doc based on struct. The result will also contain all metadata fields and attachments.
+ edi_doc = super(res_currency,self).edi_export(cr, uid, [currency], edi_struct, context)[0]
+ edi_doc.update(code=currency.name)
+ edi_doc_list.append(edi_doc)
+ return edi_doc_list
+
+ def edi_import(self, cr, uid, edi_document, context=None):
+ self._edi_requires_attributes(('code','symbol'), edi_document)
+ external_id = edi_document['__id']
+ existing_currency = self._edi_get_object_by_external_id(cr, uid, external_id, 'res_currency', context=context)
+ if existing_currency:
+ return existing_currency.id
+
+ # find with unique ISO code
+ existing_ids = self.search(cr, uid, [('name','=',edi_document['code'])])
+ if existing_ids:
+ return existing_ids[0]
+
+ # nothing found, create a new one
+ currency_id = self.create(cr, SUPERUSER_ID, {'name': edi_document['code'],
+ 'symbol': edi_document['symbol']}, context=context)
+ rate = edi_document.pop('rate')
+ if rate:
+ self.pool.get('res.currency.rate').create(cr, SUPERUSER_ID, {'currency_id': currency_id,
+ 'rate': rate}, context=context)
+ return currency_id
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/edi/models/res_partner.py b/addons/edi/models/res_partner.py
new file mode 100644
index 00000000000..7c40a5c7354
--- /dev/null
+++ b/addons/edi/models/res_partner.py
@@ -0,0 +1,105 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (c) 2011 OpenERP S.A.
+#
+# 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 .
+#
+##############################################################################
+import logging
+
+from osv import fields,osv
+from edi import EDIMixin
+from openerp import SUPERUSER_ID
+from tools.translate import _
+
+RES_PARTNER_ADDRESS_EDI_STRUCT = {
+ 'name': True,
+ 'email': True,
+ 'street': True,
+ 'street2': True,
+ 'zip': True,
+ 'city': True,
+ 'country_id': True,
+ 'state_id': True,
+ 'phone': True,
+ 'fax': True,
+ 'mobile': True,
+}
+
+RES_PARTNER_EDI_STRUCT = {
+ 'name': True,
+ 'ref': True,
+ 'lang': True,
+ 'website': True,
+ 'address': RES_PARTNER_ADDRESS_EDI_STRUCT
+}
+
+class res_partner(osv.osv, EDIMixin):
+ _inherit = "res.partner"
+
+ def edi_export(self, cr, uid, records, edi_struct=None, context=None):
+ return super(res_partner,self).edi_export(cr, uid, records,
+ edi_struct or dict(RES_PARTNER_EDI_STRUCT),
+ context=context)
+
+class res_partner_address(osv.osv, EDIMixin):
+ _inherit = "res.partner.address"
+
+ def _get_bank_type(self, cr, uid, context=None):
+ # first option: the "normal" bank type, installed by default
+ res_partner_bank_type = self.pool.get('res.partner.bank.type')
+ try:
+ return self.pool.get('ir.model.data').get_object(cr, uid, 'base', 'bank_normal', context=context).code
+ except ValueError:
+ pass
+
+ # second option: create a new custom type for EDI or use it if already created, as IBAN type is
+ # not always appropriate: we need a free-form bank type for max flexibility (users can correct
+ # data manually after import)
+ code, label = 'edi_generic', 'Generic Bank Type (auto-created for EDI)'
+ bank_code_ids = res_partner_bank_type.search(cr, uid, [('code','=',code)], context=context)
+ if not bank_code_ids:
+ logging.getLogger('edi.res_partner').info('Normal bank account type is missing, creating '
+ 'a generic bank account type for EDI.')
+ self.res_partner_bank_type.create(cr, SUPERUSER_ID, {'name': label,
+ 'code': label})
+ return code
+
+ def edi_export(self, cr, uid, records, edi_struct=None, context=None):
+ return super(res_partner_address,self).edi_export(cr, uid, records,
+ edi_struct or dict(RES_PARTNER_ADDRESS_EDI_STRUCT),
+ context=context)
+
+ def edi_import(self, cr, uid, edi_document, context=None):
+ # handle bank info, if any
+ edi_bank_ids = edi_document.pop('bank_ids', None)
+ address_id = super(res_partner_address,self).edi_import(cr, uid, edi_document, context=context)
+ if edi_bank_ids:
+ address = self.browse(cr, uid, address_id, context=context)
+ import_ctx = dict((context or {}),
+ default_partner_id=address.partner_id.id,
+ default_state=self._get_bank_type(cr, uid, context))
+ for ext_bank_id, bank_name in edi_bank_ids:
+ try:
+ self.edi_import_relation(cr, uid, 'res.partner.bank',
+ bank_name, ext_bank_id, context=import_ctx)
+ except osv.except_osv:
+ # failed to import it, try again with unrestricted default type
+ logging.getLogger('edi.res_partner').warning('Failed to import bank account using'
+ 'bank type: %s, ignoring', import_ctx['default_state'],
+ exc_info=True)
+ return address_id
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/edi/security/ir.model.access.csv b/addons/edi/security/ir.model.access.csv
new file mode 100644
index 00000000000..b1f470d80ae
--- /dev/null
+++ b/addons/edi/security/ir.model.access.csv
@@ -0,0 +1,3 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_ir_edi_all_read,access_ir_edi_all_read,model_edi_document,,1,0,0,0
+access_ir_edi_employee_create,access_ir_edi_employee_create,model_edi_document,base.group_user,1,0,1,0
diff --git a/addons/edi/static/src/css/edi.css b/addons/edi/static/src/css/edi.css
new file mode 100644
index 00000000000..478985ee585
--- /dev/null
+++ b/addons/edi/static/src/css/edi.css
@@ -0,0 +1,220 @@
+/** EDI content **/
+.openerp .company_logo {
+ background-size: 180px 46px;
+}
+.oe_edi_view {
+ width: 65%;
+ vertical-align: top;
+ padding: 0px 25px;
+ border-right: 1px solid #D2CFCF;
+}
+.oe_edi_sidebar_container {
+ width: 35%;
+ padding: 0px 10px;
+ vertical-align: top;
+}
+button.oe_edi_action_print {
+ font-size: 1.5em;
+ margin-left: 35%;
+ margin-bottom: 20px;
+}
+button.oe_edi_action_print img {
+ vertical-align: bottom;
+ width: 32px;
+ height: 32px;
+}
+
+.openerp input.invalid {
+ background-color: #F66 !important;
+ border: 1px solid #D00 !important;
+ color: #000;
+}
+/* following browse-specific hacks need to be separate rules, as browsers are
+ required to ignore rules with unknown selectors. At time of writing, there
+ is no standard way to style HTML5 placeholders */
+.openerp input.invalid:-moz-placeholder {
+ color: #FFF;
+}
+.openerp input.invalid::-webkit-input-placeholder {
+ color: #FFF;
+}
+
+/** EDI Sidebar **/
+.oe_edi_sidebar_title {
+ border-bottom: 1px solid #D2CFCF;
+ font-weight: bold;
+ font-size: 1.3em;
+ min-width: 10em;
+}
+.oe_edi_nested_block, .oe_edi_nested_block_import, .oe_edi_nested_block_pay {
+ margin: 0px 40px;
+ min-width: 10em;
+ display: none; /* made visible by click on parent input/label */
+}
+.oe_edi_right_top .oe_edi_nested_block label {
+ float: left;
+ text-align: right;
+ margin-right: 0.5em;
+ line-height: 180%;
+ font-weight: bold;
+ min-width: 5em;
+}
+.oe_edi_option {
+ padding-left: 5px;
+ line-height: 2em;
+}
+.oe_edi_option:hover {
+ background: #e8e8e8;
+}
+.oe_edi_import_button {
+ margin: 2px 10px;
+ white-space: nowrap;
+}
+.oe_edi_small, .oe_edi_small input {
+ font-size: 90%;
+}
+
+/** Sidebar bottom **/
+.oe_edi_paypal_button {
+ margin: 6px;
+}
+
+
+/** Paperbox, from http://www.sitepoint.com/pure-css3-paper-curl/ **/
+body {
+ background: #EEE; /* contrast with paper */
+}
+.oe_edi_paperbox {
+ position: relative;
+ width: 700px;
+ padding: 30px;
+ padding-bottom: 50px;
+ margin: 20px auto;
+ background-color: #fff;
+ -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
+ -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
+}
+.oe_edi_paperbox:before, .oe_edi_paperbox:after {
+ position: absolute;
+ width: 40%;
+ height: 10px;
+ content: ' ';
+ left: 12px;
+ bottom: 15px;
+ background: transparent;
+ -webkit-transform: skew(-5deg) rotate(-5deg);
+ -moz-transform: skew(-5deg) rotate(-5deg);
+ -ms-transform: skew(-5deg) rotate(-5deg);
+ -o-transform: skew(-5deg) rotate(-5deg);
+ transform: skew(-5deg) rotate(-5deg);
+ -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
+ -moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
+ z-index: -1;
+}
+.oe_edi_paperbox:after {
+ left: auto; right: 12px;
+ -webkit-transform: skew(5deg) rotate(5deg);
+ -moz-transform: skew(5deg) rotate(5deg);
+ -ms-transform: skew(5deg) rotate(5deg);
+ -o-transform: skew(5deg) rotate(5deg);
+ transform: skew(5deg) rotate(5deg);
+}
+
+/** Sale Order / Purchase Order Preview **/
+table.oe_edi_data, .oe_edi_doc_title {
+ border-collapse: collapse;
+ clear: both;
+}
+.oe_edi_data th {
+ white-space: nowrap;
+}
+.oe_edi_data .oe_edi_floor {
+ border-bottom: 1px solid black;
+}
+.oe_edi_data .oe_edi_ceiling {
+ border-top: 1px solid black;
+}
+.oe_edi_data .oe_edi_data_row {
+ border-bottom: 1px solid #D2CFCF;
+}
+.oe_edi_data_row td {
+ vertical-align: top;
+}
+.oe_edi_inner_note {
+ font-style: italic;
+ font-size: 95%;
+ padding-left: 10px;
+}
+.oe_edi_shade {
+ background: #e8e8e8;
+}
+.oe_edi_company_name {
+ text-transform: uppercase;
+ font-weight: bold;
+}
+.oe_edi_address_from {
+ float: left;
+}
+.oe_edi_address_to {
+ float: right;
+ margin-top: 25px;
+ margin-bottom: 30px;
+}
+.oe_edi_company_block_title {
+ width: 375px;
+ margin: 0px;
+ padding: 2px 14px;
+ background-color: #252525;
+ border-top-left-radius: 5px 5px;
+ border-top-right-radius: 5px 5px;
+ background-repeat: repeat no-repeat;
+}
+.oe_edi_company_block_title .oe_edi_company_name {
+ margin: 0px;
+ font-size: 1em;
+ color: #FFF;
+}
+.oe_edi_company_block_body {
+ width: 375px;
+ margin: 0px;
+ padding: 5px 14px;
+ line-height: 16px;
+ background-color: rgb(242, 242, 242);
+}
+.oe_edi_company_block_body p {
+ color: #222;
+ margin: 5px 0px;
+}
+.oe_edi_summary_label {
+ float: left;
+}
+.oe_edi_summary_value {
+ float: right;
+}
+
+
+/** Python code highlighting **/
+/* GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
+ (http://qbnz.com/highlighter/ and http://geshi.org/) */
+.python .de1, .python .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}
+.python {font-family:monospace;}
+.python .imp {font-weight: bold; color: red;}
+.python li, .python .li1 {background: #ffffff; list-style: none;}
+.python .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
+.python .li2 {background: #f8f8f8;}
+.python .kw1 {color: #ff7700;font-weight:bold;}
+.python .kw2 {color: #008000;}
+.python .kw3 {color: #dc143c;}
+.python .kw4 {color: #0000cd;}
+.python .co1 {color: #808080; font-style: italic;}
+.python .coMULTI {color: #808080; font-style: italic;}
+.python .es0 {color: #000099; font-weight: bold;}
+.python .br0 {color: black;}
+.python .sy0 {color: #66cc66;}
+.python .st0 {color: #483d8b;}
+.python .nu0 {color: #ff4500;}
+.python .me1 {color: black;}
+.python span.xtra { display:block; }
+.python ol { padding: 0px; }
\ No newline at end of file
diff --git a/addons/edi/static/src/img/knowledge.png b/addons/edi/static/src/img/knowledge.png
new file mode 100644
index 00000000000..35c8d5706fd
Binary files /dev/null and b/addons/edi/static/src/img/knowledge.png differ
diff --git a/addons/edi/static/src/img/pdf.png b/addons/edi/static/src/img/pdf.png
new file mode 100644
index 00000000000..d35dfd20c2d
Binary files /dev/null and b/addons/edi/static/src/img/pdf.png differ
diff --git a/addons/edi/static/src/js/edi.js b/addons/edi/static/src/js/edi.js
new file mode 100644
index 00000000000..9397c1cf280
--- /dev/null
+++ b/addons/edi/static/src/js/edi.js
@@ -0,0 +1,174 @@
+openerp.edi = function(openerp) {
+openerp.web.qweb.add_template("/edi/static/src/xml/edi.xml");
+openerp.web.qweb.add_template("/edi/static/src/xml/edi_account.xml");
+openerp.web.qweb.add_template("/edi/static/src/xml/edi_sale_purchase.xml");
+openerp.edi = {}
+
+openerp.edi.EdiView = openerp.web.Widget.extend({
+ init: function(parent, db, token) {
+ this._super();
+ this.db = db;
+ this.token = token;
+ this.session = new openerp.web.Connection();
+ this.template = "EdiEmpty";
+ this.content = "";
+ this.sidebar = "";
+ },
+ start: function() {
+ this._super();
+ var param = {"db": this.db, "token": this.token};
+ this.rpc('/edi/get_edi_document', param, this.on_document_loaded, this.on_document_failed);
+ },
+ on_document_loaded: function(docs){
+ this.doc = docs[0];
+ var template_content = "Edi." + this.doc.__model + ".content";
+ var template_sidebar = "Edi." + this.doc.__model + ".sidebar";
+ var param = {"widget":this, "doc":this.doc};
+ if (openerp.web.qweb.templates[template_sidebar]) {
+ this.sidebar = openerp.web.qweb.render(template_sidebar, param);
+ }
+ if (openerp.web.qweb.templates[template_content]) {
+ this.content = openerp.web.qweb.render(template_content, param);
+ }
+ this.$element.html(openerp.web.qweb.render("EdiView", param));
+ this.$element.find('button.oe_edi_action_print').bind('click', this.do_print);
+ this.$element.find('button#oe_edi_import_existing').bind('click', this.do_import_existing);
+ this.$element.find('button#oe_edi_import_create').bind('click', this.do_import_create);
+ this.$element.find('button#oe_edi_download').bind('click', this.do_download);
+ this.$element.find('.oe_edi_import_choice, .oe_edi_import_choice_label').bind('click', this.toggle_choice('import'));
+ this.$element.find('.oe_edi_pay_choice, .oe_edi_pay_choice_label').bind('click', this.toggle_choice('pay'));
+ this.$element.find('#oe_edi_download_show_code').bind('click', this.show_code);
+ },
+ on_document_failed: function(response) {
+ var self = this;
+ var params = {
+ error: response,
+ //TODO: should this be _t() wrapped?
+ message: "Sorry, this document cannot be located. Perhaps the link you are using has expired?"
+ }
+ $(openerp.web.qweb.render("DialogWarning", params)).dialog({
+ title: "Document not found",
+ modal: true,
+ });
+ },
+ show_code: function($event) {
+ $('#oe_edi_download_code').toggle();
+ },
+ get_download_url: function() {
+ var l = window.location;
+ var url_prefix = l.protocol + '//' + l.host;
+ return url_prefix +'/edi/download?db=' + this.db + '&token=' + this.token;
+ },
+ get_paypal_url: function(document_type, ref_field) {
+ var comp_name = encodeURIComponent(this.doc.company_id[1]);
+ var doc_ref = encodeURIComponent(this.doc[ref_field]);
+ var paypal_account = encodeURIComponent(this.doc.company_address.paypal_account);
+ var amount = encodeURIComponent(this.doc.amount_total);
+ var cur_code = encodeURIComponent(this.doc.currency.code);
+ var paypal_url = "https://www.paypal.com/cgi-bin/webscr?cmd=_xclick" +
+ "&business=" + paypal_account +
+ "&item_name=" + document_type + "%20" + comp_name + "%20" + doc_ref +
+ "&invoice=" + doc_ref +
+ "&amount=" + amount +
+ "¤cy_code=" + cur_code +
+ "&button_subtype=services&no_note=1&bn=OpenERP_PayNow_" + cur_code;
+ return paypal_url;
+ },
+ toggle_choice: function(mode) {
+ return function($e) {
+ $('.oe_edi_nested_block_'+mode).hide();
+ $('.'+$e.target.id+'_nested').show();
+ return true;
+ }
+ },
+ do_print: function(e){
+ var l = window.location;
+ window.location = l.protocol + '//' + l.host + "/edi/download_attachment?db=" + this.db + "&token=" + this.token;
+ },
+ do_import_existing: function(e) {
+ var url_download = this.get_download_url();
+ var $edi_text_server_input = this.$element.find('#oe_edi_txt_server_url');
+ var server_url = $edi_text_server_input.val();
+ $edi_text_server_input.removeClass('invalid');
+ if (!server_url) {
+ $edi_text_server_input.addClass('invalid');
+ return false;
+ }
+ var protocol = "http://";
+ if (server_url.toLowerCase().lastIndexOf('http', 0) == 0 ) {
+ protocol = '';
+ }
+ window.location = protocol + server_url + '/edi/import_url?url=' + encodeURIComponent(url_download);
+ },
+ do_import_create: function(e){
+ var url_download = this.get_download_url();
+ window.location = "https://cc.my.openerp.com/odms/create_edi?url=" + encodeURIComponent(url_download);
+ },
+ do_download: function(e){
+ window.location = this.get_download_url();
+ }
+});
+
+openerp.edi.EdiImport = openerp.web.Widget.extend({
+ init: function(parent,url) {
+ this._super();
+ this.url = url;
+ var params = {};
+
+ this.template = "EdiImport";
+ this.session = new openerp.web.Connection();
+ this.login = new openerp.web.Login(this);
+ this.header = new openerp.web.Header(this);
+ this.header.on_logout.add(this.login.on_logout);
+ },
+ start: function() {
+ this.session.on_session_invalid.add_last(this.do_ask_login)
+ this.session.on_session_valid.add_last(this.do_import);
+ this.header.appendTo($("#oe_header"));
+ this.session.start();
+ this.login.appendTo($('#oe_login'));
+ },
+ do_ask_login: function() {
+ this.login.do_ask_login(this.do_import);
+ },
+ do_import: function() {
+ this.rpc('/edi/import_edi_url', {url: this.url}, this.on_imported, this.on_imported_error);
+ },
+ on_imported: function(response) {
+ if ('action' in response) {
+ this.rpc("/web/session/save_session_action", {the_action: response.action}, function(key) {
+ window.location = "/web/webclient/home?debug=1&s_action="+encodeURIComponent(key);
+ });
+ }
+ else {
+ $('').dialog({
+ modal: true,
+ title: 'Import Successful!',
+ buttons: {
+ Ok: function() {
+ $(this).dialog("close");
+ window.location = "/web/webclient/home";
+ }
+ }
+ }).html('The document has been successfully imported!');
+ }
+ },
+ on_imported_error: function(response){
+ var self = this;
+ var msg = "Sorry, the document could not be imported.";
+ if (response.data.fault_code) {
+ msg += "\n Reason:" + response.data.fault_code;
+ }
+ var params = {error: response, message: msg};
+ $(openerp.web.qweb.render("DialogWarning", params)).dialog({
+ title: "Document Import Notification",
+ modal: true,
+ buttons: {
+ Ok: function() { $(this).dialog("close"); }
+ }
+ });
+ }
+});
+
+}
+// vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax:
diff --git a/addons/edi/static/src/xml/edi.xml b/addons/edi/static/src/xml/edi.xml
new file mode 100644
index 00000000000..1e662a2b2cc
--- /dev/null
+++ b/addons/edi/static/src/xml/edi.xml
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/edi/static/src/xml/edi_account.xml b/addons/edi/static/src/xml/edi_account.xml
new file mode 100644
index 00000000000..dc6fb7f9754
--- /dev/null
+++ b/addons/edi/static/src/xml/edi_account.xml
@@ -0,0 +1,163 @@
+
+
+
+
+
+
Invoice :
+
+
+ Description
+ Date
+ Your Reference
+
+
+
+
+
+
+
+
+
+
+ Product Description
+ Quantity
+ Unit Price
+ Discount
+ Price
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Net Total:
+
+
+
+
+
+
+
+
+
+
+ Taxes:
+
+
+
+
+
+
+
+
+
+
+ Total:
+
+
+
+
+
+
+
+
+
+
+ Tax
+ Base Amount
+ Amount
+
+
+
+
+
+
+
+
+
+
+
+
+ Notes:
+
+
+
+
+
+
+
+
+
+
+
+ Paypal
+
+
+ You may directly pay this invoice online via Paypal's secure payment gateway:
+
+
+
+
+
+
+
+
+ Bank Wire Transfer
+
+
+ Please transfer to
+ (postal address on the invoice header)
+ using one of the following bank accounts. Be sure to mention the invoice
+ reference on the transfer:
+
+
+
+
+
+
+
+
diff --git a/addons/edi/static/src/xml/edi_sale_purchase.xml b/addons/edi/static/src/xml/edi_sale_purchase.xml
new file mode 100644
index 00000000000..4e0fdd7fc4e
--- /dev/null
+++ b/addons/edi/static/src/xml/edi_sale_purchase.xml
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+
+
Order :
+
+
+
+ Your Reference
+ Date
+ Salesman
+ Payment terms
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Product Description
+ Quantity
+ Unit Price
+ Discount(%)
+ Price
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Net Total:
+
+
+
+
+
+
+
+
+
+
+ Taxes:
+
+
+
+
+
+
+
+
+
+
+ Total:
+
+
+
+
+
+
+
+
+ Notes:
+
+
+
+
+
+
+
+
+
+
+
+ Paypal
+
+
+ You may directly pay this order online via Paypal's secure payment gateway:
+
+
+
+
+
+
+
+
+ Bank Wire Transfer
+
+
+ Please transfer to
+ (postal address on the order header)
+ using one of the following bank accounts. Be sure to mention the document
+ reference on the transfer:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/edi/test/edi_partner_test.yml b/addons/edi/test/edi_partner_test.yml
new file mode 100644
index 00000000000..cca39417927
--- /dev/null
+++ b/addons/edi/test/edi_partner_test.yml
@@ -0,0 +1,44 @@
+-
+ In order to test the basic EDI system, I will export a partner,
+ modify the exported EDI document to add an attachment and change
+ the data, and then re-import it and re-export it.
+
+ with an attached file, check the result, the alter the data
+ and reimport it.
+-
+ !python {model: edi.document}: |
+ import json
+ partner_obj = self.pool.get('res.partner')
+ tokens = self.export_edi(cr, uid, [partner_obj.browse(cr, uid, ref('base.res_partner_agrolait'))])
+ doc = self.get_document(cr, uid, tokens[0], context=context)
+ edi_doc, = json.loads(doc)
+
+ # check content of the document
+ assert edi_doc.get('__id').endswith('.res_partner_agrolait'), 'Incorrect external ID'
+ assert edi_doc.get('__model') == 'res.partner', 'Incorrect/Missing __model'
+ assert edi_doc.get('__module') == 'base', 'Incorrect/Missing __module'
+ assert edi_doc.get('__last_update'), 'Missing __last_update'
+
+ # try to import the document after changing the name and id, and attaching a
+ # file, and check that a new partner is returned
+ edi_doc['__id'] = 'base:xxd37f8a-xx55-11e0-xxdd-xx81124c8b50.res_partner_xxx'
+ edi_doc['name'] = 'AgroMilk'
+ attachment = {
+ 'name': 'Test file',
+ 'file_name': 'test.png',
+ # base64 standard requires blocks of 57bytes=76chars, NL-separated
+ 'content': 'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAKCAYAAACE2W/HAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A\n/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oIDQ84BkjLWAYAAACNSURBVCjP\njZKxDUJBDEOf/wbUbEHDhkxAzRjUDECBhMQYjIApuPBNpK+PpUinOPYll5Nt1iCJXifbSPpJZtHg\nXLUdu0FWpMEt87a/xtsmqjjNetPFyhuWYFuj7RcgQBNwXNGdw2CqY85yXWi5z7YBnmRyEHvg0YSX\nrLE9P30nwugOHHr+s5va4x+fofAGm1+JjnJICm0AAAAASUVORK5CYII=\n',
+ }
+ edi_doc['__attachments'] = [attachment]
+ doc = json.dumps([edi_doc])
+ result, = self.import_edi(cr, uid, edi_document=doc)
+ assert result[0] == 'res.partner' and result[1] > ref('base.res_partner_agrolait'),\
+ "Expected (%r,> %r) after import 1, got %r" % ('res.partner', ref('base.res_partner_agrolait'), result)
+
+ # export the same partner we just created, and see if the output matches the input
+ tokens = self.export_edi(cr, uid, [partner_obj.browse(cr, uid, result[1])])
+ doc_output = self.get_document(cr, uid, tokens[0], context=context)
+ edi_doc_output, = json.loads(doc_output)
+ for attribute in ('__model', '__module', '__id', 'name', '__attachments'):
+ assert edi_doc_output.get(attribute) == edi_doc.get(attribute), \
+ 'Incorrect value for %s, expected %r, got %r' % (attribute, edi_doc.get(attribute), edi_doc_output.get(attribute))
\ No newline at end of file
diff --git a/addons/email_template/__init__.py b/addons/email_template/__init__.py
index 97931ea8bd5..d1cf5b28431 100644
--- a/addons/email_template/__init__.py
+++ b/addons/email_template/__init__.py
@@ -21,5 +21,6 @@
##############################################################################
import email_template
import wizard
+import res_partner
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/email_template/__openerp__.py b/addons/email_template/__openerp__.py
index 06fa969c0c2..9aca39f56e8 100644
--- a/addons/email_template/__openerp__.py
+++ b/addons/email_template/__openerp__.py
@@ -21,9 +21,9 @@
##############################################################################
{
- "name" : "Automated E-Mails",
+ "name" : "E-Mail Templates",
"version" : "1.1",
- "author" : "Openlabs",
+ "author" : "OpenERP,OpenLabs",
"website" : "http://openerp.com",
"category" : "Marketing",
'complexity': "expert",
@@ -61,9 +61,13 @@ Openlabs was kept
"data": [
'wizard/email_template_preview_view.xml',
'email_template_view.xml',
+ 'res_partner_view.xml',
'wizard/email_compose_message_view.xml',
'security/ir.model.access.csv'
],
+ "demo": [
+ 'res_partner_demo.yml',
+ ],
"installable": True,
"active": False,
"certificate" : "00817073628967384349",
diff --git a/addons/email_template/email_template.py b/addons/email_template/email_template.py
index 3917b3f2ddb..237279c16aa 100644
--- a/addons/email_template/email_template.py
+++ b/addons/email_template/email_template.py
@@ -28,6 +28,7 @@ from osv import osv
from osv import fields
import tools
from tools.translate import _
+from urllib import quote as quote
try:
from mako.template import Template as MakoTemplate
@@ -66,6 +67,7 @@ class email_template(osv.osv):
user=user,
# context kw would clash with mako internals
ctx=context,
+ quote=quote,
format_exceptions=True)
if result == u'False':
result = u''
@@ -305,6 +307,7 @@ class email_template(osv.osv):
'attachment_ids': False,
'message_id': False,
'state': 'outgoing',
+ 'subtype': 'plain',
}
if not template_id:
return values
@@ -319,6 +322,9 @@ class email_template(osv.osv):
template.model, res_id, context=context) \
or False
+ if values['body_html']:
+ values.update(subtype='html')
+
if template.user_signature:
signature = self.pool.get('res.users').browse(cr, uid, uid, context).signature
values['body_text'] += '\n\n' + signature
@@ -355,20 +361,24 @@ class email_template(osv.osv):
values['attachments'] = attachments
return values
- def send_mail(self, cr, uid, template_id, res_id, context=None):
+ def send_mail(self, cr, uid, template_id, res_id, force_send=False, context=None):
"""Generates a new mail message for the given template and record,
- and schedule it for delivery through the ``mail`` module's scheduler.
+ and schedules it for delivery through the ``mail`` module's scheduler.
:param int template_id: id of the template to render
:param int res_id: id of the record to render the template with
(model is taken from the template)
+ :param bool force_send: if True, the generated mail.message is
+ immediately sent after being created, as if the scheduler
+ was executed for this message only.
+ :returns: id of the mail.message that was created
"""
mail_message = self.pool.get('mail.message')
ir_attachment = self.pool.get('ir.attachment')
template = self.browse(cr, uid, template_id, context)
values = self.generate_email(cr, uid, template_id, res_id, context=context)
attachments = values.pop('attachments') or {}
- message_id = mail_message.create(cr, uid, values, context=context)
+ msg_id = mail_message.create(cr, uid, values, context=context)
# link attachments
attachment_ids = []
for fname, fcontent in attachments.iteritems():
@@ -377,10 +387,13 @@ class email_template(osv.osv):
'datas_fname': fname,
'datas': fcontent,
'res_model': mail_message._name,
- 'res_id': message_id,
+ 'res_id': msg_id,
}
if context.has_key('default_type'):
del context['default_type']
- attachment_ids.append(ir_attachment.create(cr, uid, attachment_data, context))
+ attachment_ids.append(ir_attachment.create(cr, uid, attachment_data, context=context))
+ if force_send:
+ mail_message.send(cr, uid, [msg_id], context=context)
+ return msg_id
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/email_template/email_template_view.xml b/addons/email_template/email_template_view.xml
index d6a651f0bc2..507dae3cd25 100644
--- a/addons/email_template/email_template_view.xml
+++ b/addons/email_template/email_template_view.xml
@@ -155,9 +155,8 @@
-
-
+
diff --git a/addons/email_template/html2text.py b/addons/email_template/html2text.py
index 2479843777a..745381850e3 100755
--- a/addons/email_template/html2text.py
+++ b/addons/email_template/html2text.py
@@ -453,3 +453,5 @@ if __name__ == "__main__":
data = sys.stdin.read().decode('utf8')
wrapwrite(html2text(data, baseurl))
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/email_template/res_partner.py b/addons/email_template/res_partner.py
new file mode 100644
index 00000000000..a451b171b70
--- /dev/null
+++ b/addons/email_template/res_partner.py
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (c) 2011 OpenERP S.A.
+#
+# 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 .
+#
+##############################################################################
+
+from osv import fields,osv
+
+class res_partner(osv.osv):
+ """Inherit res.partner to add a generic opt-out field that can be used
+ to restrict usage of automatic email templates.
+ This field is unused by default. """
+ _inherit = 'res.partner'
+
+ _columns = {
+ 'opt_out': fields.boolean('Opt-out', help="If checked, this partner will not receive any automated email " \
+ "notifications, such as the availability of invoices."),
+ }
+
+ _defaults = {
+ 'opt_out': False,
+ }
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/email_template/res_partner_demo.yml b/addons/email_template/res_partner_demo.yml
new file mode 100644
index 00000000000..8eaf48f9e87
--- /dev/null
+++ b/addons/email_template/res_partner_demo.yml
@@ -0,0 +1,9 @@
+-
+ Set opt-out to True on all demo partners
+-
+ !python {model: res.partner}: |
+ partner_ids = self.search(cr, uid, [])
+ # assume partners with an external ID come from demo data
+ ext_ids = self._get_external_ids(cr, uid, partner_ids)
+ ids_to_update = [k for (k,v) in ext_ids.iteritems() if v]
+ self.write(cr, uid, ids_to_update, {'opt_out': True})
\ No newline at end of file
diff --git a/addons/email_template/res_partner_view.xml b/addons/email_template/res_partner_view.xml
new file mode 100644
index 00000000000..0d2f919a96e
--- /dev/null
+++ b/addons/email_template/res_partner_view.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ res.partner.opt_out.form
+ res.partner
+ form
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/addons/email_template/security/ir.model.access.csv b/addons/email_template/security/ir.model.access.csv
index f5f61240a96..d2d6adf3bf3 100644
--- a/addons/email_template/security/ir.model.access.csv
+++ b/addons/email_template/security/ir.model.access.csv
@@ -1,4 +1,5 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_email_template","email.template","model_email_template",,1,0,0,0
-"access_email_template_system","email.template system","model_email_template","base.group_system",1,1,1,1
-"access_email_template_manager","email.template","model_email_template",,1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_email_template,email.template,model_email_template,,1,0,0,0
+access_email_template_system,email.template system,model_email_template,base.group_system,1,1,1,1
+access_email_template_manager,email.template,model_email_template,,1,1,1,1
+access_email_template_preview_system,email.template.preview system,model_email_template_preview,base.group_system,1,1,1,1
diff --git a/addons/email_template/wizard/__init__.py b/addons/email_template/wizard/__init__.py
index b9ac29ec4c2..c979c90acd0 100644
--- a/addons/email_template/wizard/__init__.py
+++ b/addons/email_template/wizard/__init__.py
@@ -22,3 +22,5 @@
import email_template_preview
import mail_compose_message
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/email_template/wizard/email_template_preview.py b/addons/email_template/wizard/email_template_preview.py
index 650b714866d..4ef0e9fa156 100644
--- a/addons/email_template/wizard/email_template_preview.py
+++ b/addons/email_template/wizard/email_template_preview.py
@@ -87,6 +87,8 @@ class email_template_preview(osv.osv_memory):
signature = self.pool.get('res.users').browse(cr, uid, uid, context).signature
description += '\n' + signature
vals['body_text'] = description
+ if template.body_html:
+ vals['body_html'] = self.render_template(cr, uid, template.body_html, model, res_id, context) or ''
vals['report_name'] = self.render_template(cr, uid, template.report_name, model, res_id, context)
return {'value': vals}
diff --git a/addons/event/__openerp__.py b/addons/event/__openerp__.py
index 1890ed7bf84..465e01cdda3 100644
--- a/addons/event/__openerp__.py
+++ b/addons/event/__openerp__.py
@@ -21,9 +21,9 @@
{
- 'name': 'Event',
+ 'name': 'Events Organisation',
'version': '0.1',
- 'category': 'Hidden',
+ 'category': 'Tools',
'complexity': "easy",
'description': """
Organization and management of Events.
diff --git a/addons/event/board_association_view.xml b/addons/event/board_association_view.xml
index 78fc8395341..02d45f03dc1 100644
--- a/addons/event/board_association_view.xml
+++ b/addons/event/board_association_view.xml
@@ -40,24 +40,20 @@
form
-
-
+
+
-
+
-
-
+
+
-
-
+ name="%(act_event_reg)d"/>
+
+
diff --git a/addons/event/event.py b/addons/event/event.py
index ba802ef1ffa..ab575408c63 100644
--- a/addons/event/event.py
+++ b/addons/event/event.py
@@ -296,6 +296,7 @@ class event_registration(osv.osv):
return res
_columns = {
+ 'id': fields.integer('ID'),
'name': fields.char('Summary', size=124, readonly=True, states={'draft': [('readonly', False)]}),
'email_cc': fields.text('CC', size=252, readonly=False, states={'done': [('readonly', True)]}, help="These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma"),
'nb_register': fields.integer('Quantity', required=True, readonly=True, states={'draft': [('readonly', False)]}, help="Number of Registrations or Tickets"),
diff --git a/addons/event/event_view.xml b/addons/event/event_view.xml
index 6a057fe204d..31fb353c113 100644
--- a/addons/event/event_view.xml
+++ b/addons/event/event_view.xml
@@ -388,7 +388,7 @@
-
+
@@ -398,32 +398,6 @@
context="{'mail.compose.message.mode':'reply', 'message_id':active_id}"
icon="terp-mail-replied" type="action" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\n"
"Language-Team: Czech \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:58+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-11-26 05:49+0000\n"
+"X-Generator: Launchpad (build 14381)\n"
"X-Poedit-Language: Czech\n"
#. module: event
@@ -220,7 +220,7 @@ msgstr "Odpovědět"
#. module: event
#: model:ir.actions.act_window,name:event.open_board_associations_manager
msgid "Event Dashboard"
-msgstr "Nástěnka uválosti"
+msgstr "Nástěnka události"
#. module: event
#: model:event.event,name:event.event_1
diff --git a/addons/event/report/report_event_registration.py b/addons/event/report/report_event_registration.py
index e78179b9b5e..3ef6ecb6e3d 100644
--- a/addons/event/report/report_event_registration.py
+++ b/addons/event/report/report_event_registration.py
@@ -100,6 +100,7 @@ class report_event_registration(osv.osv):
event_registration c ON (e.id=c.event_id)
LEFT JOIN
event_type t ON (e.type=t.id)
+ WHERE c.active = 'true'
GROUP BY
to_char(e.date_begin, 'YYYY'),
to_char(e.date_begin, 'MM'),
diff --git a/addons/event/report/report_event_registration_view.xml b/addons/event/report/report_event_registration_view.xml
index 3fd24c0a366..ef69c674e43 100644
--- a/addons/event/report/report_event_registration_view.xml
+++ b/addons/event/report/report_event_registration_view.xml
@@ -53,10 +53,11 @@
-
-
+
form
tree,graph
- {"search_default_365day":1, "search_default_invoiced":1, "search_default_event":1, 'group_by_no_leaf':1, 'group_by':[]}
+ {"search_default_year":1,"search_default_this_month":1,"search_default_365day":1, "search_default_invoiced":1, "search_default_event":1, 'group_by_no_leaf':1, 'group_by':[]}
diff --git a/addons/event/security/ir.model.access.csv b/addons/event/security/ir.model.access.csv
index 59651dfa007..f79d141f148 100644
--- a/addons/event/security/ir.model.access.csv
+++ b/addons/event/security/ir.model.access.csv
@@ -1,16 +1,15 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_event_type","event.type","model_event_type","marketing.group_marketing_user",1,0,0,0
-"access_event_type_manager","event.type manager","model_event_type","marketing.group_marketing_manager",1,1,1,1
-"access_event_event","event.event","model_event_event","marketing.group_marketing_user",1,1,1,0
-"access_event_registration","event.registration","model_event_registration","marketing.group_marketing_user",1,1,1,0
-"access_report_event_registration","report.event.registration","model_report_event_registration","marketing.group_marketing_user",1,1,1,1
-"access_event_event_manager","event.event manager","model_event_event","marketing.group_marketing_manager",1,0,0,0
-"access_event_registration_manager","event.registration manager","model_event_registration","marketing.group_marketing_manager",1,0,0,0
-"access_crm_case_section_manager","crm.case.section manager","crm.model_crm_case_section","marketing.group_marketing_manager",1,1,1,1
-"access_product_product","product.product.product manager","product.model_product_product","marketing.group_marketing_manager",1,1,1,1
-"access_report_event_registration","report.event.registration","model_report_event_registration","marketing.group_marketing_manager",1,1,1,1
-"access_event_registration_badge_manager","event.registration.badge manager","model_event_registration_badge","marketing.group_marketing_manager",1,1,1,1
-"access_event_event_sale_salesman","event.event.sale","model_event_event","base.group_sale_salesman",1,0,0,0
-"access_account_account_invoice_manager","account.account.invoice","account.model_account_invoice","marketing.group_marketing_manager",1,0,0,0
-"access_event_registration_badge","event.registration.badge","model_event_registration_badge","marketing.group_marketing_user",1,0,0,0
-"access_event_registration_sale_user","event.registration.sale.user","model_event_registration","base.group_sale_salesman",1,0,0,0
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_event_type,event.type,model_event_type,marketing.group_marketing_user,1,0,0,0
+access_event_type_manager,event.type manager,model_event_type,marketing.group_marketing_manager,1,1,1,1
+access_event_event,event.event,model_event_event,marketing.group_marketing_user,1,1,1,0
+access_event_registration,event.registration,model_event_registration,marketing.group_marketing_user,1,1,1,0
+access_report_event_registration,report.event.registration,model_report_event_registration,marketing.group_marketing_user,1,1,1,1
+access_event_event_manager,event.event manager,model_event_event,marketing.group_marketing_manager,1,0,0,0
+access_event_registration_manager,event.registration manager,model_event_registration,marketing.group_marketing_manager,1,0,0,0
+access_crm_case_section_manager,crm.case.section manager,crm.model_crm_case_section,marketing.group_marketing_manager,1,1,1,1
+access_product_product,product.product.product manager,product.model_product_product,marketing.group_marketing_manager,1,1,1,1
+access_event_registration_badge_manager,event.registration.badge manager,model_event_registration_badge,marketing.group_marketing_manager,1,1,1,1
+access_event_event_sale_salesman,event.event.sale,model_event_event,base.group_sale_salesman,1,0,0,0
+access_account_account_invoice_manager,account.account.invoice,account.model_account_invoice,marketing.group_marketing_manager,1,0,0,0
+access_event_registration_badge,event.registration.badge,model_event_registration_badge,marketing.group_marketing_user,1,0,0,0
+access_event_registration_sale_user,event.registration.sale.user,model_event_registration,base.group_sale_salesman,1,0,0,0
diff --git a/addons/event_project/__openerp__.py b/addons/event_project/__openerp__.py
index e8d110bc4f8..359a5a70ae3 100644
--- a/addons/event_project/__openerp__.py
+++ b/addons/event_project/__openerp__.py
@@ -20,9 +20,9 @@
##############################################################################
{
- 'name': 'Event Project - Create Retro-Planning to manage your Events',
+ 'name': 'Retro-Planning on Events',
'version': '0.1',
- 'category': 'Hidden/Link',
+ 'category': 'Tools',
'complexity': "easy",
'description': """
Organization and management of events.
diff --git a/addons/fetchmail/__init__.py b/addons/fetchmail/__init__.py
index f9c384ce103..934df9846dd 100644
--- a/addons/fetchmail/__init__.py
+++ b/addons/fetchmail/__init__.py
@@ -21,3 +21,5 @@
##############################################################################
import fetchmail
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/fetchmail/__openerp__.py b/addons/fetchmail/__openerp__.py
index ae082aacacd..99e3e02a909 100644
--- a/addons/fetchmail/__openerp__.py
+++ b/addons/fetchmail/__openerp__.py
@@ -21,11 +21,11 @@
##############################################################################
{
- "name" : "Fetch Emails",
+ "name" : "Email Gateway",
"version" : "1.0",
"depends" : ["base", 'mail'],
"author" : "OpenERP SA",
- "category": 'Customer Relationship Management',
+ "category": 'Tools',
"description": """
Retrieve incoming email on POP / IMAP servers
=============================================
@@ -74,3 +74,5 @@ mail.
'certificate' : '00692978332890137453',
'images': ['images/1_email_servers.jpeg'],
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/fetchmail/fetchmail_installer_view.xml b/addons/fetchmail/fetchmail_installer_view.xml
index b5bd7df80ca..918b7ecd430 100644
--- a/addons/fetchmail/fetchmail_installer_view.xml
+++ b/addons/fetchmail/fetchmail_installer_view.xml
@@ -1,19 +1,5 @@
-
- Setup Incoming Mail Servers
- ir.actions.act_window
- fetchmail.server
- form
- tree,form
-
- You can connect OpenERP to your incoming mail server so that documents (leads, tasks, issues, etc) are synchronized automatically with your incoming emails.
-
-
-
-
- 4
-
diff --git a/addons/fetchmail/fetchmail_view.xml b/addons/fetchmail/fetchmail_view.xml
index 4cd182c0818..0b9720a7503 100644
--- a/addons/fetchmail/fetchmail_view.xml
+++ b/addons/fetchmail/fetchmail_view.xml
@@ -32,7 +32,7 @@
-
+
@@ -132,7 +132,7 @@
diff --git a/addons/fetchmail/i18n/sl.po b/addons/fetchmail/i18n/sl.po
new file mode 100644
index 00000000000..2cdcd56b63d
--- /dev/null
+++ b/addons/fetchmail/i18n/sl.po
@@ -0,0 +1,308 @@
+# Slovenian translation for openobject-addons
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2011-01-11 11:15+0000\n"
+"PO-Revision-Date: 2011-11-22 16:44+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Slovenian \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-11-23 05:20+0000\n"
+"X-Generator: Launchpad (build 14336)\n"
+
+#. module: fetchmail
+#: constraint:email.server:0
+msgid ""
+"Warning! Record for selected Model can not be created\n"
+"Please choose valid Model"
+msgstr ""
+
+#. module: fetchmail
+#: selection:email.server,state:0
+msgid "Confirmed"
+msgstr "Potrjeno"
+
+#. module: fetchmail
+#: view:email.server:0
+msgid "Confirm"
+msgstr "Potrdi"
+
+#. module: fetchmail
+#: view:email.server:0
+msgid "Group By..."
+msgstr "Združi po ..."
+
+#. module: fetchmail
+#: view:email.server:0
+#: field:email.server,state:0
+msgid "State"
+msgstr "Država"
+
+#. module: fetchmail
+#: view:email.server:0
+msgid "POP"
+msgstr "POP"
+
+#. module: fetchmail
+#: selection:email.server,state:0
+msgid "Not Confirmed"
+msgstr "Nepotrjeno"
+
+#. module: fetchmail
+#: field:email.server,user:0
+msgid "User Name"
+msgstr "Uporabniško Ime"
+
+#. module: fetchmail
+#: view:email.server:0
+msgid "Type"
+msgstr "Tip"
+
+#. module: fetchmail
+#: view:email.server:0
+msgid "POP/IMAP Servers"
+msgstr "POP/IMAP Strežniki"
+
+#. module: fetchmail
+#: model:ir.module.module,shortdesc:fetchmail.module_meta_information
+msgid "Fetchmail Server"
+msgstr ""
+
+#. module: fetchmail
+#: view:email.server:0
+#: field:email.server,note:0
+msgid "Description"
+msgstr "Opis"
+
+#. module: fetchmail
+#: help:email.server,object_id:0
+msgid ""
+"OpenObject Model. Generates a record of this model.\n"
+"Select Object with message_new attrbutes."
+msgstr ""
+
+#. module: fetchmail
+#: field:email.server,attach:0
+msgid "Add Attachments ?"
+msgstr "Dodaj Priloge ?"
+
+#. module: fetchmail
+#: view:email.server:0
+msgid "# of emails"
+msgstr "# od emalov"
+
+#. module: fetchmail
+#: model:ir.actions.act_window,name:fetchmail.act_server_history
+msgid "Email History"
+msgstr ""
+
+#. module: fetchmail
+#: field:email.server,user_id:0
+msgid "User"
+msgstr "Uporabnik"
+
+#. module: fetchmail
+#: field:email.server,date:0
+msgid "Date"
+msgstr "Datum"
+
+#. module: fetchmail
+#: selection:email.server,state:0
+msgid "Waiting for Verification"
+msgstr "Čaka na Potrditev"
+
+#. module: fetchmail
+#: field:email.server,password:0
+msgid "Password"
+msgstr "Geslo"
+
+#. module: fetchmail
+#: model:ir.actions.act_window,name:fetchmail.act_server_history
+#: view:mailgate.message:0
+msgid "Emails"
+msgstr "E-pošte"
+
+#. module: fetchmail
+#: view:email.server:0
+msgid "Search Email Servers"
+msgstr "Poišči Email Strežnik"
+
+#. module: fetchmail
+#: view:email.server:0
+msgid "Server & Login"
+msgstr "Strežnik in Prijava"
+
+#. module: fetchmail
+#: view:email.server:0
+msgid "Auto Reply?"
+msgstr "Avtomatski Odzivnik?"
+
+#. module: fetchmail
+#: field:email.server,name:0
+msgid "Name"
+msgstr "Ime"
+
+#. module: fetchmail
+#: model:ir.model,name:fetchmail.model_mailgate_message
+msgid "Mailgateway Message"
+msgstr ""
+
+#. module: fetchmail
+#: model:ir.actions.act_window,name:fetchmail.action_email_server_tree
+msgid "POP Servers"
+msgstr ""
+
+#. module: fetchmail
+#: view:email.server:0
+msgid "Set to Draft"
+msgstr ""
+
+#. module: fetchmail
+#: field:email.server,message_ids:0
+#: model:ir.actions.act_window,name:fetchmail.action_view_mail_message_emails
+msgid "Messages"
+msgstr "Sporočila"
+
+#. module: fetchmail
+#: model:ir.ui.menu,name:fetchmail.menu_action_fetchmail_server_tree
+msgid "Fetchmail Services"
+msgstr ""
+
+#. module: fetchmail
+#: field:email.server,server:0
+msgid "Server"
+msgstr "Strežnik"
+
+#. module: fetchmail
+#: field:email.server,active:0
+msgid "Active"
+msgstr "Aktiven"
+
+#. module: fetchmail
+#: view:email.server:0
+msgid "Process Parameter"
+msgstr "Parametri Procesa"
+
+#. module: fetchmail
+#: field:email.server,is_ssl:0
+msgid "SSL ?"
+msgstr "SSL ?"
+
+#. module: fetchmail
+#: selection:email.server,type:0
+#: selection:mailgate.message,server_type:0
+msgid "IMAP Server"
+msgstr "IMAP Strežnik"
+
+#. module: fetchmail
+#: field:email.server,object_id:0
+msgid "Model"
+msgstr ""
+
+#. module: fetchmail
+#: view:email.server:0
+msgid "IMAP"
+msgstr "IMAP"
+
+#. module: fetchmail
+#: view:email.server:0
+#: model:ir.model,name:fetchmail.model_email_server
+msgid "POP/IMAP Server"
+msgstr "POP/IMAP Strežnik"
+
+#. module: fetchmail
+#: constraint:email.server:0
+msgid "Warning! Can't have duplicate server configuration!"
+msgstr "Opozorilo! Ne morete podvojiti konfiguracije strežnika!"
+
+#. module: fetchmail
+#: field:email.server,type:0
+#: field:mailgate.message,server_type:0
+msgid "Server Type"
+msgstr "Tip Strežnika"
+
+#. module: fetchmail
+#: view:email.server:0
+msgid "Login Information"
+msgstr "Prijavni podatki"
+
+#. module: fetchmail
+#: view:email.server:0
+msgid "Server Information"
+msgstr "Podatki o strežniku"
+
+#. module: fetchmail
+#: help:email.server,attach:0
+msgid "Fetches mail with attachments if true."
+msgstr ""
+
+#. module: fetchmail
+#: selection:email.server,type:0
+#: selection:mailgate.message,server_type:0
+msgid "POP Server"
+msgstr "POP Strežnik"
+
+#. module: fetchmail
+#: field:email.server,port:0
+msgid "Port"
+msgstr "Vrata"
+
+#. module: fetchmail
+#: model:ir.module.module,description:fetchmail.module_meta_information
+msgid ""
+"Fetchmail: \n"
+" * Fetch email from Pop / IMAP server\n"
+" * Support SSL\n"
+" * Integrated with all Modules\n"
+" * Automatic Email Receive\n"
+" * Email based Records (Add, Update)\n"
+" "
+msgstr ""
+
+#. module: fetchmail
+#: view:email.server:0
+msgid "SSL"
+msgstr "SSL"
+
+#. module: fetchmail
+#: help:email.server,action_id:0
+msgid ""
+"An Email Server Action. It will be run whenever an e-mail is fetched from "
+"server."
+msgstr ""
+
+#. module: fetchmail
+#: help:email.server,priority:0
+msgid "Priority between 0 to 10, select define the order of Processing"
+msgstr ""
+
+#. module: fetchmail
+#: field:email.server,action_id:0
+msgid "Email Server Action"
+msgstr ""
+
+#. module: fetchmail
+#: field:email.server,priority:0
+msgid "Server Priority"
+msgstr ""
+
+#. module: fetchmail
+#: view:mailgate.message:0
+#: field:mailgate.message,server_id:0
+msgid "Mail Server"
+msgstr "Poštni Strežnik"
+
+#. module: fetchmail
+#: view:email.server:0
+msgid "Fetch Emails"
+msgstr ""
+
+#~ msgid "Email Servers"
+#~ msgstr "Email Strežniki"
diff --git a/addons/fetchmail/security/ir.model.access.csv b/addons/fetchmail/security/ir.model.access.csv
index bc5572de82d..7deea6eb9f4 100644
--- a/addons/fetchmail/security/ir.model.access.csv
+++ b/addons/fetchmail/security/ir.model.access.csv
@@ -1,3 +1,3 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_fetchmail_server","fetchmail.server","model_fetchmail_server",,1,0,0,0
-"access_fetchmail_server","fetchmail.server","model_fetchmail_server","base.group_system",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_fetchmail_server,fetchmail.server,model_fetchmail_server,,1,0,0,0
+access_fetchmail_server,fetchmail.server,model_fetchmail_server,base.group_system,1,1,1,1
diff --git a/addons/fetchmail_crm/__init__.py b/addons/fetchmail_crm/__init__.py
index 5831b3284bb..b5b36afb7e9 100644
--- a/addons/fetchmail_crm/__init__.py
+++ b/addons/fetchmail_crm/__init__.py
@@ -18,3 +18,5 @@
# along with this program. If not, see .
#
##############################################################################
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/fetchmail_crm/__openerp__.py b/addons/fetchmail_crm/__openerp__.py
index 66cff346d0a..5b02f4194ab 100644
--- a/addons/fetchmail_crm/__openerp__.py
+++ b/addons/fetchmail_crm/__openerp__.py
@@ -20,11 +20,11 @@
##############################################################################
{
- "name" : "Fetchmail for CRM",
+ "name" : "eMail Gateway for Leads",
"version" : "1.0",
"depends" : ["fetchmail", "crm"],
"author" : "OpenERP SA",
- "category": 'Hidden/Link',
+ "category": 'Hidden/Links',
"description": """
""",
'website': 'http://www.openerp.com',
@@ -37,3 +37,5 @@
'installable': True,
'active': False,
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/fetchmail_crm_claim/__init__.py b/addons/fetchmail_crm_claim/__init__.py
index 5831b3284bb..b5b36afb7e9 100644
--- a/addons/fetchmail_crm_claim/__init__.py
+++ b/addons/fetchmail_crm_claim/__init__.py
@@ -18,3 +18,5 @@
# along with this program. If not, see .
#
##############################################################################
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/fetchmail_crm_claim/__openerp__.py b/addons/fetchmail_crm_claim/__openerp__.py
index cfe6a675d20..d6d56ecf331 100644
--- a/addons/fetchmail_crm_claim/__openerp__.py
+++ b/addons/fetchmail_crm_claim/__openerp__.py
@@ -20,11 +20,11 @@
##############################################################################
{
- "name" : "Fetchmail for CRM Claim",
+ "name" : "eMail Gateway for CRM Claim",
"version" : "1.0",
"depends" : ["fetchmail", "crm_claim"],
"author" : "OpenERP SA",
- "category": 'Hidden/Link',
+ 'category': 'Hidden/Links',
"description": """
""",
'website': 'http://www.openerp.com',
@@ -37,3 +37,5 @@
'installable': True,
'active': False,
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/fetchmail_hr_recruitment/__init__.py b/addons/fetchmail_hr_recruitment/__init__.py
index 5831b3284bb..b5b36afb7e9 100644
--- a/addons/fetchmail_hr_recruitment/__init__.py
+++ b/addons/fetchmail_hr_recruitment/__init__.py
@@ -18,3 +18,5 @@
# along with this program. If not, see .
#
##############################################################################
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/fetchmail_hr_recruitment/__openerp__.py b/addons/fetchmail_hr_recruitment/__openerp__.py
index 75531097645..3ce76226888 100644
--- a/addons/fetchmail_hr_recruitment/__openerp__.py
+++ b/addons/fetchmail_hr_recruitment/__openerp__.py
@@ -20,11 +20,11 @@
##############################################################################
{
- "name" : "Fetchmail for Applicants",
+ "name" : "eMail Gateway for Applicants",
"version" : "1.0",
"depends" : ["fetchmail", "hr_recruitment"],
"author" : "OpenERP SA",
- "category": 'Hidden/Link',
+ "category": "Hidden/Links",
"description": """
""",
'website': 'http://www.openerp.com',
@@ -37,3 +37,5 @@
'installable': True,
'active': False,
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/fetchmail_project_issue/__init__.py b/addons/fetchmail_project_issue/__init__.py
index 5831b3284bb..b5b36afb7e9 100644
--- a/addons/fetchmail_project_issue/__init__.py
+++ b/addons/fetchmail_project_issue/__init__.py
@@ -18,3 +18,5 @@
# along with this program. If not, see .
#
##############################################################################
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/fetchmail_project_issue/__openerp__.py b/addons/fetchmail_project_issue/__openerp__.py
index 1165949108a..d4c4b4bbe70 100644
--- a/addons/fetchmail_project_issue/__openerp__.py
+++ b/addons/fetchmail_project_issue/__openerp__.py
@@ -20,11 +20,11 @@
##############################################################################
{
- "name" : "Fetchmail for Project Issue",
+ "name" : "eMail Gateway for Project Issues",
"version" : "1.0",
"depends" : ["fetchmail", "project_issue"],
"author" : "OpenERP SA",
- "category": 'Hidden/Link',
+ "category": "Hidden/Links",
"description": """
""",
'website': 'http://www.openerp.com',
@@ -37,3 +37,5 @@
'installable': True,
'active': False,
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/google_base_account/__openerp__.py b/addons/google_base_account/__openerp__.py
index 19afc18bf09..ec204f0f77c 100644
--- a/addons/google_base_account/__openerp__.py
+++ b/addons/google_base_account/__openerp__.py
@@ -21,9 +21,9 @@
{
- 'name': 'Google user',
+ 'name': 'Google Users',
'version': '1.0',
- 'category': 'Hidden',
+ 'category': 'Tools',
'description': """The module adds google user in res user""",
'author': 'OpenERP SA',
'website': 'http://www.openerp.com',
@@ -36,6 +36,5 @@
'demo_xml': [],
'installable': True,
'active': False,
- 'certificate': '',
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/google_map/__openerp__.py b/addons/google_map/__openerp__.py
index 48c393409e4..f2f9ff4e668 100644
--- a/addons/google_map/__openerp__.py
+++ b/addons/google_map/__openerp__.py
@@ -21,9 +21,9 @@
{
- 'name': 'Google Map',
+ 'name': 'Google Maps on Customers',
'version': '1.0',
- 'category': 'Hidden',
+ 'category': 'Customer Relationship Management',
'description': """
The module adds Google Map field in partner address.
====================================================
diff --git a/addons/hr/__openerp__.py b/addons/hr/__openerp__.py
index 900c689dfbf..254bb2c28bf 100644
--- a/addons/hr/__openerp__.py
+++ b/addons/hr/__openerp__.py
@@ -20,7 +20,7 @@
##############################################################################
{
- "name": "Human Resources",
+ "name": "Employee Address Book",
"version": "1.1",
"author": "OpenERP SA",
"category": "Human Resources",
@@ -54,7 +54,10 @@ You can manage:
'hr_demo.xml',
'hr_department_demo.xml',
],
- 'test': ['test/test_hr.yml'],
+ 'test': [
+ 'test/open2recruit2close_job.yml',
+ 'test/hr_demo.yml',
+ ],
'installable': True,
'active': False,
'certificate': '0086710558965',
diff --git a/addons/hr/hr.py b/addons/hr/hr.py
index f641a425e18..e903f03d974 100644
--- a/addons/hr/hr.py
+++ b/addons/hr/hr.py
@@ -79,12 +79,28 @@ class hr_job(osv.osv):
}
return res
+ def _get_job_position(self, cr, uid, ids, context=None):
+ res = []
+ for employee in self.pool.get('hr.employee').browse(cr, uid, ids, context=context):
+ if employee.job_id:
+ res.append(employee.job_id.id)
+ return res
+
_name = "hr.job"
_description = "Job Description"
_columns = {
'name': fields.char('Job Name', size=128, required=True, select=True),
- 'expected_employees': fields.function(_no_of_employee, string='Expected Employees', help='Required number of Employees in total for that job.', multi="no_of_employee", store=True),
- 'no_of_employee': fields.function(_no_of_employee, string="No of Employee", help='Number of employee with that job.', multi="no_of_employee", store=True),
+ 'expected_employees': fields.function(_no_of_employee, string='Expected Employees', help='Required number of employees in total for that job.',
+ store = {
+ 'hr.job': (lambda self,cr,uid,ids,c=None: ids, ['no_of_recruitment'], 10),
+ 'hr.employee': (_get_job_position, ['job_id'], 10),
+ },
+ multi='no_of_employee'),
+ 'no_of_employee': fields.function(_no_of_employee, string="Number of Employees", help='Number of employees with that job.',
+ store = {
+ 'hr.employee': (_get_job_position, ['job_id'], 10),
+ },
+ multi='no_of_employee'),
'no_of_recruitment': fields.float('Expected in Recruitment'),
'employee_ids': fields.one2many('hr.employee', 'job_id', 'Employees'),
'description': fields.text('Job Description'),
@@ -98,7 +114,7 @@ class hr_job(osv.osv):
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'hr.job', context=c),
'state': 'open',
}
-
+
_sql_constraints = [
('name_company_uniq', 'unique(name, company_id)', 'The name of the job position must be unique per company!'),
]
@@ -242,7 +258,7 @@ class res_users(osv.osv):
def create(self, cr, uid, data, context=None):
user_id = super(res_users, self).create(cr, uid, data, context=context)
-
+
# add shortcut unless 'noshortcut' is True in context
if not(context and context.get('noshortcut', False)):
data_obj = self.pool.get('ir.model.data')
@@ -254,7 +270,7 @@ class res_users(osv.osv):
except:
# Tolerate a missing shortcut. See product/product.py for similar code.
logging.getLogger('orm').debug('Skipped meetings shortcut for user "%s"', data.get('name','form
-
-
-
-
-
-
+
+
+
+
@@ -27,7 +25,7 @@
-
+
@@ -38,12 +36,10 @@
form
-
-
-
-
-
-
+
+
+
+
diff --git a/addons/hr/hr_demo.xml b/addons/hr/hr_demo.xml
index dbfead793e5..15269a88375 100644
--- a/addons/hr/hr_demo.xml
+++ b/addons/hr/hr_demo.xml
@@ -54,17 +54,40 @@
-
- Quentin Paolino
-
-
-
-
-
Antoine Philippe
+
+
+
+
+
+ Quentin Paolino
+
+
+
+
+
+
+
+ John Smith
+
+
+
+
+
+
+ Thomas McQueen
+
+
+
+
+
+
+ Vanessa Dupont
+
+
diff --git a/addons/hr/hr_department_demo.xml b/addons/hr/hr_department_demo.xml
index 433e77a6dd4..5ac57db52a3 100644
--- a/addons/hr/hr_department_demo.xml
+++ b/addons/hr/hr_department_demo.xml
@@ -26,31 +26,34 @@
IT
+
Marketing
-
Sales
+
Sales Europe
+
Sales America
+
@@ -106,7 +109,19 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/hr/hr_department_view.xml b/addons/hr/hr_department_view.xml
index 9fdb64651f5..a48103ad2e0 100644
--- a/addons/hr/hr_department_view.xml
+++ b/addons/hr/hr_department_view.xml
@@ -19,14 +19,6 @@
-
-
-
-
-
-
-
-
diff --git a/addons/hr/hr_view.xml b/addons/hr/hr_view.xml
index 8b16022ec91..f51280f4465 100644
--- a/addons/hr/hr_view.xml
+++ b/addons/hr/hr_view.xml
@@ -131,45 +131,46 @@
hr.employee
kanban
-
+
+
+
+
-
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
- ,
-
-
-
-
- ,
-
-
-
-
-
+
+
+ ❖
+
+
+ ✜
+
+
+ ✉
+
+
+ ☎
+
+
+ ☏
+
+
@@ -184,7 +185,7 @@
tree
tree,form
-
[('parent_id','=',False),('user_id','=',uid)]
+
[('parent_id','=',False)]
@@ -201,21 +202,26 @@
Employees
hr.employee
form
-
tree,form,kanban
+
kanban,tree,form
[]
{"search_default_department_id": department_id,"search_default_active":eval('True')}
-
+
Here you can manage your work force by creating employees and assigning them specific properties in the system. Maintain all employee related information and keep track of anything that needs to be recorded for them. The personal information tab will help you maintain their identity data. The Categories tab gives you the opportunity to assign them related employee categories depending on their position and activities within the company. A category can be a seniority level within the company or a department. The Timesheets tab allows to assign them a specific timesheet and analytic journal where they will be able to enter time through the system. In the note tab, you can enter text data that should be recorded for a specific employee.
-
+
+
+
+ kanban
+
+
tree
-
+
form
@@ -344,6 +350,7 @@
hr.employee
form
tree,form
+ [('category_ids','=', active_ids)]
@@ -351,7 +358,6 @@
Employees by Categories
-
, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2011-01-11 11:15+0000\n"
+"PO-Revision-Date: 2011-11-21 12:43+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Bengali \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-11-22 05:00+0000\n"
+"X-Generator: Launchpad (build 14299)\n"
+
+#. module: hr
+#: model:process.node,name:hr.process_node_openerpuser0
+msgid "Openerp user"
+msgstr "Openerp ব্যাবহারকারী"
+
+#. module: hr
+#: view:hr.job:0
+#: field:hr.job,requirements:0
+msgid "Requirements"
+msgstr "আবশ্যকতা"
+
+#. module: hr
+#: constraint:hr.department:0
+msgid "Error! You can not create recursive departments."
+msgstr "ভুল! আপনি রিকারসিভ দপ্তর তৈরি করতে পারবেন না।"
+
+#. module: hr
+#: model:process.transition,name:hr.process_transition_contactofemployee0
+msgid "Link the employee to information"
+msgstr "তথ্যের সাথে কর্মচারী যুক্ত করুন"
+
+#. module: hr
+#: field:hr.employee,sinid:0
+msgid "SIN No"
+msgstr "ন্যাশনাল আইডি নং"
+
+#. module: hr
+#: model:ir.module.module,shortdesc:hr.module_meta_information
+#: model:ir.ui.menu,name:hr.menu_hr_deshboard
+#: model:ir.ui.menu,name:hr.menu_hr_main
+#: model:ir.ui.menu,name:hr.menu_hr_management
+#: model:ir.ui.menu,name:hr.menu_hr_root
+msgid "Human Resources"
+msgstr "জনসম্পদ"
+
+#. module: hr
+#: view:hr.employee:0
+#: view:hr.job:0
+msgid "Group By..."
+msgstr "...দিয়ে গ্রুপ করুন"
+
+#. module: hr
+#: model:ir.actions.act_window,help:hr.action_hr_job
+msgid ""
+"Job Positions are used to define jobs and their requirements. You can keep "
+"track of the number of employees you have per job position and how many you "
+"expect in the future. You can also attach a survey to a job position that "
+"will be used in the recruitment process to evaluate the applicants for this "
+"job position."
+msgstr ""
+
+#. module: hr
+#: view:hr.employee:0
+#: field:hr.employee,department_id:0
+#: view:hr.job:0
+#: field:hr.job,department_id:0
+#: view:res.users:0
+msgid "Department"
+msgstr "বিভাগ"
+
+#. module: hr
+#: help:hr.installer,hr_attendance:0
+msgid "Simplifies the management of employee's attendances."
+msgstr "কর্মচারী উপস্থিতি ম্যানেজমেন্ট সহজতর করে"
+
+#. module: hr
+#: view:hr.job:0
+msgid "Mark as Old"
+msgstr ""
+
+#. module: hr
+#: view:hr.job:0
+msgid "Jobs"
+msgstr "কাজ"
+
+#. module: hr
+#: view:hr.job:0
+msgid "In Recruitment"
+msgstr "নিয়োগপ্রাপ্ত"
+
+#. module: hr
+#: view:hr.installer:0
+msgid "title"
+msgstr "শিরোনাম"
+
+#. module: hr
+#: field:hr.department,company_id:0
+#: view:hr.employee:0
+#: view:hr.job:0
+#: field:hr.job,company_id:0
+msgid "Company"
+msgstr "কোম্পানি"
+
+#. module: hr
+#: field:hr.job,no_of_recruitment:0
+msgid "Expected in Recruitment"
+msgstr "নিয়োগে কাম্য"
+
+#. module: hr
+#: model:ir.ui.menu,name:hr.menu_open_view_attendance_reason_config
+msgid "Holidays"
+msgstr "ছুটির দিন"
+
+#. module: hr
+#: help:hr.installer,hr_holidays:0
+msgid "Tracks employee leaves, allocation requests and planning."
+msgstr "কর্মচারীদের ছুটির হিসাব রাখে"
+
+#. module: hr
+#: model:ir.model,name:hr.model_hr_employee_marital_status
+msgid "Employee Marital Status"
+msgstr "কর্মচারীর বৈবাহিক অবস্থা"
+
+#. module: hr
+#: help:hr.employee,partner_id:0
+msgid ""
+"Partner that is related to the current employee. Accounting transaction will "
+"be written on this partner belongs to employee."
+msgstr ""
+
+#. module: hr
+#: model:process.transition,name:hr.process_transition_employeeuser0
+msgid "Link a user to an employee"
+msgstr ""
+
+#. module: hr
+#: field:hr.installer,hr_contract:0
+msgid "Employee's Contracts"
+msgstr ""
+
+#. module: hr
+#: help:hr.installer,hr_payroll:0
+msgid "Generic Payroll system."
+msgstr ""
+
+#. module: hr
+#: view:hr.employee:0
+msgid "My Departments Employee"
+msgstr ""
+
+#. module: hr
+#: model:hr.employee.marital.status,name:hr.hr_employee_marital_status_married
+msgid "Married"
+msgstr ""
+
+#. module: hr
+#: constraint:hr.employee:0
+msgid ""
+"Error ! You cannot select a department for which the employee is the manager."
+msgstr ""
+
+#. module: hr
+#: help:hr.employee,passport_id:0
+msgid "Employee Passport Information"
+msgstr ""
+
+#. module: hr
+#: model:ir.actions.act_window,help:hr.open_module_tree_department
+msgid ""
+"Your Company's Department Structure is used to manage all documents related "
+"to employees by departments: expenses and timesheet validation, leaves "
+"management, recruitments, etc."
+msgstr ""
+
+#. module: hr
+#: view:hr.employee:0
+msgid "Position"
+msgstr "পদ"
+
+#. module: hr
+#: model:ir.actions.act_window,name:hr.action2
+msgid "Employee Hierarchy"
+msgstr ""
+
+#. module: hr
+#: model:process.transition,note:hr.process_transition_employeeuser0
+msgid ""
+"The Related user field on the Employee form allows to link the OpenERP user "
+"(and her rights) to the employee."
+msgstr ""
+
+#. module: hr
+#: view:hr.job:0
+#: selection:hr.job,state:0
+msgid "In Recruitement"
+msgstr ""
+
+#. module: hr
+#: field:hr.employee,identification_id:0
+msgid "Identification No"
+msgstr ""
+
+#. module: hr
+#: field:hr.job,no_of_employee:0
+msgid "No of Employee"
+msgstr ""
+
+#. module: hr
+#: selection:hr.employee,gender:0
+msgid "Female"
+msgstr "মহিলা"
+
+#. module: hr
+#: help:hr.installer,hr_timesheet_sheet:0
+msgid ""
+"Tracks and helps employees encode and validate timesheets and attendances."
+msgstr ""
+
+#. module: hr
+#: field:hr.installer,hr_evaluation:0
+msgid "Periodic Evaluations"
+msgstr ""
+
+#. module: hr
+#: field:hr.installer,hr_timesheet_sheet:0
+msgid "Timesheets"
+msgstr ""
+
+#. module: hr
+#: model:ir.actions.act_window,name:hr.open_view_employee_tree
+msgid "Employees Structure"
+msgstr ""
+
+#. module: hr
+#: view:hr.employee:0
+msgid "Social IDs"
+msgstr ""
+
+#. module: hr
+#: help:hr.job,no_of_employee:0
+msgid "Number of employee with that job."
+msgstr ""
+
+#. module: hr
+#: field:hr.employee,work_phone:0
+msgid "Work Phone"
+msgstr "কর্মস্থলের ফোন"
+
+#. module: hr
+#: field:hr.employee.category,child_ids:0
+msgid "Child Categories"
+msgstr ""
+
+#. module: hr
+#: view:hr.job:0
+#: field:hr.job,description:0
+#: model:ir.model,name:hr.model_hr_job
+msgid "Job Description"
+msgstr ""
+
+#. module: hr
+#: field:hr.employee,work_location:0
+msgid "Office Location"
+msgstr ""
+
+#. module: hr
+#: view:hr.employee:0
+#: view:hr.job:0
+#: model:ir.model,name:hr.model_hr_employee
+#: model:process.node,name:hr.process_node_employee0
+msgid "Employee"
+msgstr ""
+
+#. module: hr
+#: model:process.node,note:hr.process_node_employeecontact0
+msgid "Other information"
+msgstr ""
+
+#. module: hr
+#: field:hr.employee,work_email:0
+msgid "Work E-mail"
+msgstr ""
+
+#. module: hr
+#: field:hr.department,complete_name:0
+#: field:hr.employee.category,complete_name:0
+msgid "Name"
+msgstr "নাম"
+
+#. module: hr
+#: field:hr.employee,birthday:0
+msgid "Date of Birth"
+msgstr "জন্মদিন"
+
+#. module: hr
+#: model:ir.ui.menu,name:hr.menu_hr_reporting
+msgid "Reporting"
+msgstr ""
+
+#. module: hr
+#: model:ir.model,name:hr.model_ir_actions_act_window
+msgid "ir.actions.act_window"
+msgstr ""
+
+#. module: hr
+#: model:ir.actions.act_window,name:hr.open_board_hr
+msgid "Human Resources Dashboard"
+msgstr ""
+
+#. module: hr
+#: view:hr.employee:0
+#: field:hr.employee,job_id:0
+#: view:hr.job:0
+msgid "Job"
+msgstr ""
+
+#. module: hr
+#: view:hr.department:0
+#: field:hr.department,member_ids:0
+msgid "Members"
+msgstr ""
+
+#. module: hr
+#: model:ir.ui.menu,name:hr.menu_hr_configuration
+msgid "Configuration"
+msgstr ""
+
+#. module: hr
+#: view:hr.installer:0
+msgid ""
+"You can enhance the base HR Application by installing few HR-related "
+"functionalities."
+msgstr ""
+
+#. module: hr
+#: view:hr.employee:0
+msgid "Categories"
+msgstr ""
+
+#. module: hr
+#: field:hr.job,expected_employees:0
+msgid "Expected Employees"
+msgstr ""
+
+#. module: hr
+#: help:hr.employee,sinid:0
+msgid "Social Insurance Number"
+msgstr ""
+
+#. module: hr
+#: model:hr.employee.marital.status,name:hr.hr_employee_marital_status_divorced
+msgid "Divorced"
+msgstr ""
+
+#. module: hr
+#: field:hr.employee.category,parent_id:0
+msgid "Parent Category"
+msgstr ""
+
+#. module: hr
+#: constraint:hr.employee.category:0
+msgid "Error ! You cannot create recursive Categories."
+msgstr ""
+
+#. module: hr
+#: view:hr.department:0
+#: model:ir.actions.act_window,name:hr.open_module_tree_department
+#: model:ir.ui.menu,name:hr.menu_hr_department_tree
+#: view:res.users:0
+#: field:res.users,context_department_id:0
+msgid "Departments"
+msgstr ""
+
+#. module: hr
+#: model:process.node,name:hr.process_node_employeecontact0
+msgid "Employee Contact"
+msgstr ""
+
+#. module: hr
+#: view:board.board:0
+msgid "My Board"
+msgstr ""
+
+#. module: hr
+#: selection:hr.employee,gender:0
+msgid "Male"
+msgstr ""
+
+#. module: hr
+#: field:hr.installer,progress:0
+msgid "Configuration Progress"
+msgstr ""
+
+#. module: hr
+#: model:ir.actions.act_window,name:hr.open_view_categ_form
+#: model:ir.ui.menu,name:hr.menu_view_employee_category_form
+msgid "Categories of Employee"
+msgstr ""
+
+#. module: hr
+#: view:hr.employee.category:0
+#: model:ir.model,name:hr.model_hr_employee_category
+msgid "Employee Category"
+msgstr ""
+
+#. module: hr
+#: field:hr.installer,config_logo:0
+msgid "Image"
+msgstr ""
+
+#. module: hr
+#: model:process.process,name:hr.process_process_employeecontractprocess0
+msgid "Employee Contract"
+msgstr ""
+
+#. module: hr
+#: help:hr.installer,hr_evaluation:0
+msgid ""
+"Lets you create and manage the periodic evaluation and performance review of "
+"employees."
+msgstr ""
+
+#. module: hr
+#: model:ir.model,name:hr.model_hr_department
+msgid "hr.department"
+msgstr ""
+
+#. module: hr
+#: help:hr.employee,parent_id:0
+msgid "It is linked with manager of Department"
+msgstr ""
+
+#. module: hr
+#: field:hr.installer,hr_recruitment:0
+msgid "Recruitment Process"
+msgstr ""
+
+#. module: hr
+#: field:hr.employee,category_ids:0
+#: field:hr.employee.category,name:0
+msgid "Category"
+msgstr ""
+
+#. module: hr
+#: model:ir.actions.act_window,help:hr.open_view_employee_list_my
+msgid ""
+"Here you can manage your work force by creating employees and assigning them "
+"specific properties in the system. Maintain all employee related information "
+"and keep track of anything that needs to be recorded for them. The personal "
+"information tab will help you maintain their identity data. The Categories "
+"tab gives you the opportunity to assign them related employee categories "
+"depending on their position and activities within the company. A category "
+"can be a seniority level within the company or a department. The Timesheets "
+"tab allows to assign them a specific timesheet and analytic journal where "
+"they will be able to enter time through the system. In the note tab, you can "
+"enter text data that should be recorded for a specific employee."
+msgstr ""
+
+#. module: hr
+#: help:hr.employee,bank_account_id:0
+msgid "Employee bank salary account"
+msgstr ""
+
+#. module: hr
+#: field:hr.department,note:0
+msgid "Note"
+msgstr ""
+
+#. module: hr
+#: constraint:res.users:0
+msgid "The chosen company is not in the allowed companies for this user"
+msgstr ""
+
+#. module: hr
+#: view:hr.employee:0
+msgid "Contact Information"
+msgstr ""
+
+#. module: hr
+#: field:hr.employee,address_id:0
+msgid "Working Address"
+msgstr ""
+
+#. module: hr
+#: model:ir.actions.act_window,name:hr.open_board_hr_manager
+msgid "HR Manager Dashboard"
+msgstr ""
+
+#. module: hr
+#: view:hr.employee:0
+msgid "Status"
+msgstr ""
+
+#. module: hr
+#: view:hr.installer:0
+msgid "Configure"
+msgstr ""
+
+#. module: hr
+#: model:ir.actions.act_window,name:hr.open_view_categ_tree
+#: model:ir.ui.menu,name:hr.menu_view_employee_category_tree
+msgid "Categories structure"
+msgstr ""
+
+#. module: hr
+#: field:hr.employee,partner_id:0
+msgid "unknown"
+msgstr ""
+
+#. module: hr
+#: field:hr.installer,hr_holidays:0
+msgid "Holidays / Leaves Management"
+msgstr ""
+
+#. module: hr
+#: field:hr.employee,ssnid:0
+msgid "SSN No"
+msgstr ""
+
+#. module: hr
+#: view:hr.employee:0
+msgid "Active"
+msgstr ""
+
+#. module: hr
+#: constraint:hr.employee:0
+msgid "Error ! You cannot create recursive Hierarchy of Employees."
+msgstr ""
+
+#. module: hr
+#: view:hr.department:0
+msgid "Companies"
+msgstr ""
+
+#. module: hr
+#: model:ir.module.module,description:hr.module_meta_information
+msgid ""
+"\n"
+" Module for human resource management. You can manage:\n"
+" * Employees and hierarchies : You can define your employee with User and "
+"display hierarchies\n"
+" * HR Departments\n"
+" * HR Jobs\n"
+" "
+msgstr ""
+
+#. module: hr
+#: model:process.transition,note:hr.process_transition_contactofemployee0
+msgid ""
+"In the Employee form, there are different kind of information like Contact "
+"information."
+msgstr ""
+
+#. module: hr
+#: help:hr.job,expected_employees:0
+msgid "Required number of Employees in total for that job."
+msgstr ""
+
+#. module: hr
+#: selection:hr.job,state:0
+msgid "Old"
+msgstr ""
+
+#. module: hr
+#: field:hr.employee.marital.status,description:0
+msgid "Status Description"
+msgstr ""
+
+#. module: hr
+#: sql_constraint:res.users:0
+msgid "You can not have two users with the same login !"
+msgstr ""
+
+#. module: hr
+#: view:hr.job:0
+#: field:hr.job,state:0
+msgid "State"
+msgstr ""
+
+#. module: hr
+#: field:hr.employee,marital:0
+#: view:hr.employee.marital.status:0
+#: field:hr.employee.marital.status,name:0
+#: model:ir.actions.act_window,name:hr.action_hr_marital_status
+#: model:ir.ui.menu,name:hr.hr_menu_marital_status
+msgid "Marital Status"
+msgstr ""
+
+#. module: hr
+#: help:hr.installer,hr_recruitment:0
+msgid "Helps you manage and streamline your recruitment process."
+msgstr ""
+
+#. module: hr
+#: model:process.node,note:hr.process_node_employee0
+msgid "Employee form and structure"
+msgstr ""
+
+#. module: hr
+#: field:hr.employee,photo:0
+msgid "Photo"
+msgstr ""
+
+#. module: hr
+#: model:ir.model,name:hr.model_res_users
+msgid "res.users"
+msgstr ""
+
+#. module: hr
+#: field:hr.installer,hr_payroll_account:0
+msgid "Payroll Accounting"
+msgstr ""
+
+#. module: hr
+#: view:hr.employee:0
+msgid "Personal Information"
+msgstr ""
+
+#. module: hr
+#: field:hr.employee,passport_id:0
+msgid "Passport No"
+msgstr ""
+
+#. module: hr
+#: view:res.users:0
+msgid "Current Activity"
+msgstr ""
+
+#. module: hr
+#: help:hr.installer,hr_expense:0
+msgid ""
+"Tracks and manages employee expenses, and can automatically re-invoice "
+"clients if the expenses are project-related."
+msgstr ""
+
+#. module: hr
+#: view:hr.job:0
+msgid "Current"
+msgstr ""
+
+#. module: hr
+#: field:hr.department,parent_id:0
+msgid "Parent Department"
+msgstr ""
+
+#. module: hr
+#: view:hr.employee.category:0
+msgid "Employees Categories"
+msgstr ""
+
+#. module: hr
+#: field:hr.employee,address_home_id:0
+msgid "Home Address"
+msgstr ""
+
+#. module: hr
+#: field:hr.installer,hr_attendance:0
+#: model:ir.ui.menu,name:hr.menu_open_view_attendance_reason_new_config
+msgid "Attendances"
+msgstr ""
+
+#. module: hr
+#: view:hr.employee.marital.status:0
+#: view:hr.job:0
+msgid "Description"
+msgstr ""
+
+#. module: hr
+#: help:hr.installer,hr_contract:0
+msgid "Extends employee profiles to help manage their contracts."
+msgstr ""
+
+#. module: hr
+#: field:hr.installer,hr_payroll:0
+msgid "Payroll"
+msgstr ""
+
+#. module: hr
+#: model:hr.employee.marital.status,name:hr.hr_employee_marital_status_single
+msgid "Single"
+msgstr ""
+
+#. module: hr
+#: field:hr.job,name:0
+msgid "Job Name"
+msgstr ""
+
+#. module: hr
+#: view:hr.job:0
+#: selection:hr.job,state:0
+msgid "In Position"
+msgstr ""
+
+#. module: hr
+#: field:hr.employee,mobile_phone:0
+msgid "Mobile"
+msgstr ""
+
+#. module: hr
+#: view:hr.department:0
+msgid "department"
+msgstr ""
+
+#. module: hr
+#: field:hr.employee,country_id:0
+msgid "Nationality"
+msgstr ""
+
+#. module: hr
+#: view:hr.department:0
+#: view:hr.employee:0
+#: field:hr.employee,notes:0
+msgid "Notes"
+msgstr ""
+
+#. module: hr
+#: model:ir.model,name:hr.model_hr_installer
+msgid "hr.installer"
+msgstr ""
+
+#. module: hr
+#: view:board.board:0
+msgid "HR Manager Board"
+msgstr ""
+
+#. module: hr
+#: field:hr.employee,resource_id:0
+msgid "Resource"
+msgstr ""
+
+#. module: hr
+#: view:hr.installer:0
+#: model:ir.actions.act_window,name:hr.action_hr_installer
+msgid "Human Resources Application Configuration"
+msgstr ""
+
+#. module: hr
+#: field:hr.employee,gender:0
+msgid "Gender"
+msgstr ""
+
+#. module: hr
+#: view:hr.employee:0
+#: field:hr.job,employee_ids:0
+#: model:ir.actions.act_window,name:hr.hr_employee_normal_action_tree
+#: model:ir.actions.act_window,name:hr.open_view_employee_list
+#: model:ir.actions.act_window,name:hr.open_view_employee_list_my
+#: model:ir.ui.menu,name:hr.menu_open_view_employee_list_my
+#: model:ir.ui.menu,name:hr.menu_view_employee_category_configuration_form
+msgid "Employees"
+msgstr ""
+
+#. module: hr
+#: field:hr.employee,bank_account_id:0
+msgid "Bank Account"
+msgstr ""
+
+#. module: hr
+#: field:hr.department,name:0
+msgid "Department Name"
+msgstr ""
+
+#. module: hr
+#: help:hr.employee,ssnid:0
+msgid "Social Security Number"
+msgstr ""
+
+#. module: hr
+#: model:process.node,note:hr.process_node_openerpuser0
+msgid "Creation of a OpenERP user"
+msgstr ""
+
+#. module: hr
+#: field:hr.department,child_ids:0
+msgid "Child Departments"
+msgstr ""
+
+#. module: hr
+#: model:ir.actions.act_window,name:hr.action_hr_job
+#: model:ir.ui.menu,name:hr.menu_hr_job
+msgid "Job Positions"
+msgstr ""
+
+#. module: hr
+#: view:hr.employee:0
+#: field:hr.employee,coach_id:0
+msgid "Coach"
+msgstr ""
+
+#. module: hr
+#: view:hr.installer:0
+msgid "Configure Your Human Resources Application"
+msgstr ""
+
+#. module: hr
+#: field:hr.installer,hr_expense:0
+msgid "Expenses"
+msgstr ""
+
+#. module: hr
+#: field:hr.department,manager_id:0
+#: view:hr.employee:0
+#: field:hr.employee,parent_id:0
+msgid "Manager"
+msgstr ""
+
+#. module: hr
+#: model:hr.employee.marital.status,name:hr.hr_employee_marital_status_widower
+msgid "Widower"
+msgstr ""
+
+#. module: hr
+#: help:hr.installer,hr_payroll_account:0
+msgid "Generic Payroll system Integrated with Accountings."
+msgstr ""
+
+#. module: hr
+#: field:hr.employee,child_ids:0
+msgid "Subordinates"
+msgstr ""
diff --git a/addons/hr/i18n/fr_CH.po b/addons/hr/i18n/fr_CH.po
new file mode 100644
index 00000000000..650fcdb8b92
--- /dev/null
+++ b/addons/hr/i18n/fr_CH.po
@@ -0,0 +1,29 @@
+# French (Switzerland) translation for openobject-addons
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2011-01-11 11:15:13+0000\n"
+"PO-Revision-Date: 2011-11-06 15:15+0000\n"
+"Last-Translator: Bogdan Stanciu (bstanciu)\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-11-05 05:31+0000\n"
+"X-Generator: Launchpad (build 14231)\n"
+
+#. module: hr
+#: field:hr.employee,ssnid:0
+msgid "SSN No"
+msgstr "No. AVS"
+
+#. module: hr
+#: help:hr.employee,ssnid:0
+msgid "Social Security Number"
+msgstr "Numéro de sécurité sociale (AVS)"
+
diff --git a/addons/hr/security/ir.model.access.csv b/addons/hr/security/ir.model.access.csv
index 975ed7d4071..2911a49bf53 100644
--- a/addons/hr/security/ir.model.access.csv
+++ b/addons/hr/security/ir.model.access.csv
@@ -1,11 +1,11 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_hr_employee_category_user","hr.employee.category.user","model_hr_employee_category","base.group_hr_user",1,1,1,1
-"access_hr_employee_category_emp","hr.employee.category.emp","model_hr_employee_category","base.group_user",1,0,0,0
-"access_hr_employee_user","hr.employee user","model_hr_employee","base.group_hr_user",1,1,1,1
-"access_hr_employee_system_user","hr.employee system user","model_hr_employee","base.group_user",1,0,0,0
-"access_hr_employee_resource_user","resource.resource.user","resource.model_resource_resource","base.group_hr_user",1,1,1,1
-"access_hr_department_user","hr.department.user","model_hr_department","base.group_hr_user",1,1,1,1
-"access_hr_department_employee","hr.department.employee","model_hr_department","base.group_user",1,0,0,0
-"access_hr_job_user","hr.job user","model_hr_job","base.group_hr_user",1,1,1,1
-"access_hr_res_partner_address","res.partner.address","base.model_res_partner_address","base.group_hr_manager",1,1,1,1
-"access_ir_property_hr_user","ir_property hr_user","base.model_ir_property","base.group_hr_user",1,1,1,0
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_hr_employee_category_user,hr.employee.category.user,model_hr_employee_category,base.group_hr_user,1,1,1,1
+access_hr_employee_category_emp,hr.employee.category.emp,model_hr_employee_category,base.group_user,1,0,0,0
+access_hr_employee_user,hr.employee user,model_hr_employee,base.group_hr_user,1,1,1,1
+access_hr_employee_system_user,hr.employee system user,model_hr_employee,base.group_user,1,0,0,0
+access_hr_employee_resource_user,resource.resource.user,resource.model_resource_resource,base.group_hr_user,1,1,1,1
+access_hr_department_user,hr.department.user,model_hr_department,base.group_hr_user,1,1,1,1
+access_hr_department_employee,hr.department.employee,model_hr_department,base.group_user,1,0,0,0
+access_hr_job_user,hr.job user,model_hr_job,base.group_hr_user,1,1,1,1
+access_hr_res_partner_address,res.partner.address,base.model_res_partner_address,base.group_hr_manager,1,1,1,1
+access_ir_property_hr_user,ir_property hr_user,base.model_ir_property,base.group_hr_user,1,1,1,0
diff --git a/addons/hr/test/hr_demo.yml b/addons/hr/test/hr_demo.yml
new file mode 100644
index 00000000000..6dee06d5eb3
--- /dev/null
+++ b/addons/hr/test/hr_demo.yml
@@ -0,0 +1,10 @@
+-
+ !record {model: hr.job, id: job_jr_appli, view: False}:
+ no_of_employee: 0.0
+ no_of_recruitment: 5.0
+-
+ !record {model: hr.employee, id: employee1, view: False}:
+ address_id: base.main_address
+ company_id: base.main_company
+ department_id: dep_technical
+ user_id: base.user_demo
diff --git a/addons/hr/test/open2recruit2close_job.yml b/addons/hr/test/open2recruit2close_job.yml
new file mode 100644
index 00000000000..0e618f87a3d
--- /dev/null
+++ b/addons/hr/test/open2recruit2close_job.yml
@@ -0,0 +1,38 @@
+-
+ In order to test the process of Human Resource Management, I open Job Postion for "Jr. Application Engineer".
+-
+ !python {model: hr.job}: |
+ self.job_open(cr, uid, [ref('job_jr_appli')])
+-
+ I check state of Job Position after opening it.
+-
+ !assert {model: hr.job, id: job_jr_appli, string: Job position is in 'open' state and no_of_recruitment = 0}:
+ - state == 'open'
+ - no_of_recruitment == 0
+-
+ Now, Recruitement is started so I start recruitement of Job Postion of "Jr. Application Engineer" Profile.
+-
+ !python {model: hr.job}: |
+ self.job_recruitement(cr, uid, [ref('job_jr_appli')])
+-
+ I check 'state' and number of 'Expected in Recruitment' after initiating the recruitment
+-
+ !assert {model: hr.job, id: job_jr_appli, string: Job position is in 'recruit' state and no_of_recruitment = 1.0}:
+ - state == 'recruit'
+ - no_of_recruitment == 1.0
+-
+ I assign the job position to a newly hired employee
+-
+ !python {model: hr.employee}: |
+ self.write(cr, uid, [ref('employee1')], {'job_id':ref('job_jr_appli')})
+-
+ Now I don't want to recruit new employee for this position. so I mark it as Old.
+-
+ !python {model: hr.job}: |
+ self.job_old(cr, uid, [ref('job_jr_appli')])
+-
+ I check 'state' and number of 'Expected in Recruitment' after closing the Job position.
+-
+ !assert {model: hr.job, id: job_jr_appli, string: Job position is in 'old' state and no_of_recruitment = 0}:
+ - state == 'old'
+ - no_of_recruitment == 0
diff --git a/addons/hr/test/test_hr.yml b/addons/hr/test/test_hr.yml
deleted file mode 100644
index 7b4ba82b243..00000000000
--- a/addons/hr/test/test_hr.yml
+++ /dev/null
@@ -1,140 +0,0 @@
--
- In order to test hr module in OpenERP, I will create new Employee, Department and Job Position.
--
- I create "R&D Department" in Department form.
--
- !record {model: hr.department, id: hr_department_rd0}:
- manager_id: base.user_root
- name: 'R & D'
--
- Now, I create a new employee “Mark Johnson”, and select department as “R&D Department”.
--
- !record {model: hr.employee, id: hr_employee_mark}:
- address_home_id: base.res_partner_address_1
- company_id: base.main_company
- gender: male
- marital: 'single'
- name: Mark Johnson
--
- I change the company of the employee.
--
- !python {model: hr.employee}: |
- res = self.onchange_company(cr, uid, [ref('hr_employee_mark')], ref('base.main_company'), None)
- values = dict([('company_id', ref('base.main_company'))] + res['value'].items())
- self.write(cr, uid, [ref('hr_employee_mark')], values, None)
--
- I assign department for employee “Mark Johnson”.
--
- !python {model: hr.employee}: |
- res = self.onchange_department_id(cr, uid, [ref('hr_employee_mark')], ref('hr_department_rd0'), None)
- assert res['value']['parent_id']
- values = dict([('department_id', ref('hr_department_rd0'))] + res['value'].items())
- self.write(cr, uid, [ref('hr_employee_mark')], values, None)
--
- Now I create a user for employee “Mark Johnson”.
--
- !record {model: res.users, id: hr_users_markjohnson0}:
- context_lang: en_US
- groups_id:
- - base.group_user
- login: markjohnson
- name: Mark Johnson
- password: markjohnson
--
- I assign user to employee “Mark Johnson”.
--
- !python {model: hr.employee}: |
- res = self.onchange_user(cr, uid, [ref('hr_employee_mark')], ref('hr_users_markjohnson0'), None)
- values = dict([('user_id', ref('hr_users_markjohnson0'))] + res['value'].items())
- self.write(cr, uid, [ref('hr_employee_mark')], values, None)
--
- In order to check the wizard “Employee Hierarchy” , I will create new employee “Phil Graves” and select “Mark Johnson” as
- Manager.
--
- !record {model: hr.employee, id: hr_employee_phil}:
- address_home_id: base.res_partner_address_3000
- company_id: base.main_company
- gender: male
- name: Phil Graves
- user_id: base.user_demo
- parent_id: 'hr_employee_mark'
--
- I fill the Working address for Employee.
--
- !python {model: hr.employee}: |
- res = self.onchange_address_id(cr, uid, ref('hr_employee_phil'), ref('base.res_partner_address_3000'), None)
- assert res['value']
- values = dict([('address_id', ref('base.res_partner_address_3000'))] + res['value'].items())
- self.write(cr, uid, [ref('hr_employee_phil')], values, None)
--
- I will open up form view of “Mark Johnson” and test the wizard “Employee Hierarchy” so it display the employee
- hierarchy starting from “Mark Johnson”.
-
--
- I will create new Job Position. I will check successful creation of new Job Position by adding the information.
--
- !record {model: hr.job, id: hr_job_jea0}:
- department_id: 'hr_department_rd0'
- description: 'Position of Junior Application Engineer'
- expected_employees: 5
- name: 'JAE'
--
- I check that Employee form is in "Open" state.
--
- !assert {model: hr.job, id: hr_job_jea0}:
- - state == 'open'
--
- I create Employee for job position.
--
- !record {model: hr.job, id: hr_job_jea0}:
- employee_ids:
- - address_home_id: base.res_partner_address_1
- name: Manuel Lehba
- department_id: 'hr_department_rd0'
- gender: male
- parent_id: 'hr_employee_mark'
--
- I check that "Number of Employees" field have some value.
--
- !assert {model: hr.job, id: hr_job_jea0}:
- - no_of_employee != False
--
- As more requirements on the said job position are come, I increase the number of expected employees.
--
- !python {model: hr.job}: |
- res = self.on_change_expected_employee(cr, uid, [ref('hr_job_jea0')], 6, 3, None)
- assert res['value']['expected_employees']
- values = dict([('expected_employees', ref('hr_job_jea0'))] + res['value'].items())
- self.write(cr, uid, [ref('hr_job_jea0')], values, None)
--
- I open the job position for recruitment.
--
- !python {model: hr.job}: |
- self.job_recruitement(cr, uid, [ref('hr_job_jea0')])
--
- I assign the job position to employee and mark the position.
--
- !python {model: hr.job}: |
- self.job_open(cr, uid, [ref('hr_job_jea0')])
--
- Now the process is over so I don't want to use this position. I mark it as Old.
--
- !python {model: hr.job}: |
- self.job_old(cr, uid, [ref('hr_job_jea0')])
--
- I create a parent category for the new recruited employees who are Freshers.
--
- !record {model: hr.employee.category, id: hr_employee_category_fresher0}:
- name: Fresher
--
- I create another category for Junior Level freshers.
--
- !record {model: hr.employee.category, id: hr_employee_category_juniorlevel0}:
- name: Junior Level
- parent_id: hr_employee_category_fresher0
--
- I open the tree view of Categories and see the categories in a hierarchical manner.
--
- !python {model: hr.employee.category}: |
- res = self.name_get(cr, uid, [ref('hr_employee_category_juniorlevel0')], None)
- assert res
diff --git a/addons/hr_attendance/__openerp__.py b/addons/hr_attendance/__openerp__.py
index 5f0054c3634..3d945910144 100644
--- a/addons/hr_attendance/__openerp__.py
+++ b/addons/hr_attendance/__openerp__.py
@@ -21,7 +21,7 @@
{
- 'name': 'Attendance',
+ 'name': 'Attendances',
'version': '1.1',
'category': 'Human Resources',
'complexity': "easy",
diff --git a/addons/hr_attendance/hr_attendance_demo.xml b/addons/hr_attendance/hr_attendance_demo.xml
index a1f42eb1004..f478e099b87 100644
--- a/addons/hr_attendance/hr_attendance_demo.xml
+++ b/addons/hr_attendance/hr_attendance_demo.xml
@@ -122,21 +122,5 @@
-
diff --git a/addons/hr_attendance/security/ir.model.access.csv b/addons/hr_attendance/security/ir.model.access.csv
index 51d5e87145c..ceb8acfe49e 100644
--- a/addons/hr_attendance/security/ir.model.access.csv
+++ b/addons/hr_attendance/security/ir.model.access.csv
@@ -1,5 +1,5 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_hr_action_reason_user","hr.action.reason.user","model_hr_action_reason","base.group_hr_user",1,1,1,1
-"access_hr_action_reason_employee","hr.action.reason.employee","model_hr_action_reason","base.group_user",1,1,1,1
-"access_hr_attendance_user","hr.attendance.user","model_hr_attendance","base.group_hr_user",1,1,1,1
-"access_hr_attendance_system_user","hr.attendance.system.user","model_hr_attendance","base.group_user",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_hr_action_reason_user,hr.action.reason.user,model_hr_action_reason,base.group_hr_user,1,1,1,1
+access_hr_action_reason_employee,hr.action.reason.employee,model_hr_action_reason,base.group_user,1,1,1,1
+access_hr_attendance_user,hr.attendance.user,model_hr_attendance,base.group_hr_user,1,1,1,1
+access_hr_attendance_system_user,hr.attendance.system.user,model_hr_attendance,base.group_user,1,1,1,1
diff --git a/addons/hr_attendance/wizard/hr_attendance_bymonth_view.xml b/addons/hr_attendance/wizard/hr_attendance_bymonth_view.xml
index e9b5fecf330..660cdbc81cd 100644
--- a/addons/hr_attendance/wizard/hr_attendance_bymonth_view.xml
+++ b/addons/hr_attendance/wizard/hr_attendance_bymonth_view.xml
@@ -29,7 +29,6 @@
-
Attendances By Month
client_print_multi
diff --git a/addons/hr_attendance/wizard/hr_attendance_byweek_view.xml b/addons/hr_attendance/wizard/hr_attendance_byweek_view.xml
index 4ed56ce1800..63cd0978a7f 100644
--- a/addons/hr_attendance/wizard/hr_attendance_byweek_view.xml
+++ b/addons/hr_attendance/wizard/hr_attendance_byweek_view.xml
@@ -28,7 +28,6 @@
-
Attendances By Week
client_print_multi
diff --git a/addons/hr_attendance/wizard/hr_attendance_error_view.xml b/addons/hr_attendance/wizard/hr_attendance_error_view.xml
index 6eec4701fb4..8f943d7d1da 100644
--- a/addons/hr_attendance/wizard/hr_attendance_error_view.xml
+++ b/addons/hr_attendance/wizard/hr_attendance_error_view.xml
@@ -32,7 +32,6 @@
-
Attendance Error Report
client_print_multi
diff --git a/addons/hr_contract/security/ir.model.access.csv b/addons/hr_contract/security/ir.model.access.csv
index 41ffa72f937..5e35e147230 100644
--- a/addons/hr_contract/security/ir.model.access.csv
+++ b/addons/hr_contract/security/ir.model.access.csv
@@ -1,5 +1,5 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_hr_resource_manager","hr.employee.resource.manager","resource.model_resource_resource","base.group_hr_manager",1,1,1,1
-"access_hr_resource_calendar_user","hr.employee.resource.calendar.user","resource.model_resource_calendar","base.group_hr_user",1,1,1,1
-"access_hr_contract_type_manager","hr.contract.type.manager","model_hr_contract_type","base.group_hr_manager",1,1,1,1
-"access_hr_contract_manager","hr.contract.manager","model_hr_contract","base.group_hr_manager",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_hr_resource_manager,hr.employee.resource.manager,resource.model_resource_resource,base.group_hr_manager,1,1,1,1
+access_hr_resource_calendar_user,hr.employee.resource.calendar.user,resource.model_resource_calendar,base.group_hr_user,1,1,1,1
+access_hr_contract_type_manager,hr.contract.type.manager,model_hr_contract_type,base.group_hr_manager,1,1,1,1
+access_hr_contract_manager,hr.contract.manager,model_hr_contract,base.group_hr_manager,1,1,1,1
diff --git a/addons/hr_evaluation/__openerp__.py b/addons/hr_evaluation/__openerp__.py
index f082d9bfcef..d2264568378 100644
--- a/addons/hr_evaluation/__openerp__.py
+++ b/addons/hr_evaluation/__openerp__.py
@@ -20,14 +20,14 @@
##############################################################################
{
- "name" : "HR Periodic Appraisals",
+ "name" : "Employee Appraisals",
"version": "0.1",
"author": "OpenERP SA",
"category": "Human Resources",
'complexity': "easy",
"website": "http://www.openerp.com",
"images": ["images/hr_evaluation_analysis.jpeg","images/hr_evaluation.jpeg"],
- "depends": ["hr",'hr_recruitment','survey'],
+ "depends": ["hr","base_calendar","survey"],
"description": """
Ability to create employees evaluation.
=======================================
@@ -39,7 +39,7 @@ level of employee hierarchy fills what and final review and evaluation
is done by the manager.Every evaluation filled by the employees can be viewed
in the form of pdf file. Implements a dashboard for My Current Evaluations
""",
- "demo": [],
+ "demo": ["hr_evaluation_demo.xml"],
"data": [
"security/ir.model.access.csv",
"security/hr_evaluation_security.xml",
@@ -54,6 +54,7 @@ in the form of pdf file. Implements a dashboard for My Current Evaluations
"active": False,
"installable": True,
"certificate" : "00883207679172998429",
+ 'application': True,
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_evaluation/board_hr_evaluation_view.xml b/addons/hr_evaluation/board_hr_evaluation_view.xml
index 70d6245b1ee..f25c669a973 100644
--- a/addons/hr_evaluation/board_hr_evaluation_view.xml
+++ b/addons/hr_evaluation/board_hr_evaluation_view.xml
@@ -1,24 +1,23 @@
-
- My Evaluation Remaining
- ir.actions.act_window
- hr_evaluation.evaluation
+
+ Interview Requests
+ hr.evaluation.interview
form
- [('state','in',('wait', 'progress')),('create_uid','=',uid)]
-
+ [('is_evaluation' ,'=', True), ('user_id', '=', uid),('state','=','waiting_answer')]
+
-
+
board.hr.evaluation.form
board.board
-
+
form
-
-
+
+
diff --git a/addons/hr_evaluation/hr_evaluation_data.xml b/addons/hr_evaluation/hr_evaluation_data.xml
index 6745b997b3f..ec4b46f8a62 100644
--- a/addons/hr_evaluation/hr_evaluation_data.xml
+++ b/addons/hr_evaluation/hr_evaluation_data.xml
@@ -2,7 +2,7 @@
- Employee Evaluation
+ Employee Appraisal
20
@@ -11,7 +11,7 @@
open
- Employee Evaluation Form
+ Employee Appraisal Form
@@ -128,7 +128,7 @@
descriptive_text
The comment you entered is in an invalid format.
- * The employee will be responsible for completing a draft of the Appraisal Form as a tool for self-evaluation and a starting point for the supervisor’s evaluation. The employee can add examples of achievements for each criterion.
+ * The employee will be responsible for completing a draft of the Appraisal Form as a tool for self-appraisal and a starting point for the supervisor’s evaluation. The employee can add examples of achievements for each criterion.
Once the form had been filled, the employee send it to his supervisor.
* It is the primary responsibility of the supervisor to gather the necessary input from the appropriate sources of feedback (internal and/or external customers, peers). In case of collaboration with OpenERP SA Belgium, the supervisor must receive completed evaluation form from the employee's Belgian project manager.
@@ -204,7 +204,7 @@ Once the form had been filled, the employee send it to his supervisor.
Subject
matrix_of_choices_only_one_ans
- Recommendations / Evaluations
+ Recommendations / Appraisals
The comment you entered is in an invalid format.
@@ -227,7 +227,7 @@ Once the form had been filled, the employee send it to his supervisor.
Supervisors only :
matrix_of_choices_only_one_ans
- Recommendations / Evaluations
+ Recommendations / Appraisals
The comment you entered is in an invalid format.
@@ -1150,7 +1150,7 @@ Once the form had been filled, the employee send it to his supervisor.
- Manager's Evaluation Plan
+ Manager's Appraisal Plan
@@ -1205,33 +1205,21 @@ Once the form had been filled, the employee send it to his supervisor.
final
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
- Run Employee Evaluation
+ Run Employee Appraisal
1
diff --git a/addons/hr_evaluation/hr_evaluation_demo.xml b/addons/hr_evaluation/hr_evaluation_demo.xml
new file mode 100644
index 00000000000..db096f13266
--- /dev/null
+++ b/addons/hr_evaluation/hr_evaluation_demo.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/addons/hr_evaluation/hr_evaluation_installer.xml b/addons/hr_evaluation/hr_evaluation_installer.xml
index 842363559a9..10e7773bc62 100644
--- a/addons/hr_evaluation/hr_evaluation_installer.xml
+++ b/addons/hr_evaluation/hr_evaluation_installer.xml
@@ -2,11 +2,12 @@
- Review Evaluation Plans
+ Review Appraisal Plans
ir.actions.act_window
hr_evaluation.plan
form
tree,form
+ You can define appraisal plans (ex: first interview after 6 months, then every year). Then, each employee can be linked to an appraisal plan so that OpenERP can automatically generate interview requests to managers and/or subordinates.
diff --git a/addons/hr_evaluation/hr_evaluation_view.xml b/addons/hr_evaluation/hr_evaluation_view.xml
index e15b461d2e2..18f5bc1a023 100644
--- a/addons/hr_evaluation/hr_evaluation_view.xml
+++ b/addons/hr_evaluation/hr_evaluation_view.xml
@@ -365,7 +365,7 @@
- Interview Request
+ Interview Requests
hr.evaluation.interview
calendar
@@ -379,9 +379,9 @@
Interview Requests
hr.evaluation.interview
form
-
+
[('is_evaluation' ,'=', True)]
- {"search_default_todo":1,"search_default_user_id":uid}
+ {'default_is_evaluation': True, "search_default_todo":1,"search_default_user_id":uid}
Interview Requests are generated automatically by OpenERP according to an employee's Appraisal Plan. Each user receives automatic emails and requests to evaluate their colleagues periodically.
diff --git a/addons/hr_evaluation/report/hr_evaluation_report_view.xml b/addons/hr_evaluation/report/hr_evaluation_report_view.xml
index fc001937f62..c70c1d27923 100644
--- a/addons/hr_evaluation/report/hr_evaluation_report_view.xml
+++ b/addons/hr_evaluation/report/hr_evaluation_report_view.xml
@@ -47,8 +47,10 @@
-
+
@@ -95,7 +97,7 @@
hr.evaluation.report
form
tree,graph
- {'search_default_month':1,'search_default_employee':1,'group_by_no_leaf':1,'group_by':[]}
+ {'search_default_year':1,'search_default_month':1,'search_default_employee':1,'group_by_no_leaf':1,'group_by':[]}
diff --git a/addons/hr_evaluation/security/ir.model.access.csv b/addons/hr_evaluation/security/ir.model.access.csv
index 377098a6fe6..4304f78708a 100644
--- a/addons/hr_evaluation/security/ir.model.access.csv
+++ b/addons/hr_evaluation/security/ir.model.access.csv
@@ -1,34 +1,33 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_hr_evaluation_evaluation_user","hr_evaluation.evaluation.user","model_hr_evaluation_evaluation","base.group_hr_user",1,1,1,1
-"access_hr_evaluation_evaluation_employee","hr_evaluation.evaluation.employee","model_hr_evaluation_evaluation","base.group_user",1,0,0,0
-"access_hr_evaluation_plan_user","hr_evaluation.plan.user","model_hr_evaluation_plan","base.group_hr_user",1,1,1,1
-"access_hr_evaluation_plan_phase_user","hr_evaluation.plan.phase.user","model_hr_evaluation_plan_phase","base.group_hr_user",1,1,1,1
-"access_hr_evaluation_interview_user","hr.evaluation.interview.user","model_hr_evaluation_interview","base.group_hr_user",1,1,1,1
-"access_hr_evaluation_interview_employee","hr.evaluation.interview.employee","model_hr_evaluation_interview","base.group_user",1,1,1,0
-"access_hr_evaluation_report","hr.evaluation.report","model_hr_evaluation_report","base.group_hr_manager",1,1,1,1
-"access_survey_type_hr_manager","survey.type","survey.model_survey_type","base.group_hr_manager",1,1,1,1
-"access_survey_hr_manager","survey.hr.manager","survey.model_survey","base.group_hr_manager",1,1,1,1
-"access_survey_history_manager","survey.history","survey.model_survey_history","base.group_hr_manager",1,1,1,1
-"access_survey_page_hr_manager","survey.page","survey.model_survey_page","base.group_hr_manager",1,1,1,1
-"access_survey_question_hr_manager","survey.question","survey.model_survey_question","base.group_hr_manager",1,1,1,1
-"access_survey_question_column_heading_hr_manager","survey.question.column.heading","survey.model_survey_question_column_heading","base.group_hr_manager",1,1,1,1
-"access_survey_answer_hr_manager","survey.answer","survey.model_survey_answer","base.group_hr_manager",1,1,1,1
-"access_survey_response_hr_manager","survey.response","survey.model_survey_response","base.group_hr_manager",1,1,1,1
-"access_survey_response_line_hr_manager","survey.response.line","survey.model_survey_response_line","base.group_hr_manager",1,1,1,1
-"access_survey_tbl_column_heading_hr_manager","survey.tbl.column.heading","survey.model_survey_tbl_column_heading","base.group_hr_manager",1,1,1,1
-"access_survey_response_answer_hr_manager","survey.response.answer","survey.model_survey_response_answer","base.group_hr_manager",1,1,1,1
-"access_survey_request_hr_manager","survey.request","survey.model_survey_request","base.group_hr_manager",1,1,1,1
-"access_survey_answer_hr_user","survey.answer.hr.user","survey.model_survey_answer","base.group_hr_user",1,1,1,0
-"access_survey_response_answer_hr_user","survey.response.answer.hr.user","survey.model_survey_response_answer","base.group_hr_user",1,1,1,0
-"access_survey_type_hr_user","survey.type.hr.user","survey.model_survey_type","base.group_hr_user",1,1,1,0
-"access_survey_question_hr_user","survey.question.hr.user","survey.model_survey_question","base.group_hr_user",1,1,1,0
-"access_survey_page_hr_user","survey.page.hr.user","survey.model_survey_page","base.group_hr_user",1,1,1,1
-"access_survey_response_hr_user","survey.response.hr.user","survey.model_survey_response","base.group_hr_user",1,1,1,0
-"access_survey_history_hr_user","survey.history.hr.user","survey.model_survey_history","base.group_hr_user",1,1,1,0
-"access_survey_request_hr_user","survey.request.hr.user","survey.model_survey_request","base.group_hr_user",1,1,1,0
-"access_survey_request_hr_employee","survey.request.hr.employee","survey.model_survey_request","base.group_user",1,1,1,0
-"access_survey_question_column_heading_hr_user","survey.question.column.heading.hr.user","survey.model_survey_question_column_heading","base.group_hr_user",1,0,0,0
-"access_survey_response_line_hr_user","survey.response.line.hr.user","survey.model_survey_response_line","base.group_hr_user",1,1,1,0
-"access_survey_tbl_column_heading_hr_user","survey.tbl.column.heading.hr.user","survey.model_survey_tbl_column_heading","base.group_hr_user",1,1,1,0
-"access_base_calendar_attendee_survey_user","base.calendar.calendar.attendee.survey.user","base_calendar.model_calendar_attendee","base.group_survey_user",1,1,1,0
-"access_base_calendar_attendee_tool_user","base.calendar.calendar.attendee.tool.user","base_calendar.model_calendar_attendee","base.group_tool_user",1,1,1,0
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_hr_evaluation_evaluation_user,hr_evaluation.evaluation.user,model_hr_evaluation_evaluation,base.group_hr_user,1,1,1,1
+access_hr_evaluation_evaluation_employee,hr_evaluation.evaluation.employee,model_hr_evaluation_evaluation,base.group_user,1,0,0,0
+access_hr_evaluation_plan_user,hr_evaluation.plan.user,model_hr_evaluation_plan,base.group_hr_user,1,1,1,1
+access_hr_evaluation_plan_phase_user,hr_evaluation.plan.phase.user,model_hr_evaluation_plan_phase,base.group_hr_user,1,1,1,1
+access_hr_evaluation_interview_user,hr.evaluation.interview.user,model_hr_evaluation_interview,base.group_hr_user,1,1,1,1
+access_hr_evaluation_interview_employee,hr.evaluation.interview.employee,model_hr_evaluation_interview,base.group_user,1,1,1,0
+access_hr_evaluation_report,hr.evaluation.report,model_hr_evaluation_report,base.group_hr_manager,1,1,1,1
+access_survey_type_hr_manager,survey.type,survey.model_survey_type,base.group_hr_manager,1,1,1,1
+access_survey_hr_manager,survey.hr.manager,survey.model_survey,base.group_hr_manager,1,1,1,1
+access_survey_history_manager,survey.history,survey.model_survey_history,base.group_hr_manager,1,1,1,1
+access_survey_question_hr_manager,survey.question,survey.model_survey_question,base.group_hr_manager,1,1,1,1
+access_survey_question_column_heading_hr_manager,survey.question.column.heading,survey.model_survey_question_column_heading,base.group_hr_manager,1,1,1,1
+access_survey_answer_hr_manager,survey.answer,survey.model_survey_answer,base.group_hr_manager,1,1,1,1
+access_survey_response_hr_manager,survey.response,survey.model_survey_response,base.group_hr_manager,1,1,1,1
+access_survey_response_line_hr_manager,survey.response.line,survey.model_survey_response_line,base.group_hr_manager,1,1,1,1
+access_survey_tbl_column_heading_hr_manager,survey.tbl.column.heading,survey.model_survey_tbl_column_heading,base.group_hr_manager,1,1,1,1
+access_survey_response_answer_hr_manager,survey.response.answer,survey.model_survey_response_answer,base.group_hr_manager,1,1,1,1
+access_survey_request_hr_manager,survey.request,survey.model_survey_request,base.group_hr_manager,1,1,1,1
+access_survey_answer_hr_user,survey.answer.hr.user,survey.model_survey_answer,base.group_hr_user,1,1,1,0
+access_survey_response_answer_hr_user,survey.response.answer.hr.user,survey.model_survey_response_answer,base.group_hr_user,1,1,1,0
+access_survey_type_hr_user,survey.type.hr.user,survey.model_survey_type,base.group_hr_user,1,1,1,0
+access_survey_question_hr_user,survey.question.hr.user,survey.model_survey_question,base.group_hr_user,1,1,1,0
+access_survey_page_hr_user,survey.page.hr.user,survey.model_survey_page,base.group_hr_user,1,1,1,1
+access_survey_response_hr_user,survey.response.hr.user,survey.model_survey_response,base.group_hr_user,1,1,1,0
+access_survey_history_hr_user,survey.history.hr.user,survey.model_survey_history,base.group_hr_user,1,1,1,0
+access_survey_request_hr_user,survey.request.hr.user,survey.model_survey_request,base.group_hr_user,1,1,1,0
+access_survey_request_hr_employee,survey.request.hr.employee,survey.model_survey_request,base.group_user,1,1,1,0
+access_survey_question_column_heading_hr_user,survey.question.column.heading.hr.user,survey.model_survey_question_column_heading,base.group_hr_user,1,0,0,0
+access_survey_response_line_hr_user,survey.response.line.hr.user,survey.model_survey_response_line,base.group_hr_user,1,1,1,0
+access_survey_tbl_column_heading_hr_user,survey.tbl.column.heading.hr.user,survey.model_survey_tbl_column_heading,base.group_hr_user,1,1,1,0
+access_base_calendar_attendee_survey_user,base.calendar.calendar.attendee.survey.user,base_calendar.model_calendar_attendee,base.group_survey_user,1,1,1,0
+access_base_calendar_attendee_tool_user,base.calendar.calendar.attendee.tool.user,base_calendar.model_calendar_attendee,base.group_tool_user,1,1,1,0
diff --git a/addons/hr_expense/__openerp__.py b/addons/hr_expense/__openerp__.py
index 4a22f00e076..e0a8a002a6a 100644
--- a/addons/hr_expense/__openerp__.py
+++ b/addons/hr_expense/__openerp__.py
@@ -21,7 +21,7 @@
{
- 'name': 'Expenses',
+ 'name': 'Expenses Management',
'version': '1.0',
'category': 'Human Resources',
'complexity': "easy",
@@ -68,5 +68,6 @@ re-invoice your customer's expenses if your work by project.
'installable': True,
'active': False,
'certificate': '0062479841789',
+ 'application': True,
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_expense/board_hr_expense_manager_view.xml b/addons/hr_expense/board_hr_expense_manager_view.xml
index c45979057a1..0f09c9a3290 100644
--- a/addons/hr_expense/board_hr_expense_manager_view.xml
+++ b/addons/hr_expense/board_hr_expense_manager_view.xml
@@ -16,8 +16,8 @@
form
-
-
+
+
diff --git a/addons/hr_expense/board_hr_expense_view.xml b/addons/hr_expense/board_hr_expense_view.xml
index 4e213048dc7..3383f734f7d 100644
--- a/addons/hr_expense/board_hr_expense_view.xml
+++ b/addons/hr_expense/board_hr_expense_view.xml
@@ -7,6 +7,7 @@
hr.expense.expense
form
[('state','in',('confirm', 'accepted')),('user_id','=',uid)]
+ {'default_user_id': uid}
@@ -16,8 +17,8 @@
form
-
-
+
+
diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py
index 201c70c642c..478b8120935 100644
--- a/addons/hr_expense/hr_expense.py
+++ b/addons/hr_expense/hr_expense.py
@@ -137,8 +137,9 @@ class hr_expense_expense(osv.osv):
inv_ids.append(self.browse(cr, uid, id).invoice_id.id)
return {
'name': _('Supplier Invoices'),
+ 'view_type': 'form',
'view_mode': 'form',
- 'view_id': [res[1] if res else False],
+ 'view_id': [res and res[1] or False],
'res_model': 'account.invoice',
'context': "{'type':'out_invoice', 'journal_type': 'purchase'}",
'type': 'ir.actions.act_window',
diff --git a/addons/hr_expense/hr_expense_view.xml b/addons/hr_expense/hr_expense_view.xml
index 786dc6beee2..cf884af4250 100644
--- a/addons/hr_expense/hr_expense_view.xml
+++ b/addons/hr_expense/hr_expense_view.xml
@@ -30,8 +30,6 @@
-
-
diff --git a/addons/hr_expense/hr_expense_workflow.xml b/addons/hr_expense/hr_expense_workflow.xml
index 7946bef3b6b..328a07879a4 100644
--- a/addons/hr_expense/hr_expense_workflow.xml
+++ b/addons/hr_expense/hr_expense_workflow.xml
@@ -104,13 +104,6 @@
-
-
- subflow.cancel
-
-
-
-
draft
diff --git a/addons/hr_expense/report/hr_expense_report_view.xml b/addons/hr_expense/report/hr_expense_report_view.xml
index 680003b88be..0685880b863 100644
--- a/addons/hr_expense/report/hr_expense_report_view.xml
+++ b/addons/hr_expense/report/hr_expense_report_view.xml
@@ -53,10 +53,11 @@
-
-
+
@@ -113,7 +114,7 @@
hr.expense.report
form
tree,graph
- {'search_default_month':1,'search_default_employee':1,'group_by_no_leaf':1,'group_by':[]}
+ {'search_default_year':1,'search_default_month':1,'search_default_employee':1,'group_by_no_leaf':1,'group_by':[]}
diff --git a/addons/hr_expense/security/ir.model.access.csv b/addons/hr_expense/security/ir.model.access.csv
index 674b06304d2..0455302319e 100644
--- a/addons/hr_expense/security/ir.model.access.csv
+++ b/addons/hr_expense/security/ir.model.access.csv
@@ -1,23 +1,23 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_hr_expense_expense_user","hr.expense.expense.user","model_hr_expense_expense","base.group_hr_user",1,1,1,1
-"access_hr_expense_expense_employee","hr.expense.expense.employee","model_hr_expense_expense","base.group_user",1,1,1,1
-"access_hr_expense_line_user","hr.expense.line.user","model_hr_expense_line","base.group_hr_user",1,1,1,1
-"access_hr_expense_line_employee","hr.expense.line.employee","model_hr_expense_line","base.group_user",1,1,1,1
-"access_hr_expense_report_manager","hr.expense.report.manager","model_hr_expense_report","base.group_hr_manager",1,1,1,1
-"access_product_product_hr_expense_user","product.product.hr.expense.user","product.model_product_product","base.group_hr_user",1,1,1,1
-"access_product_template_hr_expense_user","product.template.hr.expense.user","product.model_product_template","base.group_hr_user",1,1,1,1
-"access_product_uom_hr_expense_user","product.uom.hr.expense.user","product.model_product_uom","base.group_hr_user",1,1,1,1
-"access_product_price_type_user","product.price.type.user","product.model_product_price_type","base.group_hr_user",1,1,1,1
-"access_account_journal_user","account.journal.user","account.model_account_journal","base.group_hr_user",1,1,1,1
-"access_account_invoice_user","account.invoice.user","account.model_account_invoice","base.group_hr_user",1,1,1,1
-"access_account_invoice_line_user","account.invoice.line.user","account.model_account_invoice_line","base.group_hr_user",1,1,1,1
-"access_account_analytic_journal_user","account.ianalytic.journal.user","account.model_account_analytic_journal","base.group_hr_user",1,1,1,1
-"access_account_invoice_tax_user","account.invoice.tax.user","account.model_account_invoice_tax","base.group_hr_user",1,1,1,1
-"access_account_period_user","account.period.user","account.model_account_period","base.group_hr_user",1,1,1,1
-"access_account_fiscalyear_user","account.fiscalyear.user","account.model_account_fiscalyear","base.group_hr_user",1,1,1,1
-"access_account_move_user","account.move.user","account.model_account_move","base.group_hr_user",1,1,1,1
-"access_account_move_line_user","account.move.line.user","account.model_account_move_line","base.group_hr_user",1,1,1,1
-"access_account_analytic_line_user","account.ianalytic.line.user","account.model_account_analytic_line","base.group_hr_user",1,1,1,1
-"access_account_journal_period_manager","account.journal.period.manager","account.model_account_journal_period","base.group_hr_manager",1,1,1,1
-"hr.access_account_journal_view_hruser","account.journal.view hruser","account.model_account_journal_view","base.group_hr_user",1,0,0,0
-"hr.access_account_journal_column_hruser","account.journal.column hruser","account.model_account_journal_column","base.group_hr_user",1,0,0,0
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_hr_expense_expense_user,hr.expense.expense.user,model_hr_expense_expense,base.group_hr_user,1,1,1,1
+access_hr_expense_expense_employee,hr.expense.expense.employee,model_hr_expense_expense,base.group_user,1,1,1,1
+access_hr_expense_line_user,hr.expense.line.user,model_hr_expense_line,base.group_hr_user,1,1,1,1
+access_hr_expense_line_employee,hr.expense.line.employee,model_hr_expense_line,base.group_user,1,1,1,1
+access_hr_expense_report_manager,hr.expense.report.manager,model_hr_expense_report,base.group_hr_manager,1,1,1,1
+access_product_product_hr_expense_user,product.product.hr.expense.user,product.model_product_product,base.group_hr_user,1,1,1,1
+access_product_template_hr_expense_user,product.template.hr.expense.user,product.model_product_template,base.group_hr_user,1,1,1,1
+access_product_uom_hr_expense_user,product.uom.hr.expense.user,product.model_product_uom,base.group_hr_user,1,1,1,1
+access_product_price_type_user,product.price.type.user,product.model_product_price_type,base.group_hr_user,1,1,1,1
+access_account_journal_user,account.journal.user,account.model_account_journal,base.group_hr_user,1,1,1,1
+access_account_invoice_user,account.invoice.user,account.model_account_invoice,base.group_hr_user,1,1,1,1
+access_account_invoice_line_user,account.invoice.line.user,account.model_account_invoice_line,base.group_hr_user,1,1,1,1
+access_account_analytic_journal_user,account.ianalytic.journal.user,account.model_account_analytic_journal,base.group_hr_user,1,1,1,1
+access_account_invoice_tax_user,account.invoice.tax.user,account.model_account_invoice_tax,base.group_hr_user,1,1,1,1
+access_account_period_user,account.period.user,account.model_account_period,base.group_hr_user,1,1,1,1
+access_account_fiscalyear_user,account.fiscalyear.user,account.model_account_fiscalyear,base.group_hr_user,1,1,1,1
+access_account_move_user,account.move.user,account.model_account_move,base.group_hr_user,1,1,1,1
+access_account_move_line_user,account.move.line.user,account.model_account_move_line,base.group_hr_user,1,1,1,1
+access_account_analytic_line_user,account.ianalytic.line.user,account.model_account_analytic_line,base.group_hr_user,1,1,1,1
+access_account_journal_period_manager,account.journal.period.manager,account.model_account_journal_period,base.group_hr_manager,1,1,1,1
+hr.access_account_journal_view_hruser,account.journal.view hruser,account.model_account_journal_view,base.group_hr_user,1,0,0,0
+hr.access_account_journal_column_hruser,account.journal.column hruser,account.model_account_journal_column,base.group_hr_user,1,0,0,0
diff --git a/addons/hr_holidays/__openerp__.py b/addons/hr_holidays/__openerp__.py
index ec12b884201..61d613ad0c5 100644
--- a/addons/hr_holidays/__openerp__.py
+++ b/addons/hr_holidays/__openerp__.py
@@ -21,9 +21,9 @@
{
- "name": "Leave Management",
+ "name": "Leaves Management",
"version": "1.5",
- "author": ['OpenERP SA', 'Axelor'],
+ "author": "OpenERP SA",
"category": "Human Resources",
'complexity': "easy",
"website": "http://www.openerp.com",
@@ -72,6 +72,7 @@ Note that:
'test/hr_holidays_report.yml',
],
'installable': True,
+ 'application': True,
'active': False,
'certificate': '0086579209325',
}
diff --git a/addons/hr_holidays/board_hr_holidays_view.xml b/addons/hr_holidays/board_hr_holidays_view.xml
index 9dc9646da9b..178602725ae 100644
--- a/addons/hr_holidays/board_hr_holidays_view.xml
+++ b/addons/hr_holidays/board_hr_holidays_view.xml
@@ -16,8 +16,8 @@
form
-
-
+
+
diff --git a/addons/hr_holidays/board_hr_manager_holidays_view.xml b/addons/hr_holidays/board_hr_manager_holidays_view.xml
index 662569fb81d..1c7c6280f8b 100644
--- a/addons/hr_holidays/board_hr_manager_holidays_view.xml
+++ b/addons/hr_holidays/board_hr_manager_holidays_view.xml
@@ -18,8 +18,8 @@
form
-
-
+
+
diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py
index f6f660f5f45..746c2764315 100644
--- a/addons/hr_holidays/hr_holidays.py
+++ b/addons/hr_holidays/hr_holidays.py
@@ -151,16 +151,26 @@ class hr_holidays(osv.osv):
('date_check', "CHECK ( number_of_days_temp >= 0 )", "The number of days must be greater than 0 !"),
]
- def _create_resource_leave(self, cr, uid, vals, context=None):
+ def _create_resource_leave(self, cr, uid, leaves, context=None):
'''This method will create entry in resource calendar leave object at the time of holidays validated '''
obj_res_leave = self.pool.get('resource.calendar.leaves')
- return obj_res_leave.create(cr, uid, vals, context=context)
+ for leave in leaves:
+ vals = {
+ 'name': leave.name,
+ 'date_from': leave.date_from,
+ 'holiday_id': leave.id,
+ 'date_to': leave.date_to,
+ 'resource_id': leave.employee_id.resource_id.id,
+ 'calendar_id': leave.employee_id.resource_id.calendar_id.id
+ }
+ obj_res_leave.create(cr, uid, vals, context=context)
+ return True
- def _remove_resouce_leave(self, cr, uid, ids, context=None):
+ def _remove_resource_leave(self, cr, uid, ids, context=None):
'''This method will create entry in resource calendar leave object at the time of holidays cancel/removed'''
obj_res_leave = self.pool.get('resource.calendar.leaves')
leave_ids = obj_res_leave.search(cr, uid, [('holiday_id', 'in', ids)], context=context)
- return obj_res_leave.unlink(cr, uid, leave_ids)
+ return obj_res_leave.unlink(cr, uid, leave_ids, context=context)
def onchange_type(self, cr, uid, ids, holiday_type):
result = {'value': {'employee_id': False}}
@@ -252,13 +262,14 @@ class hr_holidays(osv.osv):
'name': record.name,
'categ_id': record.holiday_status_id.categ_id.id,
'duration': record.number_of_days_temp * 8,
- 'note': record.notes,
+ 'description': record.notes,
'user_id': record.user_id.id,
'date': record.date_from,
'end_date': record.date_to,
'date_deadline': record.date_to,
}
case_id = meeting_obj.create(cr, uid, vals)
+ self._create_resource_leave(cr, uid, [record], context=context)
self.write(cr, uid, ids, {'case_id': case_id})
elif record.holiday_type == 'category':
emp_ids = obj_emp.search(cr, uid, [('category_ids', 'child_of', [record.category_id.id])])
@@ -313,6 +324,7 @@ class hr_holidays(osv.osv):
for request in record.linked_request_ids or []:
wf_service.trg_validate(uid, 'hr.holidays', request.id, 'cancel', cr)
+ self._remove_resource_leave(cr, uid, ids, context=context)
return True
def check_holidays(self, cr, uid, ids, context=None):
diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml
index a43378b1c95..a989ea50222 100644
--- a/addons/hr_holidays/hr_holidays_view.xml
+++ b/addons/hr_holidays/hr_holidays_view.xml
@@ -59,7 +59,7 @@
-
+
@@ -104,7 +104,7 @@
-
+
@@ -285,8 +285,8 @@
Requests Approve
hr.holidays
form
- {'search_default_approve':1,"search_default_department_id": department_id}
- [('type','=','add')]
+ {'default_type': 'add', 'search_default_approve':1,"search_default_department_id": department_id}
+ [('type','=','remove')]
@@ -397,7 +397,6 @@
-
diff --git a/addons/hr_holidays/report/available_holidays.py b/addons/hr_holidays/report/available_holidays.py
index 26c654db9dd..cb3a89eeb3e 100644
--- a/addons/hr_holidays/report/available_holidays.py
+++ b/addons/hr_holidays/report/available_holidays.py
@@ -19,3 +19,5 @@
#
##############################################################################
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_holidays/security/ir.model.access.csv b/addons/hr_holidays/security/ir.model.access.csv
index 940b0f06447..d2e6c27cded 100644
--- a/addons/hr_holidays/security/ir.model.access.csv
+++ b/addons/hr_holidays/security/ir.model.access.csv
@@ -1,7 +1,7 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_hr_holydays_status_user","hr.holidays.status user","model_hr_holidays_status","base.group_hr_user",1,1,1,1
-"access_hr_holidays_user","hr.holidays.user","model_hr_holidays","base.group_hr_user",1,1,1,1
-"access_hr_holidays_employee","hr.holidays.employee","model_hr_holidays","base.group_user",1,1,1,1
-"access_hr_holydays_status_employee","hr.holidays.status employee","model_hr_holidays_status","base.group_user",1,0,0,0
-"access_hr_holidays_remain_user","hr.holidays.ramain.user","model_hr_holidays_remaining_leaves_user","base.group_hr_user",1,1,1,1
-"access_resource_calendar_leaves_manager","resource_calendar_leaves_manager","resource.model_resource_calendar_leaves","base.group_hr_manager",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_hr_holydays_status_user,hr.holidays.status user,model_hr_holidays_status,base.group_hr_user,1,1,1,1
+access_hr_holidays_user,hr.holidays.user,model_hr_holidays,base.group_hr_user,1,1,1,1
+access_hr_holidays_employee,hr.holidays.employee,model_hr_holidays,base.group_user,1,1,1,1
+access_hr_holydays_status_employee,hr.holidays.status employee,model_hr_holidays_status,base.group_user,1,0,0,0
+access_hr_holidays_remain_user,hr.holidays.ramain.user,model_hr_holidays_remaining_leaves_user,base.group_hr_user,1,1,1,1
+access_resource_calendar_leaves_manager,resource_calendar_leaves_manager,resource.model_resource_calendar_leaves,base.group_hr_manager,1,1,1,1
diff --git a/addons/hr_holidays/test/test_hr_holiday.yml b/addons/hr_holidays/test/test_hr_holiday.yml
index c4a847640b6..af476386e0b 100644
--- a/addons/hr_holidays/test/test_hr_holiday.yml
+++ b/addons/hr_holidays/test/test_hr_holiday.yml
@@ -1,140 +1,34 @@
-
In order to test the hr_holiday module in OpenERP, I will Allocate leaves for Employee and manage leaves and leaves requests.
--
- I create new user "test_holiday_user1" who will make leave request.
--
- !record {model: res.users, id: test_holiday_user1}:
- company_id: base.main_company
- context_lang: en_US
- groups_id:
- - base.group_user
- - base.group_hr_manager
- - base.group_hr_user
- login: test_holiday_user1
- name: test_holiday_user1
- password: test_holiday_user1
--
- I create a new employee “Mark Johnshon” as Manager to validate employee leave.
--
- !record {model: hr.employee, id: hr_employee_employee0}:
- address_home_id: base.res_partner_address_1
- company_id: base.main_company
- gender: male
- name: Mark Johnson
- user_id: base.user_root
--
- I Create another employee "Phil Graves" as "test_holiday_user1".
--
- !record {model: hr.employee, id: hr_employee_philgraves0}:
- address_home_id: base.res_partner_address_8
- name: Phil Graves
- parent_id: 'hr_employee_employee0'
- user_id: 'test_holiday_user1'
--
- I create a new Leave type "Sick Leave".
--
- !record {model: hr.holidays.status, id: hr_holidays_status_sick0}:
- color_name: red
- name: Sick Leave.
- limit: 12
-
--
- I allocate leave request for employee "Phil Graves".
--
- !record {model: hr.holidays, id: hr_holidays_allocateleaveforuser0}:
- holiday_status_id: hr_holidays_status_sick0
- name: Sick Leaves for Phil Graves
- number_of_days_temp: 12.0
- date_from: !eval "'%s-05-20 13:59:00' %(datetime.now().year)"
- date_to: !eval "'%s-05-22 13:59:00' %(datetime.now().year)"
- type: add
--
- I assign allocation type as 'Employee'.
--
- !python {model: hr.holidays}: |
- self.onchange_type(cr, uid, [ref('hr_holidays_allocateleaveforuser0')], 'employee')
--
- I change Leave Type of the employee.
--
- !python {model: hr.holidays}: |
- res = self.onchange_sec_id(cr, uid, [ref('hr_holidays_allocateleaveforuser0')], ref('holiday_status_sl'))
- values = dict([('holiday_status_id', ref('holiday_status_sl'))] + res['value'].items())
- self.write(cr, uid, [ref('hr_holidays_allocateleaveforuser0')], values, None)
-
I assign the dates in the holiday request.
-
- !python {model: hr.holidays}: |
- from datetime import datetime
- date_from = '%s-%s-%s 14:00:00' %(datetime.now().year, datetime.now().month, datetime.now().day)
- date_to = '%s-%s-%s 19:59:00' %(datetime.now().year, datetime.now().month, datetime.now().day)
- res = self.onchange_date_from(cr, uid, [ref('hr_holidays_allocateleaveforuser0')], date_to, date_from)
- values = dict([('date_from', date_from),('date_to',date_to)] + res['value'].items())
- self.write(cr, uid, [ref('hr_holidays_allocateleaveforuser0')], values, None)
+ !record {model: hr.holidays, id: hr_holiday1}:
+ name: Sick Leave
+ holiday_status_id: holiday_status_cl
+ date_from: !eval time.strftime('%Y-%m-10 10:00:00')
+ date_to: !eval time.strftime('%Y-%m-11 19:00:00')
+ employee_id: hr.employee1
+ type: remove
-
- I confirmed the allocation by clicking on "Confirm" button.
+ I confirmed the holiday request by clicking on "Confirm" button.
-
- !workflow {model: hr.holidays, action: confirm, ref: hr_holidays_allocateleaveforuser0}
-
+ !workflow {model: hr.holidays, action: confirm, ref: hr_holidays_employee1_cl}
-
- I find a small mistake on my leave request to I refuse the leave request to correct a mistake.
+ I find a small mistake on my leave request to I click on "Refuse" button to correct a mistake.
-
- !workflow {model: hr.holidays, action: refuse, ref: hr_holidays_allocateleaveforuser0}
-
+ !workflow {model: hr.holidays, action: refuse, ref: hr_holidays_employee1_cl}
-
I again set to draft and then confirm.
-
!python {model: hr.holidays}: |
import netsvc
wf_service = netsvc.LocalService("workflow")
- self.set_to_draft(cr, uid, [ref('hr_holidays_allocateleaveforuser0')])
- wf_service.trg_validate(uid, 'hr.holidays', ref('hr_holidays_allocateleaveforuser0'), 'confirm', cr)
+ self.set_to_draft(cr, uid, [ref('hr_holidays_employee1_cl')])
+ wf_service.trg_validate(uid, 'hr.holidays', ref('hr_holidays_employee1_cl'), 'confirm', cr)
-
- I validate the allocation by clicking on "To Approve" button.
+ I validate the holiday request by clicking on "To Approve" button.
-
- !workflow {model: hr.holidays, action: validate, ref: hr_holidays_allocateleaveforuser0}
-
+ !workflow {model: hr.holidays, action: validate, ref: hr_holidays_employee1_cl}
-
- I connect as "test_holiday_user1", and create a new leave request for employee "Phil Graves".
--
- !record {model: hr.holidays, id: hr_holidays_iwanttoleaveforgotohospital0}:
- date_from: !eval "'%s-05-20 11:48:00' %(datetime.now().year)"
- date_to: !eval "'%s-05-21 11:48:00' %(datetime.now().year)"
- employee_id: 'hr_employee_philgraves0'
- holiday_status_id: 'hr_holidays_status_sick0'
- name: Appointment with Doctor
- notes: My appointment with the doctor is confirmed. So please accept my leave.
- number_of_days_temp: 2.0
- type: remove
- user_id: 'test_holiday_user1'
--
- I check that Leave Request is in "Draft" state.
--
- !assert {model: hr.holidays, id: hr_holidays_iwanttoleaveforgotohospital0}:
- - state == 'draft'
-
--
- I confirm leave Request by click on "Confirm" button.
--
- !workflow {model: hr.holidays, action: confirm, ref: hr_holidays_iwanttoleaveforgotohospital0}
-
--
- I connect as "Admin" user and Open Leave request of "Phil Graves" and "validate" it by click on "Approve" button.
--
- !workflow {model: hr.holidays, action: validate, ref: hr_holidays_iwanttoleaveforgotohospital0}
-
--
- I check that "Leave Manager" field is automatically filled by the user who validate the leave'.
--
- !python {model: hr.holidays}: |
- ids2 = self.pool.get('hr.employee').search(cr, uid, [('user_id','=', uid)])
- obj = self.browse(cr, uid, ref('hr_holidays_iwanttoleaveforgotohospital0'))
- assert ids2[0] == obj.manager_id.id
-
--
- I check that Leave request state is "Validated".
--
- !assert {model: hr.holidays, id: hr_holidays_iwanttoleaveforgotohospital0}:
- - state == "validate"
-
--
- I can also see Summary of Employee's holiday by using 'Employee's Holidays' Report. This report will allows to choose to print holidays with state Confirmed, Validated or both.
+ I can also see Summary of Employee's holiday by using "Employee's Holidays" Report. This report will allows to choose to print holidays with state Confirmed, Validated or both.
diff --git a/addons/hr_holidays/wizard/hr_holidays_summary_employees_view.xml b/addons/hr_holidays/wizard/hr_holidays_summary_employees_view.xml
index 980ad38c855..530d2a60351 100644
--- a/addons/hr_holidays/wizard/hr_holidays_summary_employees_view.xml
+++ b/addons/hr_holidays/wizard/hr_holidays_summary_employees_view.xml
@@ -35,7 +35,6 @@
-
Employee's Holidays
client_print_multi
@@ -44,4 +43,4 @@
-
\ No newline at end of file
+
diff --git a/addons/hr_payroll/__openerp__.py b/addons/hr_payroll/__openerp__.py
index 5c78b80f095..c659444551e 100644
--- a/addons/hr_payroll/__openerp__.py
+++ b/addons/hr_payroll/__openerp__.py
@@ -71,6 +71,7 @@ Generic Payroll system.
'installable': True,
'active': False,
'certificate' : '001046261404562128861',
+ 'application': True,
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_payroll/hr_payroll.py b/addons/hr_payroll/hr_payroll.py
index 080b0dede20..aaf215c87f5 100644
--- a/addons/hr_payroll/hr_payroll.py
+++ b/addons/hr_payroll/hr_payroll.py
@@ -298,6 +298,14 @@ class hr_payslip(osv.osv):
context=context).company_id.id,
}
+ def _check_dates(self, cr, uid, ids, context=None):
+ for payslip in self.browse(cr, uid, ids, context=context):
+ if payslip.date_from > payslip.date_to:
+ return False
+ return True
+
+ _constraints = [(_check_dates, "Payslip 'Date From' must be before 'Date To'.", ['date_from', 'date_to'])]
+
def copy(self, cr, uid, id, default=None, context=None):
if not default:
default = {}
@@ -646,7 +654,7 @@ class hr_payslip(osv.osv):
'struct_id': False,
}
}
- if not employee_id:
+ if (not employee_id) or (not date_from) or (not date_to):
return res
ttyme = datetime.fromtimestamp(time.mktime(time.strptime(date_from, "%Y-%m-%d")))
employee_id = empolyee_obj.browse(cr, uid, employee_id, context=context)
@@ -928,6 +936,10 @@ class hr_payslip_line(osv.osv):
'total': fields.function(_calculate_total, method=True, type='float', string='Total', digits_compute=dp.get_precision('Payroll'),store=True ),
}
+ _defaults = {
+ 'quantity': 1.0,
+ }
+
hr_payslip_line()
class hr_payroll_structure(osv.osv):
diff --git a/addons/hr_payroll/hr_payroll_demo.xml b/addons/hr_payroll/hr_payroll_demo.xml
index e888ad6f133..7d670d6cafa 100644
--- a/addons/hr_payroll/hr_payroll_demo.xml
+++ b/addons/hr_payroll/hr_payroll_demo.xml
@@ -146,7 +146,7 @@
Default contract for marketing executives
-
+
@@ -158,7 +158,6 @@
This is Quentin Paolino's contract
-
diff --git a/addons/hr_payroll/hr_payroll_report.xml b/addons/hr_payroll/hr_payroll_report.xml
index a0027d70e0d..a1b3587313a 100644
--- a/addons/hr_payroll/hr_payroll_report.xml
+++ b/addons/hr_payroll/hr_payroll_report.xml
@@ -6,7 +6,7 @@
auto="False"
id="payslip_report"
model="hr.payslip"
- name="test.pdf"
+ name="payslip"
rml="hr_payroll/report/report_payslip.rml"
string="Employee PaySlip" />
diff --git a/addons/hr_payroll/hr_payroll_view.xml b/addons/hr_payroll/hr_payroll_view.xml
index 01fe270710d..5f2e977f116 100644
--- a/addons/hr_payroll/hr_payroll_view.xml
+++ b/addons/hr_payroll/hr_payroll_view.xml
@@ -262,7 +262,7 @@
-
+
@@ -759,13 +759,14 @@
diff --git a/addons/hr_payroll/i18n/cs.po b/addons/hr_payroll/i18n/cs.po
new file mode 100644
index 00000000000..bf9a6b2bddd
--- /dev/null
+++ b/addons/hr_payroll/i18n/cs.po
@@ -0,0 +1,1636 @@
+# Czech translation for openobject-addons
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2011-01-11 11:15+0000\n"
+"PO-Revision-Date: 2011-11-29 13:31+0000\n"
+"Last-Translator: Jiří Hajda \n"
+"Language-Team: Czech \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-11-30 05:27+0000\n"
+"X-Generator: Launchpad (build 14404)\n"
+"X-Poedit-Language: Czech\n"
+
+#. module: hr_payroll
+#: report:employees.salary:0
+msgid "E-mail Address"
+msgstr "E-mailová adresa"
+
+#. module: hr_payroll
+#: view:hr.allounce.deduction.categoty:0
+msgid "Based"
+msgstr "Založeno"
+
+#. module: hr_payroll
+#: field:hr.contract,net:0
+#: field:hr.employee,net:0
+#: field:hr.payroll.register,net:0
+#: field:hr.payslip,net:0
+#: report:salary.structure:0
+msgid "Net Salary"
+msgstr "Čistý plat"
+
+#. module: hr_payroll
+#: view:hr.payslip:0
+msgid "Recompute Sheet"
+msgstr "Přepočítat list"
+
+#. module: hr_payroll
+#: report:employees.salary:0
+msgid "Employees Salary Details"
+msgstr "Podrobnosti platu zaměstnance"
+
+#. module: hr_payroll
+#: report:employees.salary:0
+msgid "Allowances with Basic:"
+msgstr "Odměny se základem:"
+
+#. module: hr_payroll
+#: report:employees.salary:0
+#: report:salary.structure:0
+msgid "Department"
+msgstr "Oddělení"
+
+#. module: hr_payroll
+#: report:employees.salary:0
+msgid "Deductions:"
+msgstr "Odpočty"
+
+#. module: hr_payroll
+#: field:company.contribution,gratuity:0
+msgid "Use for Gratuity ?"
+msgstr "Použití pro prémie ?"
+
+#. module: hr_payroll
+#: field:hr.contract,working_days_per_week:0
+#: field:hr.payslip,working_days:0
+#: report:payslip.pdf:0
+msgid "Working Days"
+msgstr "Pracovní dny"
+
+#. module: hr_payroll
+#: selection:hr.allounce.deduction.categoty,type:0
+#: selection:hr.payslip.line,type:0
+msgid "Loan"
+msgstr "Půjčka"
+
+#. module: hr_payroll
+#: report:hr.payroll.register.sheet:0
+msgid "Salary Payment Register"
+msgstr "Registr placení mzdy"
+
+#. module: hr_payroll
+#: field:hr.employee,slip_ids:0
+#: view:hr.payroll.register:0
+#: field:hr.payroll.register,line_ids:0
+#: model:ir.actions.act_window,name:hr_payroll.act_hr_employee_payslip_list
+msgid "Payslips"
+msgstr "Výplatní pásky"
+
+#. module: hr_payroll
+#: model:ir.actions.report.xml,name:hr_payroll.year_salary_report
+msgid "Year Salary Report"
+msgstr "Roční výkaz platu"
+
+#. module: hr_payroll
+#: selection:hr.payroll.register,state:0
+#: selection:hr.payslip,state:0
+msgid "Paid Salary"
+msgstr "Zaplacený plat"
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid "("
+msgstr "("
+
+#. module: hr_payroll
+#: field:company.contribution,company_id:0
+#: field:hr.allounce.deduction.categoty,company_id:0
+#: field:hr.contibution.register,company_id:0
+#: field:hr.holidays.status,company_id:0
+#: field:hr.payroll.advice,company_id:0
+#: field:hr.payroll.register,company_id:0
+#: field:hr.payroll.structure,company_id:0
+#: field:hr.payslip,company_id:0
+msgid "Company"
+msgstr "Společnost"
+
+#. module: hr_payroll
+#: report:payroll.advice:0
+msgid "The Manager"
+msgstr "Správce"
+
+#. module: hr_payroll
+#: view:hr.payroll.advice:0
+msgid "Letter Details"
+msgstr "Podrobnosti dopisu"
+
+#. module: hr_payroll
+#: report:hr.payroll.register.sheet:0
+#: report:payslip.pdf:0
+msgid ","
+msgstr ","
+
+#. module: hr_payroll
+#: view:hr.payroll.advice:0
+#: view:hr.payroll.register:0
+#: view:hr.payslip:0
+msgid "Set to Draft"
+msgstr "Nastavit na koncept"
+
+#. module: hr_payroll
+#: code:addons/hr_payroll/hr_payroll.py:180
+#: code:addons/hr_payroll/hr_payroll.py:195
+#: code:addons/hr_payroll/hr_payroll.py:285
+#: code:addons/hr_payroll/hr_payroll.py:835
+#: code:addons/hr_payroll/hr_payroll.py:1111
+#: code:addons/hr_payroll/hr_payroll.py:1126
+#: code:addons/hr_payroll/hr_payroll.py:1410
+#, python-format
+msgid "Variable Error: %s "
+msgstr "Chyba proměnné: %s "
+
+#. module: hr_payroll
+#: view:hr.passport:0
+msgid "Expire"
+msgstr "Vyprší"
+
+#. module: hr_payroll
+#: selection:hr.holidays.status,type:0
+msgid "Half-Pay Holiday"
+msgstr "Na půl placená dovolená"
+
+#. module: hr_payroll
+#: report:hr.payroll.register.sheet:0
+#: field:hr.payslip,other_pay:0
+msgid "Others"
+msgstr "Jiné"
+
+#. module: hr_payroll
+#: field:hr.payslip.line,slip_id:0
+#: model:ir.model,name:hr_payroll.model_hr_payslip
+#: report:payslip.pdf:0
+msgid "Pay Slip"
+msgstr "Mzdový list"
+
+#. module: hr_payroll
+#: report:salary.structure:0
+msgid "Contract Detail:"
+msgstr "Podrobnosti smlouvy:"
+
+#. module: hr_payroll
+#: field:hr.payslip,igross:0
+#: field:hr.payslip,inet:0
+msgid "Calculaton Field"
+msgstr "Výpočtové pole"
+
+#. module: hr_payroll
+#: help:hr.payroll.advice,bank_id:0
+#: help:hr.payroll.register,bank_id:0
+msgid "Select the Bank Address from whcih the salary is going to be paid"
+msgstr "Vyberte adresu banky, z které bude vyplacen plat"
+
+#. module: hr_payroll
+#: view:hr.payroll.advice:0
+#: field:hr.payroll.advice.line,advice_id:0
+msgid "Bank Advice"
+msgstr "Bankovní návěští"
+
+#. module: hr_payroll
+#: selection:hr.payroll.advice,state:0
+#: selection:hr.payroll.register,state:0
+#: selection:hr.payslip,state:0
+msgid "Reject"
+msgstr "Zamítnout"
+
+#. module: hr_payroll
+#: selection:hr.allounce.deduction.categoty,type:0
+#: selection:hr.payslip.line,type:0
+msgid "Leaves"
+msgstr "Uvolnění"
+
+#. module: hr_payroll
+#: field:hr.contibution.register.line,register_id:0
+#: view:hr.payslip:0
+#: field:hr.payslip,register_id:0
+#: report:payslip.pdf:0
+msgid "Register"
+msgstr "Registrace"
+
+#. module: hr_payroll
+#: constraint:hr.employee:0
+msgid ""
+"Error ! You cannot select a department for which the employee is the manager."
+msgstr "Chyba ! Nemůžete vybrat oddělení, kterého je zaměstnanec vedoucí."
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid "Total Deductions"
+msgstr "Celkem odpočty"
+
+#. module: hr_payroll
+#: field:company.contribution.line,value:0
+#: field:hr.payslip.line.line,value:0
+msgid "Value"
+msgstr "Hodnota"
+
+#. module: hr_payroll
+#: report:payroll.advice:0
+msgid "Name of the Employee"
+msgstr "Jméno zaměstnance"
+
+#. module: hr_payroll
+#: view:hr.contibution.register:0
+msgid "Register Lines"
+msgstr "Řádky registru"
+
+#. module: hr_payroll
+#: view:hr.payslip:0
+msgid "Salary Computation"
+msgstr "Výpočet mzdy"
+
+#. module: hr_payroll
+#: field:hr.payroll.advice.line,amount:0
+#: report:payroll.advice:0
+#: report:salary.structure:0
+msgid "Amount"
+msgstr "Částka"
+
+#. module: hr_payroll
+#: code:addons/hr_payroll/hr_payroll.py:1225
+#, python-format
+msgid "Please check configuration of %s, payroll head is missing"
+msgstr "Prosíme zkontrolujte nastavení %s, chybí hlavička výplatního listu"
+
+#. module: hr_payroll
+#: selection:company.contribution,amount_type:0
+msgid "Percentage"
+msgstr "Procenta"
+
+#. module: hr_payroll
+#: view:company.contribution:0
+#: view:hr.allounce.deduction.categoty:0
+msgid "Other Information"
+msgstr "Jiné informace"
+
+#. module: hr_payroll
+#: field:hr.passport,country_id:0
+msgid "Country of Issue"
+msgstr "Vydávající země"
+
+#. module: hr_payroll
+#: field:hr.contibution.register.line,emp_deduction:0
+msgid "Employee Deduction"
+msgstr "Odpočty zaměstnance"
+
+#. module: hr_payroll
+#: selection:hr.allounce.deduction.categoty,type:0
+#: selection:hr.payslip.line,type:0
+msgid "Other Deduction"
+msgstr "Jiné odpočty"
+
+#. module: hr_payroll
+#: selection:hr.holidays.status,type:0
+msgid "Paid Holiday"
+msgstr "Placená dovolená"
+
+#. module: hr_payroll
+#: view:company.contribution:0
+#: view:hr.allounce.deduction.categoty:0
+#: view:hr.passport:0
+#: view:hr.payslip:0
+msgid "Group By..."
+msgstr "Seskupit podle..."
+
+#. module: hr_payroll
+#: field:hr.passport,date_expire:0
+msgid "Passport Expire Date"
+msgstr "Datum vypršení pasu"
+
+#. module: hr_payroll
+#: selection:hr.holidays.status,type:0
+msgid "Un-Paid Holiday"
+msgstr "Neplacená dovolená"
+
+#. module: hr_payroll
+#: view:hr.passport:0
+msgid "Valid From"
+msgstr "Platné od"
+
+#. module: hr_payroll
+#: help:hr.payslip,igross:0
+#: help:hr.payslip,inet:0
+msgid ""
+"Calculation field used for internal calculation, do not place this on form"
+msgstr ""
+"Výpočtové pole použité pro vnitřní výpočty, neumísťujte jej do formuláře"
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid "Amount (in words) :"
+msgstr "Částka (slovně) :"
+
+#. module: hr_payroll
+#: field:hr.holidays.status,type:0
+msgid "Payment"
+msgstr "Patba"
+
+#. module: hr_payroll
+#: view:hr.payroll.structure:0
+#: view:hr.payslip:0
+#: field:hr.payslip,line_ids:0
+#: view:hr.payslip.line:0
+#: model:ir.model,name:hr_payroll.model_hr_payslip_line
+msgid "Payslip Line"
+msgstr "Řádek výplatní pásky"
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid "Identification No"
+msgstr "Identifikační č."
+
+#. module: hr_payroll
+#: view:hr.allounce.deduction.categoty:0
+#: field:hr.allounce.deduction.categoty,base:0
+msgid "Based on"
+msgstr "Založeno na"
+
+#. module: hr_payroll
+#: selection:hr.payroll.register,state:0
+#: selection:hr.payslip,state:0
+msgid "Wating for Verification"
+msgstr "Čekající na ověření"
+
+#. module: hr_payroll
+#: model:ir.module.module,shortdesc:hr_payroll.module_meta_information
+msgid "Human Resource Payroll"
+msgstr "Mzdy lidských zdrojů"
+
+#. module: hr_payroll
+#: report:payroll.advice:0
+msgid "Total:"
+msgstr "Celkem:"
+
+#. module: hr_payroll
+#: view:hr.payslip:0
+msgid "Posted"
+msgstr "Zasláno"
+
+#. module: hr_payroll
+#: model:ir.module.module,description:hr_payroll.module_meta_information
+msgid ""
+"Generic Payroll system\n"
+" * Employee Details\n"
+" * Employee Contracts\n"
+" * Passport based Contract\n"
+" * Allowances / Deductions\n"
+" * Allow to configure Basic / Grows / Net Salary\n"
+" * Employee Payslip\n"
+" * Monthly Payroll Register\n"
+" * Integrated with Holiday Management\n"
+" "
+msgstr ""
+"Obecný mzdový systém\n"
+" * Podrobnosti zaměstnance\n"
+" * Smlouvy zaměstnance\n"
+" * Smlouvy založené na pasu\n"
+" * Přídavky / Odpočty\n"
+" * Umožňuje nastavit základní / hrubé /čisté mzdy\n"
+" * Výplatní pásky zaměstnanců\n"
+" * Měsíční registr mezd\n"
+" * Integrováno se správou dovolených\n"
+" "
+
+#. module: hr_payroll
+#: model:ir.model,name:hr_payroll.model_hr_holidays_status
+msgid "Leave Type"
+msgstr "Typ uvolnění"
+
+#. module: hr_payroll
+#: report:hr.payroll.register.sheet:0
+msgid "Date :"
+msgstr "Datum:"
+
+#. module: hr_payroll
+#: field:hr.payslip.line,total:0
+msgid "Sub Total"
+msgstr "Mezivýsledek"
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid "Payments -"
+msgstr "Platby -"
+
+#. module: hr_payroll
+#: field:hr.contract,visa_no:0
+msgid "Visa No"
+msgstr "Č. víza"
+
+#. module: hr_payroll
+#: field:company.contribution.line,from_val:0
+#: report:employees.salary:0
+#: field:hr.payslip.line.line,from_val:0
+#: report:year.salary:0
+msgid "From"
+msgstr "Od"
+
+#. module: hr_payroll
+#: field:hr.payroll.advice.line,bysal:0
+#: report:payroll.advice:0
+msgid "By Salary"
+msgstr "Podle platu"
+
+#. module: hr_payroll
+#: field:hr.payroll.employees.detail,date_to:0
+#: field:hr.payroll.year.salary,date_to:0
+#: report:salary.structure:0
+msgid "End Date"
+msgstr "Koncové datum"
+
+#. module: hr_payroll
+#: model:ir.actions.report.xml,name:hr_payroll.salary_payslip
+msgid "Employee PaySlip"
+msgstr "Výplatní páska zaměstnance"
+
+#. module: hr_payroll
+#: field:hr.payslip,leaves:0
+msgid "Leave Deductions"
+msgstr "Odvody uvolnění"
+
+#. module: hr_payroll
+#: report:hr.payroll.register.sheet:0
+#: report:payroll.advice:0
+msgid "Authorised Signature"
+msgstr "Oprávněný podpis"
+
+#. module: hr_payroll
+#: selection:hr.payslip.line,amount_type:0
+msgid "Function Value"
+msgstr "Hodnota funkce"
+
+#. module: hr_payroll
+#: model:ir.model,name:hr_payroll.model_hr_contibution_register_line
+msgid "Contribution Register Line"
+msgstr "Řádek registru příspěvků"
+
+#. module: hr_payroll
+#: report:salary.structure:0
+msgid "Notes:"
+msgstr "Poznámky:"
+
+#. module: hr_payroll
+#: field:hr.payroll.advice,state:0
+#: field:hr.payroll.register,state:0
+#: field:hr.payslip,state:0
+msgid "State"
+msgstr "Stav"
+
+#. module: hr_payroll
+#: view:hr.payroll.advice:0
+msgid "Paymeny Lines"
+msgstr "Řádky platby"
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid "Other Lines"
+msgstr "Jiné řádky"
+
+#. module: hr_payroll
+#: view:company.contribution:0
+#: view:hr.allounce.deduction.categoty:0
+#: view:hr.payroll.structure:0
+#: view:hr.payslip:0
+#: view:hr.payslip.line:0
+msgid "Function Arguments"
+msgstr "Parametry funkce"
+
+#. module: hr_payroll
+#: model:ir.actions.act_window,name:hr_payroll.action_hr_company_contribution_tree
+#: model:ir.ui.menu,name:hr_payroll.menu_hr_company_contribution_tree
+msgid "Company Contributions"
+msgstr "Příspěvky společnosti"
+
+#. module: hr_payroll
+#: field:hr.contibution.register.line,employee_id:0
+#: field:hr.passport,employee_id:0
+#: field:hr.payroll.advice.line,employee_id:0
+#: field:hr.payslip,employee_id:0
+#: field:hr.payslip.line,employee_id:0
+#: model:ir.model,name:hr_payroll.model_hr_employee
+msgid "Employee"
+msgstr "Zaměstnanec"
+
+#. module: hr_payroll
+#: field:hr.payslip.line,base:0
+msgid "Formula"
+msgstr "Vzorec"
+
+#. module: hr_payroll
+#: model:ir.model,name:hr_payroll.model_hr_payroll_advice_line
+msgid "Bank Advice Lines"
+msgstr "Řádky bankovního avíza"
+
+#. module: hr_payroll
+#: view:company.contribution:0
+#: view:hr.allounce.deduction.categoty:0
+#: field:hr.allounce.deduction.categoty,type:0
+#: field:hr.payslip.line,type:0
+#: report:salary.structure:0
+msgid "Type"
+msgstr "Typ"
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid "Email"
+msgstr "Email"
+
+#. module: hr_payroll
+#: report:hr.payroll.register.sheet:0
+msgid "#"
+msgstr "#"
+
+#. module: hr_payroll
+#: code:addons/hr_payroll/hr_payroll.py:469
+#: code:addons/hr_payroll/hr_payroll.py:1225
+#, python-format
+msgid "Error !"
+msgstr "Chyba !"
+
+#. module: hr_payroll
+#: view:hr.payroll.register:0
+#: view:hr.payslip:0
+msgid "Verify Sheet"
+msgstr "Ověřovací list"
+
+#. module: hr_payroll
+#: help:hr.contract,working_days_per_week:0
+msgid "No of Working days / week for an employee"
+msgstr "Poč. pracovních dnů / týdnů pro zaměstnance"
+
+#. module: hr_payroll
+#: selection:hr.payroll.register,state:0
+#: selection:hr.payslip,state:0
+msgid "New Slip"
+msgstr "Nový list"
+
+#. module: hr_payroll
+#: field:hr.payslip,basic:0
+msgid "Net Basic"
+msgstr "Základ čistého"
+
+#. module: hr_payroll
+#: field:hr.contract,gross:0
+#: field:hr.employee,gross:0
+#: field:hr.payroll.register,grows:0
+#: field:hr.payslip,grows:0
+#: report:salary.structure:0
+msgid "Gross Salary"
+msgstr "Hrubá mzda"
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid "Total Earnings"
+msgstr "Výdělek celkem"
+
+#. module: hr_payroll
+#: model:ir.actions.act_window,name:hr_payroll.action_hr_payroll_employees_detail
+#: model:ir.ui.menu,name:hr_payroll.menu_hr_payroll_employees_detail
+msgid "Employee Salary Statement"
+msgstr "Příkaz mzdy zaměstnance"
+
+#. module: hr_payroll
+#: selection:hr.allounce.deduction.categoty,type:0
+#: selection:hr.payslip.line,type:0
+msgid "Other Payment"
+msgstr "Jiné platby"
+
+#. module: hr_payroll
+#: field:hr.employee,advantages_net:0
+#: report:payslip.pdf:0
+#: report:salary.structure:0
+msgid "Deductions"
+msgstr "Odpočty"
+
+#. module: hr_payroll
+#: report:payroll.advice:0
+msgid "C/D"
+msgstr "C/D"
+
+#. module: hr_payroll
+#: field:hr.contract,permit_no:0
+msgid "Work Permit No"
+msgstr "Č. pracovního povolení"
+
+#. module: hr_payroll
+#: field:hr.payroll.advice,line_ids:0
+msgid "Employee Salary"
+msgstr "Mzda zaměstnance"
+
+#. module: hr_payroll
+#: field:hr.payroll.advice,chaque_nos:0
+msgid "Chaque Nos"
+msgstr "Č. poukázek"
+
+#. module: hr_payroll
+#: field:hr.contibution.register,monthly_total_by_emp:0
+msgid "Total By Employee"
+msgstr "Celkem podle zaměstnance"
+
+#. module: hr_payroll
+#: view:company.contribution:0
+#: selection:company.contribution,amount_type:0
+#: selection:company.contribution.line,amount_type:0
+#: selection:hr.payslip.line,amount_type:0
+#: selection:hr.payslip.line.line,amount_type:0
+msgid "Fixed Amount"
+msgstr "Pevná částka"
+
+#. module: hr_payroll
+#: field:company.contribution.line,to_val:0
+#: report:employees.salary:0
+#: field:hr.payslip.line.line,to_val:0
+#: report:year.salary:0
+msgid "To"
+msgstr "Komu"
+
+#. module: hr_payroll
+#: code:addons/hr_payroll/hr_payroll.py:180
+#: code:addons/hr_payroll/hr_payroll.py:195
+#: code:addons/hr_payroll/hr_payroll.py:285
+#: code:addons/hr_payroll/hr_payroll.py:835
+#: code:addons/hr_payroll/hr_payroll.py:1111
+#: code:addons/hr_payroll/hr_payroll.py:1126
+#: code:addons/hr_payroll/hr_payroll.py:1410
+#, python-format
+msgid "Variable Error !"
+msgstr "Chyba proměnné !"
+
+#. module: hr_payroll
+#: model:ir.model,name:hr_payroll.model_hr_payroll_employees_detail
+msgid "hr.payroll.employees.detail"
+msgstr "hr.payroll.employees.detail"
+
+#. module: hr_payroll
+#: view:hr.payroll.register:0
+#: view:hr.payslip:0
+msgid "Pay Salary"
+msgstr "Vyplatit mzdu"
+
+#. module: hr_payroll
+#: field:hr.payroll.advice.line,name:0
+msgid "Bank Account A/C"
+msgstr "Bankovní účet A/C"
+
+#. module: hr_payroll
+#: view:hr.contibution.register:0
+msgid "Contribution Lines"
+msgstr "Řádky příspěvků"
+
+#. module: hr_payroll
+#: report:hr.payroll.register.sheet:0
+msgid "For the month of"
+msgstr "Pro měsíc z"
+
+#. module: hr_payroll
+#: view:hr.allounce.deduction.categoty:0
+#: selection:hr.allounce.deduction.categoty,type:0
+#: field:hr.payroll.register,deduction:0
+#: report:hr.payroll.register.sheet:0
+#: field:hr.payslip,deduction:0
+#: selection:hr.payslip.line,type:0
+msgid "Deduction"
+msgstr "Odpočty"
+
+#. module: hr_payroll
+#: model:ir.model,name:hr_payroll.model_hr_payroll_advice
+msgid "Bank Advice Note"
+msgstr "Poznámka bankovního avíza"
+
+#. module: hr_payroll
+#: view:hr.payroll.register:0
+#: view:hr.payslip:0
+msgid "Payslip"
+msgstr "Výplatní list"
+
+#. module: hr_payroll
+#: constraint:hr.contract:0
+msgid "Error! contract start-date must be lower then contract end-date."
+msgstr "Chyba! Počáteční datum smlouvy musí být nižší než konečné datum."
+
+#. module: hr_payroll
+#: selection:hr.allounce.deduction.categoty,type:0
+#: selection:hr.payslip.line,type:0
+msgid "Loan Installment"
+msgstr "Půjčovací zřízení"
+
+#. module: hr_payroll
+#: view:hr.payroll.register:0
+msgid "Complete HR Checking"
+msgstr "Celková kontrola HR"
+
+#. module: hr_payroll
+#: report:payroll.advice:0
+msgid "Yours Sincerely"
+msgstr "S přátelským pozdravem"
+
+#. module: hr_payroll
+#: report:payroll.advice:0
+msgid "SI. No."
+msgstr "Č. SI."
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid "Net Amount"
+msgstr "Částka čistkého"
+
+#. module: hr_payroll
+#: report:salary.structure:0
+msgid "Salary Structure:"
+msgstr "Struktura platu:"
+
+#. module: hr_payroll
+#: model:ir.actions.report.xml,name:hr_payroll.year_employees_detail
+msgid "Employees Salary Detail"
+msgstr "Podrobnosti mezd zaměstnanců"
+
+#. module: hr_payroll
+#: model:ir.model,name:hr_payroll.model_hr_payslip_line_line
+msgid "Function Line"
+msgstr "Řádek funkce"
+
+#. module: hr_payroll
+#: view:hr.payroll.advice:0
+#: selection:hr.payroll.advice,state:0
+#: selection:hr.payroll.register,state:0
+#: selection:hr.payslip,state:0
+msgid "Confirm Sheet"
+msgstr "Potvrzovací list"
+
+#. module: hr_payroll
+#: report:employees.salary:0
+msgid "Others:"
+msgstr "Jiné:"
+
+#. module: hr_payroll
+#: view:company.contribution:0
+#: selection:company.contribution,amount_type:0
+msgid "Function Calculation"
+msgstr "Výpoče funkce"
+
+#. module: hr_payroll
+#: field:hr.payslip,worked_days:0
+#: report:payslip.pdf:0
+msgid "Worked Day"
+msgstr "Pracovních dnů"
+
+#. module: hr_payroll
+#: field:hr.contibution.register,monthly_total_by_comp:0
+msgid "Total By Company"
+msgstr "Celkem podle společnosti"
+
+#. module: hr_payroll
+#: field:hr.payroll.advice.line,flag:0
+msgid "D/C"
+msgstr "D/C"
+
+#. module: hr_payroll
+#: view:hr.passport:0
+msgid "Country & Address"
+msgstr "Zěmě & Adresa"
+
+#. module: hr_payroll
+#: report:employees.salary:0
+msgid "Employee Code"
+msgstr "Kód zaměstnance"
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid "Basic Salary – Leaves"
+msgstr "Základní mzda - uvolnění"
+
+#. module: hr_payroll
+#: field:company.contribution,amount_type:0
+#: field:company.contribution.line,amount_type:0
+#: field:hr.payslip.line,amount_type:0
+#: field:hr.payslip.line.line,amount_type:0
+#: report:salary.structure:0
+msgid "Amount Type"
+msgstr "Typ částky"
+
+#. module: hr_payroll
+#: view:company.contribution:0
+#: field:hr.payslip.line,category_id:0
+msgid "Category"
+msgstr "Kategorie"
+
+#. module: hr_payroll
+#: view:company.contribution:0
+#: view:hr.allounce.deduction.categoty:0
+#: field:hr.payslip.line,company_contrib:0
+#: model:ir.model,name:hr_payroll.model_company_contribution
+msgid "Company Contribution"
+msgstr "Příspěvek společnosti"
+
+#. module: hr_payroll
+#: field:company.contribution,category_id:0
+msgid "Heads"
+msgstr "Hlavičky"
+
+#. module: hr_payroll
+#: model:ir.actions.report.xml,name:hr_payroll.year_payroll_register
+msgid "Print Statement"
+msgstr "Tiskový příkaz"
+
+#. module: hr_payroll
+#: view:hr.payslip:0
+msgid "Draft"
+msgstr "Koncept"
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid "Earnings"
+msgstr "Výdělek"
+
+#. module: hr_payroll
+#: report:hr.payroll.register.sheet:0
+#: report:salary.structure:0
+msgid "Basic"
+msgstr "Základní"
+
+#. module: hr_payroll
+#: model:ir.actions.act_window,name:hr_payroll.action_hr_passport_tree
+msgid "All Passports"
+msgstr "Všechny průkazy"
+
+#. module: hr_payroll
+#: model:ir.actions.act_window,name:hr_payroll.action_hr_payroll_year_salary
+#: model:ir.ui.menu,name:hr_payroll.menu_wizard_print_year_salary
+msgid "Salary Register"
+msgstr "Registr mezd"
+
+#. module: hr_payroll
+#: report:employees.salary:0
+#: report:hr.payroll.register.sheet:0
+msgid "Employee Name"
+msgstr "Jméno zaměstnance"
+
+#. module: hr_payroll
+#: model:ir.model,name:hr_payroll.model_hr_passport
+msgid "Passport Detail"
+msgstr "Podrobnosti pasu"
+
+#. module: hr_payroll
+#: selection:hr.payslip.line,amount_type:0
+msgid "Percentage (%)"
+msgstr "Procenta (%)"
+
+#. module: hr_payroll
+#: field:hr.payroll.advice,register_id:0
+#: view:hr.payroll.register:0
+#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_payroll_register_form
+#: model:ir.model,name:hr_payroll.model_hr_payroll_register
+#: model:ir.ui.menu,name:hr_payroll.hr_menu_payroll_register
+msgid "Payroll Register"
+msgstr "Registr výplat"
+
+#. module: hr_payroll
+#: report:hr.payroll.register.sheet:0
+#: report:payroll.advice:0
+msgid "For"
+msgstr "Pro"
+
+#. module: hr_payroll
+#: field:hr.passport,contracts_ids:0
+msgid "Contracts"
+msgstr "Smlouvy"
+
+#. module: hr_payroll
+#: view:hr.payroll.structure:0
+msgid "Employee Function"
+msgstr "Funkce zaměstnance"
+
+#. module: hr_payroll
+#: view:hr.payslip:0
+msgid "Paid"
+msgstr "Placeno"
+
+#. module: hr_payroll
+#: view:hr.payslip:0
+msgid "Approve Sheet"
+msgstr "Schvalovací list"
+
+#. module: hr_payroll
+#: field:hr.payslip,paid:0
+msgid "Paid ? "
+msgstr "Placeno ? "
+
+#. module: hr_payroll
+#: view:hr.holidays.status:0
+msgid "Validation"
+msgstr "Ověření"
+
+#. module: hr_payroll
+#: report:employees.salary:0
+msgid "Title"
+msgstr "Oslovení"
+
+#. module: hr_payroll
+#: view:company.contribution:0
+msgid "Search Company Contribution"
+msgstr "Hledat příspěvky společnosti"
+
+#. module: hr_payroll
+#: field:hr.allounce.deduction.categoty,user_id:0
+msgid "User"
+msgstr "Uživatel"
+
+#. module: hr_payroll
+#: view:hr.payroll.advice:0
+msgid "Payment Lines"
+msgstr "Platební řádky"
+
+#. module: hr_payroll
+#: view:hr.payslip:0
+msgid "Compute Sheet"
+msgstr "Výpočtový list"
+
+#. module: hr_payroll
+#: field:company.contribution,active:0
+#: field:hr.payroll.register,active:0
+msgid "Active"
+msgstr "Aktivní"
+
+#. module: hr_payroll
+#: help:hr.allounce.deduction.categoty,condition:0
+msgid "Applied this head for calculation if condition is true"
+msgstr "Tato hlavička použita pro výpočty, pokud je pravda"
+
+#. module: hr_payroll
+#: report:year.salary:0
+msgid "Yearly Salary Details"
+msgstr "Roční podrobnosti platu"
+
+#. module: hr_payroll
+#: constraint:hr.employee:0
+msgid "Error ! You cannot create recursive Hierarchy of Employees."
+msgstr "Chyba ! Nemůžete vytvořit rekurzivní Hierarchii zaměstnanců"
+
+#. module: hr_payroll
+#: field:hr.allounce.deduction.categoty,condition:0
+msgid "Condition"
+msgstr "Podmínka"
+
+#. module: hr_payroll
+#: selection:hr.payroll.register,state:0
+#: selection:hr.payslip,state:0
+msgid "Wating for HR Verification"
+msgstr "Čekající na ověření HR"
+
+#. module: hr_payroll
+#: report:payroll.advice:0
+msgid "Payment Advice:"
+msgstr "Platební avízo:"
+
+#. module: hr_payroll
+#: view:hr.payroll.register:0
+msgid "Compute"
+msgstr "Spočítat"
+
+#. module: hr_payroll
+#: report:employees.salary:0
+#: field:hr.payslip,deg_id:0
+#: report:payslip.pdf:0
+#: report:salary.structure:0
+msgid "Designation"
+msgstr "Zařazení"
+
+#. module: hr_payroll
+#: report:hr.payroll.register.sheet:0
+msgid "HR Manager"
+msgstr "Správce HR"
+
+#. module: hr_payroll
+#: field:hr.contract,basic:0
+#: field:hr.employee,basic:0
+#: field:hr.payslip,basic_before_leaves:0
+#: report:payslip.pdf:0
+msgid "Basic Salary"
+msgstr "Základní plat"
+
+#. module: hr_payroll
+#: field:hr.allounce.deduction.categoty,code:0
+msgid "Category Code"
+msgstr "Kód kategorie"
+
+#. module: hr_payroll
+#: view:hr.payroll.register:0
+msgid "Salary Information"
+msgstr "Mzdové informace"
+
+#. module: hr_payroll
+#: model:ir.model,name:hr_payroll.model_hr_allounce_deduction_categoty
+#: model:ir.model,name:hr_payroll.model_hr_allounce_deduction_categoty_line
+msgid "Allowance Deduction Categoty"
+msgstr "Kategorie přídavků a odpočtů"
+
+#. module: hr_payroll
+#: view:hr.payslip:0
+msgid "Companies"
+msgstr "Společnosti"
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid "Authorized Signature"
+msgstr "Oprávněný podpis"
+
+#. module: hr_payroll
+#: field:hr.payslip,contract_id:0
+#: model:ir.model,name:hr_payroll.model_hr_contract
+msgid "Contract"
+msgstr "Smlouva"
+
+#. module: hr_payroll
+#: selection:hr.payroll.advice,state:0
+msgid "Draft Sheet"
+msgstr "Návrhový list"
+
+#. module: hr_payroll
+#: selection:hr.payroll.year.salary,salary_on:0
+msgid "Next Month Date"
+msgstr "Datum dalšího měsíce"
+
+#. module: hr_payroll
+#: field:hr.contibution.register.line,date:0
+#: field:hr.payroll.advice,date:0
+#: field:hr.payroll.register,date:0
+#: field:hr.payslip,date:0
+msgid "Date"
+msgstr "Datum"
+
+#. module: hr_payroll
+#: field:hr.contract,visa_expire:0
+msgid "Visa Expire Date"
+msgstr "Datum vypršení víza"
+
+#. module: hr_payroll
+#: view:hr.passport:0
+msgid "Search Passport"
+msgstr "Hledat pas"
+
+#. module: hr_payroll
+#: report:employees.salary:0
+#: report:salary.structure:0
+msgid "Phone No."
+msgstr "Č. telefonu"
+
+#. module: hr_payroll
+#: field:company.contribution,contribute_per:0
+#: field:company.contribution.line,contribution_id:0
+#: view:hr.allounce.deduction.categoty:0
+#: view:hr.contibution.register:0
+#: view:hr.contibution.register.line:0
+msgid "Contribution"
+msgstr "Příspěvky"
+
+#. module: hr_payroll
+#: field:hr.allounce.deduction.categoty,state:0
+msgid "Label"
+msgstr "Označení"
+
+#. module: hr_payroll
+#: view:hr.payroll.structure:0
+#: view:hr.payslip:0
+#: view:hr.payslip.line:0
+msgid "Company contribution"
+msgstr "Příspěvky společnosti"
+
+#. module: hr_payroll
+#: report:employees.salary:0
+#: report:salary.structure:0
+msgid "Other No."
+msgstr "Jiné č."
+
+#. module: hr_payroll
+#: field:company.contribution,code:0
+#: field:hr.contibution.register.line,code:0
+#: field:hr.holidays.status,code:0
+#: field:hr.payroll.structure,code:0
+#: field:hr.payslip.line,code:0
+#: report:payslip.pdf:0
+#: report:salary.structure:0
+msgid "Code"
+msgstr "Kód"
+
+#. module: hr_payroll
+#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_bank_advice_tree
+#: model:ir.ui.menu,name:hr_payroll.hr_menu_payment_advice
+msgid "Payment Advice"
+msgstr "Platební avízo"
+
+#. module: hr_payroll
+#: report:hr.payroll.register.sheet:0
+msgid "Number :"
+msgstr "Číslo :"
+
+#. module: hr_payroll
+#: help:hr.allounce.deduction.categoty,base:0
+msgid ""
+"This will use to computer the % fields values, in general its on basic, but "
+"You can use all heads code field in small letter as a variable name i.e. "
+"hra, ma, lta, etc...., also you can use, static varible basic"
+msgstr ""
+"Toto bude použito pro výpočet hodnot polí %s , obecně je na základě, ale "
+"můžete použít všechny pole kódů v malých písmenných jako jména proměnných "
+"např. hra, ma, lta, atd..., také můžete použít základní statické proměnné."
+
+#. module: hr_payroll
+#: view:hr.payslip:0
+msgid "Computation Overview"
+msgstr "Přehled výpočtů"
+
+#. module: hr_payroll
+#: field:hr.payroll.year.salary,salary_on:0
+msgid "Salary On"
+msgstr "Mzda na"
+
+#. module: hr_payroll
+#: field:hr.payroll.advice,number:0
+#: field:hr.payroll.register,number:0
+#: field:hr.payslip,number:0
+msgid "Number"
+msgstr "Číslo"
+
+#. module: hr_payroll
+#: field:hr.contract,struct_id:0
+#: field:hr.employee,line_ids:0
+#: view:hr.payroll.structure:0
+#: field:hr.payroll.structure,line_ids:0
+#: view:hr.payslip:0
+#: view:hr.payslip.line:0
+#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_employee_grade_form
+#: model:ir.actions.report.xml,name:hr_payroll.salary_structure_register
+#: model:ir.model,name:hr_payroll.model_hr_payroll_structure
+#: model:ir.ui.menu,name:hr_payroll.menu_hr_employee_function
+msgid "Salary Structure"
+msgstr "Struktura platu"
+
+#. module: hr_payroll
+#: field:hr.contibution.register,register_line_ids:0
+msgid "Register Line"
+msgstr "Řádek registru"
+
+#. module: hr_payroll
+#: view:hr.payroll.register:0
+#: view:hr.payslip:0
+msgid "Cancel"
+msgstr "Zrušit"
+
+#. module: hr_payroll
+#: view:hr.payroll.employees.detail:0
+#: view:hr.payroll.year.salary:0
+msgid "Close"
+msgstr "Uzavřít"
+
+#. module: hr_payroll
+#: field:hr.payslip.line,amount:0
+msgid "Amount / Percentage"
+msgstr "Částka / Procenta"
+
+#. module: hr_payroll
+#: field:hr.employee,advantages_gross:0
+#: report:hr.payroll.register.sheet:0
+#: report:salary.structure:0
+msgid "Allowances"
+msgstr "Dávky"
+
+#. module: hr_payroll
+#: selection:hr.payroll.year.salary,salary_on:0
+msgid "Current Month Date"
+msgstr "Datum aktuálního měsíce"
+
+#. module: hr_payroll
+#: report:salary.structure:0
+msgid "Salary"
+msgstr "Plat"
+
+#. module: hr_payroll
+#: field:hr.contract,passport_id:0
+#: field:hr.passport,name:0
+msgid "Passport No"
+msgstr "Číslo pasu"
+
+#. module: hr_payroll
+#: view:hr.passport:0
+msgid "Passport"
+msgstr "Pas"
+
+#. module: hr_payroll
+#: report:hr.payroll.register.sheet:0
+msgid "Total Salary"
+msgstr "Celkový plat"
+
+#. module: hr_payroll
+#: report:payroll.advice:0
+msgid "for period"
+msgstr "pro období"
+
+#. module: hr_payroll
+#: field:hr.holidays.status,head_id:0
+msgid "Payroll Head"
+msgstr "Hlavička výplatního listu"
+
+#. module: hr_payroll
+#: field:company.contribution,register_id:0
+#: model:ir.actions.act_window,name:hr_payroll.action_contibution_register_form
+#: model:ir.model,name:hr_payroll.model_hr_contibution_register
+#: model:ir.ui.menu,name:hr_payroll.menu_action_hr_contibution_register_form
+msgid "Contribution Register"
+msgstr "Registr příspěvků"
+
+#. module: hr_payroll
+#: report:salary.structure:0
+msgid "E-mail"
+msgstr "E-mail"
+
+#. module: hr_payroll
+#: view:hr.allounce.deduction.categoty:0
+#: model:ir.actions.act_window,name:hr_payroll.hr_allounce_deduction_tree
+#: model:ir.ui.menu,name:hr_payroll.menu_hr_allounce_deduction_tree
+msgid "Salary Heads"
+msgstr "Hlavičky platu"
+
+#. module: hr_payroll
+#: view:hr.payroll.employees.detail:0
+#: view:hr.payroll.year.salary:0
+msgid "Print Report"
+msgstr "Tisknout výkaz"
+
+#. module: hr_payroll
+#: field:company.contribution,line_ids:0
+#: view:hr.payroll.structure:0
+#: view:hr.payslip:0
+#: view:hr.payslip.line:0
+#: field:hr.payslip.line,line_ids:0
+msgid "Calculations"
+msgstr "Výpočty"
+
+#. module: hr_payroll
+#: help:company.contribution,contribute_per:0
+msgid ""
+"Define Company contribution ratio 1.00=100% contribution, If Employee "
+"Contribute 5% then company will and here 0.50 defined then company will "
+"contribute 50% on employee 5% contribution"
+msgstr ""
+"Určuje poměř příspěvků společnosti 1,00=100% příspěvků. Pokud je zaměstnance "
+"přispěje 5%, pak spoleřnost bude a zde 0,5 určeno, pak společnost přispěje "
+"50% na 5% příspěvek zaměstnance."
+
+#. module: hr_payroll
+#: view:hr.payslip:0
+msgid "Other Informations"
+msgstr "Jiné informace"
+
+#. module: hr_payroll
+#: view:hr.contibution.register:0
+msgid "Month"
+msgstr "Měsíc"
+
+#. module: hr_payroll
+#: view:hr.passport:0
+msgid "Issue"
+msgstr "Vydano"
+
+#. module: hr_payroll
+#: view:hr.allounce.deduction.categoty:0
+msgid "Dynamic Computation"
+msgstr "Dynamický výpočet"
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid "Basic Salary without Leave:"
+msgstr "Základní mzda bez uvolnění:"
+
+#. module: hr_payroll
+#: view:company.contribution:0
+#: view:hr.allounce.deduction.categoty:0
+#: view:hr.payroll.structure:0
+#: view:hr.payslip:0
+#: view:hr.payslip.line:0
+#: field:hr.payslip.line,function_id:0
+msgid "Function"
+msgstr "Funkce"
+
+#. module: hr_payroll
+#: view:hr.payslip:0
+msgid "States"
+msgstr "Stavy"
+
+#. module: hr_payroll
+#: report:payroll.advice:0
+msgid "Dear Sir/Madam,"
+msgstr "Vážený pane/paní,"
+
+#. module: hr_payroll
+#: model:ir.model,name:hr_payroll.model_hr_allounce_deduction_categoty
+msgid "Allowance Deduction Heads"
+msgstr "Hlavičky přídavků a odpočtů"
+
+#. module: hr_payroll
+#: report:hr.payroll.register.sheet:0
+msgid "Gross Sal."
+msgstr "Hrubá mzda"
+
+#. module: hr_payroll
+#: view:company.contribution:0
+#: field:company.contribution,note:0
+#: view:hr.allounce.deduction.categoty:0
+#: field:hr.allounce.deduction.categoty,note:0
+#: view:hr.contibution.register:0
+#: field:hr.contibution.register,note:0
+#: view:hr.passport:0
+#: field:hr.passport,note:0
+#: field:hr.payroll.advice,note:0
+#: field:hr.payroll.register,note:0
+#: view:hr.payroll.structure:0
+#: field:hr.payroll.structure,note:0
+#: view:hr.payslip:0
+#: field:hr.payslip,note:0
+#: view:hr.payslip.line:0
+#: field:hr.payslip.line,note:0
+msgid "Description"
+msgstr "Popis"
+
+#. module: hr_payroll
+#: field:hr.payroll.employees.detail,date_from:0
+#: field:hr.payroll.year.salary,date_from:0
+#: report:salary.structure:0
+msgid "Start Date"
+msgstr "Počáteční datum"
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid "Deduction -"
+msgstr "Odpočty -"
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid ")"
+msgstr ")"
+
+#. module: hr_payroll
+#: view:hr.contibution.register:0
+msgid "Contribution Registers"
+msgstr "Registr příspěvků"
+
+#. module: hr_payroll
+#: model:ir.ui.menu,name:hr_payroll.menu_hr_payroll_reporting
+#: model:ir.ui.menu,name:hr_payroll.menu_hr_root_payroll
+#: model:ir.ui.menu,name:hr_payroll.payroll_configure
+msgid "Payroll"
+msgstr "Mzdy"
+
+#. module: hr_payroll
+#: model:ir.model,name:hr_payroll.model_hr_contract_wage_type
+msgid "Wage Type"
+msgstr "Typ mzdy"
+
+#. module: hr_payroll
+#: report:hr.payroll.register.sheet:0
+msgid "Net Sal."
+msgstr "Čistá mzda"
+
+#. module: hr_payroll
+#: sql_constraint:hr.passport:0
+msgid "The Passport No must be unique !"
+msgstr "Číslo pasu musí být jedinečné !"
+
+#. module: hr_payroll
+#: field:hr.allounce.deduction.categoty,name:0
+msgid "Category Name"
+msgstr "Název kategorie"
+
+#. module: hr_payroll
+#: model:ir.model,name:hr_payroll.model_hr_payroll_year_salary
+msgid "hr.payroll.year.salary"
+msgstr "hr.payroll.year.salary"
+
+#. module: hr_payroll
+#: report:employees.salary:0
+#: field:hr.passport,address_id:0
+#: report:payslip.pdf:0
+#: report:salary.structure:0
+msgid "Address"
+msgstr "Adresa"
+
+#. module: hr_payroll
+#: field:hr.payslip.line.line,slipline_id:0
+msgid "Slip Line"
+msgstr "Řádek listu"
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid "Number of Leaves"
+msgstr "Počet uvolnění"
+
+#. module: hr_payroll
+#: report:employees.salary:0
+#: field:hr.payroll.advice,bank_id:0
+#: field:hr.payroll.register,bank_id:0
+#: report:salary.structure:0
+msgid "Bank"
+msgstr "Banka"
+
+#. module: hr_payroll
+#: view:hr.payroll.advice:0
+msgid "Cancel Sheet"
+msgstr "Zrušit list"
+
+#. module: hr_payroll
+#: selection:hr.allounce.deduction.categoty,type:0
+#: selection:hr.payslip.line,type:0
+msgid "Advance"
+msgstr "Záloha"
+
+#. module: hr_payroll
+#: report:salary.structure:0
+msgid "Special Allowances and Deductions For Employee:"
+msgstr "Speciální přídavky a odpočty pro zaměstnance:"
+
+#. module: hr_payroll
+#: field:company.contribution,name:0
+#: field:company.contribution.line,name:0
+#: field:hr.contibution.register,name:0
+#: field:hr.contibution.register.line,name:0
+#: field:hr.payroll.advice,name:0
+#: field:hr.payroll.register,name:0
+#: field:hr.payroll.structure,name:0
+#: field:hr.payslip,name:0
+#: field:hr.payslip.line,name:0
+#: field:hr.payslip.line.line,name:0
+#: report:payslip.pdf:0
+#: report:salary.structure:0
+#: report:year.salary:0
+msgid "Name"
+msgstr "Jméno"
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid "Leaved Deduction"
+msgstr "Odpočty uvolnění"
+
+#. module: hr_payroll
+#: view:hr.passport:0
+msgid "Country"
+msgstr "Země"
+
+#. module: hr_payroll
+#: view:hr.passport:0
+#: view:hr.payroll.employees.detail:0
+#: field:hr.payroll.employees.detail,employee_ids:0
+#: view:hr.payroll.year.salary:0
+#: field:hr.payroll.year.salary,employee_ids:0
+#: view:hr.payslip:0
+msgid "Employees"
+msgstr "Zaměstnanci"
+
+#. module: hr_payroll
+#: report:payroll.advice:0
+msgid "Bank Account"
+msgstr "Bankovní účet"
+
+#. module: hr_payroll
+#: help:company.contribution,register_id:0
+msgid "Contribution register based on company"
+msgstr "Registr příspěvků založený na spoleřnosti"
+
+#. module: hr_payroll
+#: help:hr.allounce.deduction.categoty,sequence:0
+msgid "Use to arrange calculation sequence"
+msgstr "Použijte pro uspořádání pořadí výpočtů"
+
+#. module: hr_payroll
+#: field:hr.payslip,total_pay:0
+msgid "Total Payment"
+msgstr "Celková platba"
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid "Leave Deductions Line:"
+msgstr "Řádek odpočtu uvolnění:"
+
+#. module: hr_payroll
+#: selection:hr.payroll.register,state:0
+#: selection:hr.payslip,state:0
+msgid "Wating for Account Verification"
+msgstr "Čekající na ověření účtu"
+
+#. module: hr_payroll
+#: field:hr.contibution.register.line,comp_deduction:0
+msgid "Company Deduction"
+msgstr "Odpočty společnosti"
+
+#. module: hr_payroll
+#: view:hr.holidays.status:0
+msgid "Payroll Configurtion"
+msgstr "Nastavení mezd"
+
+#. module: hr_payroll
+#: code:addons/hr_payroll/hr_payroll.py:469
+#, python-format
+msgid "Please define bank account for the %s employee"
+msgstr "Prosíme zkontrolujte bankovní účet zaměstnance %s"
+
+#. module: hr_payroll
+#: field:hr.passport,date_issue:0
+msgid "Passport Issue Date"
+msgstr "Datum vydání pasu"
+
+#. module: hr_payroll
+#: view:hr.allounce.deduction.categoty:0
+#: selection:hr.allounce.deduction.categoty,type:0
+#: field:hr.payroll.register,allounce:0
+#: field:hr.payslip,allounce:0
+#: selection:hr.payslip.line,type:0
+msgid "Allowance"
+msgstr "Přídavky"
+
+#. module: hr_payroll
+#: field:hr.payslip,holiday_days:0
+msgid "No of Leaves"
+msgstr "Poč. uvolnění"
+
+#. module: hr_payroll
+#: field:hr.employee,otherid:0
+msgid "Other Id"
+msgstr "Jiné Id"
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid "Bank Details"
+msgstr "Bankovní podrobnosti"
+
+#. module: hr_payroll
+#: report:payslip.pdf:0
+msgid "Slip ID"
+msgstr "ID výplatní pásky"
+
+#. module: hr_payroll
+#: field:company.contribution.line,sequence:0
+#: field:hr.allounce.deduction.categoty,sequence:0
+#: field:hr.payslip.line,sequence:0
+#: field:hr.payslip.line.line,sequence:0
+msgid "Sequence"
+msgstr "Posloupnost"
+
+#. module: hr_payroll
+#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_payslip_form
+#: model:ir.ui.menu,name:hr_payroll.menu_department_tree
+msgid "Employee Payslip"
+msgstr "Výplatní list zaměstnance"
+
+#. module: hr_payroll
+#: view:hr.payroll.advice:0
+msgid "Letter Content"
+msgstr "Obsah dopisu"
+
+#. module: hr_payroll
+#: view:hr.payroll.employees.detail:0
+#: view:hr.payroll.year.salary:0
+msgid "Year Salary"
+msgstr "Roční plat"
+
+#. module: hr_payroll
+#: view:hr.payroll.register:0
+msgid "Allowance / Deduction"
+msgstr "Přídavky / odpočty"
+
+#. module: hr_payroll
+#: model:ir.actions.report.xml,name:hr_payroll.payroll_advice
+msgid "Bank Payment Advice"
+msgstr "Avízo bankovní platby"
+
+#. module: hr_payroll
+#: view:hr.payslip:0
+msgid "Search Payslips"
+msgstr "Hledat výplatní pásky"
+
+#. module: hr_payroll
+#: report:employees.salary:0
+#: field:hr.contibution.register.line,total:0
+#: report:year.salary:0
+msgid "Total"
+msgstr "Celkem"
+
+#. module: hr_payroll
+#: view:company.contribution:0
+#: view:hr.allounce.deduction.categoty:0
+#: field:hr.allounce.deduction.categoty,contribute_ids:0
+msgid "Contributions"
+msgstr "Příspěvky"
diff --git a/addons/hr_payroll/report/report_payslip.py b/addons/hr_payroll/report/report_payslip.py
index 0fc37b44ac7..e2ef7dab974 100644
--- a/addons/hr_payroll/report/report_payslip.py
+++ b/addons/hr_payroll/report/report_payslip.py
@@ -44,6 +44,6 @@ class payslip_report(report_sxw.rml_parse):
res = payslip_line.browse(self.cr, self.uid, ids)
return res
-report_sxw.report_sxw('report.test.pdf', 'hr.payslip', 'hr_payroll/report/report_payslip.rml', parser=payslip_report)
+report_sxw.report_sxw('report.payslip', 'hr.payslip', 'hr_payroll/report/report_payslip.rml', parser=payslip_report)
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
diff --git a/addons/hr_payroll/security/ir.model.access.csv b/addons/hr_payroll/security/ir.model.access.csv
index 4d2afff54c3..24ca631c4d8 100644
--- a/addons/hr_payroll/security/ir.model.access.csv
+++ b/addons/hr_payroll/security/ir.model.access.csv
@@ -1,16 +1,11 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_hr_payroll_structure","hr.payroll.structure","model_hr_payroll_structure","base.group_hr_user",1,1,1,1
-"access_hr_contribution_register","hr.contribution.register","model_hr_contribution_register","base.group_hr_user",1,1,1,1
-"access_hr_salary_rule_category","hr.salary.rule.category","model_hr_salary_rule_category","base.group_hr_user",1,1,1,1
-"access_hr_payslip","hr.payslip","model_hr_payslip","base.group_hr_user",1,1,1,1
-"access_hr_payslip_line","hr.payslip.line","model_hr_payslip_line","base.group_hr_user",1,1,1,1
-"access_hr_payslip_input_user","hr.payslip.input.user","model_hr_payslip_input","base.group_hr_user",1,1,1,1
-"access_hr_payslip_manager","hr.payslip.manager","model_hr_payslip","base.group_hr_manager",1,1,1,1
-"access_hr_payslip_line_manager","hr.payslip.line.manager","model_hr_payslip_line","base.group_hr_manager",1,1,1,1
-"access_hr_payroll_structure_manager","hr.payroll.structure.manager","model_hr_payroll_structure","base.group_hr_manager",1,1,1,1
-"access_hr_payslip_worked_days ","hr.payslip.worked_days","model_hr_payslip_worked_days","base.group_hr_manager",1,1,1,1
-"access_hr_salary_rule","hr.salary.rule","model_hr_salary_rule","base.group_hr_manager",1,1,1,1
-"access_hr_payslip_run","hr.payslip.run","model_hr_payslip_run","base.group_hr_manager",1,1,1,1
-"access_hr_payslip_input","hr.payslip.input","model_hr_payslip_input","base.group_hr_manager",1,1,1,1
-"access_hr_rule_input","hr.rule.input","model_hr_rule_input","base.group_hr_manager",1,1,1,1
-"access_hr_salary_rule_user","hr.salary.rule.user","model_hr_salary_rule","base.group_hr_user",1,1,1,1
\ No newline at end of file
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_hr_payroll_structure,hr.payroll.structure,model_hr_payroll_structure,base.group_hr_user,1,1,1,1
+access_hr_contribution_register,hr.contribution.register,model_hr_contribution_register,base.group_hr_user,1,1,1,1
+access_hr_salary_rule_category,hr.salary.rule.category,model_hr_salary_rule_category,base.group_hr_user,1,1,1,1
+access_hr_payslip,hr.payslip,model_hr_payslip,base.group_hr_user,1,1,1,1
+access_hr_payslip_line,hr.payslip.line,model_hr_payslip_line,base.group_hr_user,1,1,1,1
+access_hr_payslip_input_user,hr.payslip.input.user,model_hr_payslip_input,base.group_hr_user,1,1,1,1
+access_hr_payslip_worked_days ,hr.payslip.worked_days,model_hr_payslip_worked_days,base.group_hr_manager,1,1,1,1
+access_hr_payslip_run,hr.payslip.run,model_hr_payslip_run,base.group_hr_manager,1,1,1,1
+access_hr_rule_input,hr.rule.input,model_hr_rule_input,base.group_hr_manager,1,1,1,1
+access_hr_salary_rule_user,hr.salary.rule.user,model_hr_salary_rule,base.group_hr_user,1,1,1,1
diff --git a/addons/hr_payroll/test/payslip.yml b/addons/hr_payroll/test/payslip.yml
index 09af98ee0cd..94c38b263fc 100644
--- a/addons/hr_payroll/test/payslip.yml
+++ b/addons/hr_payroll/test/payslip.yml
@@ -40,25 +40,6 @@
-
!record {model: hr.payslip, id: hr_payslip_0}:
employee_id: hr_payroll.hr_employee_richard0
--
- The selection of an employee fills the contract, structure, worked days and input data fields
--
- !python {model: hr.payslip}: |
- import time
- from datetime import datetime
- from dateutil import relativedelta
- date_from = time.strftime('%Y-%m-01')
- worked_days_obj = self.pool.get('hr.payslip.worked_days')
- date_to = str(datetime.now() + relativedelta.relativedelta(months=+1, day=1, days=-1))[:10]
- res = self.onchange_employee_id(cr, uid, [], date_from, date_to, ref("hr_employee_richard0"), False, None)
- vals = {
- 'struct_id': res['value']['struct_id'],
- 'contract_id': res['value']['contract_id'],
- 'name': res['value']['name'],
- }
- vals['worked_days_line_ids'] = [(0,0,i) for i in res['value']['worked_days_line_ids']]
- vals['input_line_ids'] = [(0, 0, i) for i in res['value']['input_line_ids']]
- self.write(cr, uid, ref("hr_payslip_0"), vals)
-
I assign the amount to Input data
-
@@ -69,9 +50,8 @@
I verify the payslip is in draft state
-
!python {model: hr.payslip}: |
- from tools.translate import _
payslip_brw=self.browse(cr, uid, ref("hr_payslip_0"))
- assert(payslip_brw.state == 'draft'), _('State not changed!')
+ assert (payslip_brw.state == 'draft'), 'State not changed!'
-
I click on 'Compute Sheet' button on payslip
-
diff --git a/addons/hr_payroll/wizard/hr_payroll_contribution_register_report.xml b/addons/hr_payroll/wizard/hr_payroll_contribution_register_report.xml
index cb787cf536e..e48a8f6470c 100644
--- a/addons/hr_payroll/wizard/hr_payroll_contribution_register_report.xml
+++ b/addons/hr_payroll/wizard/hr_payroll_contribution_register_report.xml
@@ -33,7 +33,6 @@
-
PaySlip Lines
client_print_multi
@@ -42,4 +41,4 @@
-
\ No newline at end of file
+
diff --git a/addons/hr_payroll_account/hr_payroll_account.py b/addons/hr_payroll_account/hr_payroll_account.py
index 684289c9737..a022cac05b1 100644
--- a/addons/hr_payroll_account/hr_payroll_account.py
+++ b/addons/hr_payroll_account/hr_payroll_account.py
@@ -39,7 +39,24 @@ class hr_payslip(osv.osv):
'journal_id': fields.many2one('account.journal', 'Expense Journal',states={'draft': [('readonly', False)]}, readonly=True, required=True),
'move_id': fields.many2one('account.move', 'Accounting Entry', readonly=True),
}
-
+
+ def _get_default_journal(self, cr, uid, context=None):
+ model_data = self.pool.get('ir.model.data')
+ res = model_data.search(cr, uid, [('name', '=', 'expenses_journal')])
+ if res:
+ return model_data.browse(cr, uid, res[0]).res_id
+ return False
+
+ _defaults = {
+ 'journal_id': _get_default_journal,
+ }
+
+ def copy(self, cr, uid, id, default=None, context=None):
+ if default is None:
+ default = {}
+ default['move_id'] = False
+ return super(hr_payslip, self).copy(cr, uid, id, default, context=context)
+
def create(self, cr, uid, vals, context=None):
if context is None:
context = {}
@@ -95,9 +112,9 @@ class hr_payslip(osv.osv):
partner_id = False
debit_account_id = line.salary_rule_id.account_debit.id
credit_account_id = line.salary_rule_id.account_credit.id
-
+
if debit_account_id:
-
+
debit_line = (0, 0, {
'name': line.name,
'date': timenow,
@@ -113,9 +130,9 @@ class hr_payslip(osv.osv):
})
line_ids.append(debit_line)
debit_sum += debit_line[2]['debit'] - debit_line[2]['credit']
-
+
if credit_account_id:
-
+
credit_line = (0, 0, {
'name': line.name,
'date': timenow,
@@ -147,7 +164,7 @@ class hr_payslip(osv.osv):
'credit': debit_sum - credit_sum,
})
line_ids.append(adjust_credit)
-
+
elif debit_sum < credit_sum:
acc_id = slip.journal_id.default_debit_account_id.id
if not acc_id:
@@ -165,7 +182,7 @@ class hr_payslip(osv.osv):
line_ids.append(adjust_debit)
move.update({'line_id': line_ids})
move_id = move_pool.create(cr, uid, move, context=context)
- self.write(cr, uid, [slip.id], {'move_id': move_id}, context=context)
+ self.write(cr, uid, [slip.id], {'move_id': move_id, 'period_id' : period_id}, context=context)
if slip.journal_id.entry_posted:
move_pool.post(cr, uid, [move_id], context=context)
return super(hr_payslip, self).process_sheet(cr, uid, [slip.id], context=context)
diff --git a/addons/hr_recruitment/__openerp__.py b/addons/hr_recruitment/__openerp__.py
index b728609c53d..0ce5ff66c0f 100644
--- a/addons/hr_recruitment/__openerp__.py
+++ b/addons/hr_recruitment/__openerp__.py
@@ -37,7 +37,7 @@ system to store and search in your CV base.
'author': 'OpenERP SA',
'website': 'http://www.openerp.com',
'images': ['images/hr_recruitment_analysis.jpeg','images/hr_recruitment_applicants.jpeg'],
- 'depends': ['decimal_precision', 'hr', 'survey', 'crm'],
+ 'depends': ['decimal_precision', 'hr', 'survey', 'crm', 'fetchmail'],
'update_xml': [
'wizard/hr_recruitment_phonecall_view.xml',
'wizard/hr_recruitment_employee_hired.xml',
@@ -54,12 +54,15 @@ system to store and search in your CV base.
'hr_recruitment_data.xml'
],
'demo_xml': [
- 'hr_recruitment_demo.xml',
+ 'hr_recruitment_demo.yml',
],
- 'test':['test/test_hr_recruitment.yml'],
+ 'test':[
+ 'test/recruitment_process.yml',
+ ],
'installable': True,
'active': False,
'certificate' : '001073437025460275621',
+ 'application': True,
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_recruitment/board_hr_recruitment_statistical_view.xml b/addons/hr_recruitment/board_hr_recruitment_statistical_view.xml
index 822a7da3249..8af4b0f8553 100644
--- a/addons/hr_recruitment/board_hr_recruitment_statistical_view.xml
+++ b/addons/hr_recruitment/board_hr_recruitment_statistical_view.xml
@@ -33,8 +33,8 @@
form
-
-
+
+
diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py
index 931600fef9f..2854ddf95a5 100644
--- a/addons/hr_recruitment/hr_recruitment.py
+++ b/addons/hr_recruitment/hr_recruitment.py
@@ -181,6 +181,7 @@ class hr_applicant(crm.crm_case, osv.osv):
'day_close': fields.function(_compute_day, string='Days to Close', \
multi='day_close', type="float", store=True),
'color': fields.integer('Color Index'),
+ 'user_email': fields.related('user_id', 'user_email', type='char', string='User Email', readonly=True),
}
def _get_stage(self, cr, uid, context=None):
@@ -197,11 +198,19 @@ class hr_applicant(crm.crm_case, osv.osv):
'color': 0,
}
- def _read_group_stage_ids(self, cr, uid, ids, domain, context=None):
- context = context or {}
+ def _read_group_stage_ids(self, cr, uid, ids, domain, read_group_order=None, access_rights_uid=None, context=None):
+ access_rights_uid = access_rights_uid or uid
stage_obj = self.pool.get('hr.recruitment.stage')
- stage_ids = stage_obj.search(cr, uid, ['|',('id','in',ids), ('department_id','=',False)], context=context)
- return stage_obj.name_get(cr, uid, stage_ids, context=context)
+ order = stage_obj._order
+ if read_group_order == 'stage_id desc':
+ # lame hack to allow reverting search, should just work in the trivial case
+ order = "%s desc" % order
+ stage_ids = stage_obj._search(cr, uid, ['|',('id','in',ids),('department_id','=',False)], order=order,
+ access_rights_uid=access_rights_uid, context=context)
+ result = stage_obj.name_get(cr, access_rights_uid, stage_ids, context=context)
+ # restore order of the search
+ result.sort(lambda x,y: cmp(stage_ids.index(x[0]), stage_ids.index(y[0])))
+ return result
_group_by_full = {
'stage_id': _read_group_stage_ids
@@ -356,10 +365,11 @@ class hr_applicant(crm.crm_case, osv.osv):
self.write(cr, uid, [res_id], vals, context)
return res_id
- def message_update(self, cr, uid, ids, msg, vals={}, default_act='pending', context=None):
+ def message_update(self, cr, uid, ids, msg, vals=None, default_act='pending', context=None):
if isinstance(ids, (str, int, long)):
ids = [ids]
-
+ if vals is None:
+ vals = {}
msg_from = msg['from']
vals.update({
'description': msg['body_text']
@@ -403,14 +413,6 @@ class hr_applicant(crm.crm_case, osv.osv):
return res
def case_close(self, cr, uid, ids, *args):
- """
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of case's Ids
- @param *args: Give Tuple Value
- """
- employee_obj = self.pool.get('hr.employee')
res = super(hr_applicant, self).case_close(cr, uid, ids, *args)
for (id, name) in self.name_get(cr, uid, ids):
message = _("Applicant '%s' is being hired.") % name
@@ -418,29 +420,32 @@ class hr_applicant(crm.crm_case, osv.osv):
return res
def case_close_with_emp(self, cr, uid, ids, *args):
- """
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param ids: List of case's Ids
- @param *args: Give Tuple Value
- """
- employee_obj = self.pool.get('hr.employee')
- partner_obj = self.pool.get('res.partner')
- address_id = False
- applicant = self.browse(cr, uid, ids)[0]
- if applicant.partner_id:
- address_id = partner_obj.address_get(cr, uid, [applicant.partner_id.id], ['contact'])['contact']
- if applicant.job_id:
- self.pool.get('hr.job').write(cr, uid, [applicant.job_id.id], {'no_of_recruitment': applicant.job_id.no_of_recruitment - 1})
- emp_id = employee_obj.create(cr,uid,{'name': applicant.partner_name or applicant.name,
- 'job_id': applicant.job_id.id,
- 'address_home_id': address_id,
- 'department_id': applicant.department_id.id
- })
- else:
- raise osv.except_osv(_('Warning!'),_('You must define Applied Job for Applicant !'))
- return self.case_close(cr, uid, ids, *args)
+ hr_employee = self.pool.get('hr.employee')
+ model_data = self.pool.get('ir.model.data')
+ act_window = self.pool.get('ir.actions.act_window')
+ emp_id = False
+ for applicant in self.browse(cr, uid, ids):
+ address_id = False
+ if applicant.partner_id:
+ address_id = applicant.partner_id.address_get(['contact'])['contact']
+ if applicant.job_id:
+ applicant.job_id.write({'no_of_recruitment': applicant.job_id.no_of_recruitment - 1})
+ emp_id = hr_employee.create(cr,uid,{'name': applicant.partner_name or applicant.name,
+ 'job_id': applicant.job_id.id,
+ 'address_home_id': address_id,
+ 'department_id': applicant.department_id.id
+ })
+ self.case_close(cr, uid, [applicant.id], *args)
+ else:
+ raise osv.except_osv(_('Warning!'),_('You must define Applied Job for Applicant !'))
+
+
+ action_model, action_id = model_data.get_object_reference(cr, uid, 'hr', 'open_view_employee_list')
+ dict_act_window = act_window.read(cr, uid, action_id, [])
+ if emp_id:
+ dict_act_window['res_id'] = emp_id
+ dict_act_window['view_mode'] = 'form,tree'
+ return dict_act_window
def case_reset(self, cr, uid, ids, *args):
"""Resets case as draft
@@ -454,19 +459,19 @@ class hr_applicant(crm.crm_case, osv.osv):
res = super(hr_applicant, self).case_reset(cr, uid, ids, *args)
self.write(cr, uid, ids, {'date_open': False, 'date_closed': False})
return res
-
- def set_priority(self, cr, uid, ids, priority):
- """Set lead priority
+
+ def set_priority(self, cr, uid, ids, priority, *args):
+ """Set applicant priority
"""
return self.write(cr, uid, ids, {'priority' : priority})
def set_high_priority(self, cr, uid, ids, *args):
- """Set lead priority to high
+ """Set applicant priority to high
"""
return self.set_priority(cr, uid, ids, '1')
def set_normal_priority(self, cr, uid, ids, *args):
- """Set lead priority to normal
+ """Set applicant priority to normal
"""
return self.set_priority(cr, uid, ids, '3')
diff --git a/addons/hr_recruitment/hr_recruitment_data.xml b/addons/hr_recruitment/hr_recruitment_data.xml
index e1172f0b075..d6cb5952d38 100644
--- a/addons/hr_recruitment/hr_recruitment_data.xml
+++ b/addons/hr_recruitment/hr_recruitment_data.xml
@@ -19,19 +19,6 @@
-
-
-
-
- Salesman
-
-
-
-
- Junior Developer
-
-
-
diff --git a/addons/hr_recruitment/hr_recruitment_demo.xml b/addons/hr_recruitment/hr_recruitment_demo.xml
deleted file mode 100644
index 0fc2c94f034..00000000000
--- a/addons/hr_recruitment/hr_recruitment_demo.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/addons/hr_recruitment/hr_recruitment_demo.yml b/addons/hr_recruitment/hr_recruitment_demo.yml
new file mode 100644
index 00000000000..bcf2248fc40
--- /dev/null
+++ b/addons/hr_recruitment/hr_recruitment_demo.yml
@@ -0,0 +1,109 @@
+-
+ !record {model: hr.applicant, id: hr_case_salesman0}:
+ date: !eval time.strftime('%Y-%m-01 10:35:50')
+ type_id: degree_graduate
+ priority: '2'
+ partner_name: 'Enrique Jones'
+ partner_mobile: '9963214587'
+ job_id: hr.job_jr_appli
+ stage_id: stage_job1
+ name: 'Salesman'
+ partner_phone: '1236547890'
+
+-
+ !record {model: hr.applicant, id: hr_case_traineemca0}:
+ partner_address_id: base.res_partner_address_14
+ date: !eval time.strftime('%Y-%m-10 18:15:00')
+ type_id: degree_bac5
+ priority: '3'
+ user_id: base.user_demo
+ partner_name: 'Marie Justine'
+ state: 'open'
+ partner_mobile: '9988774455'
+ job_id: hr.job_jr_appli
+ stage_id: stage_job4
+ name: 'Trainee - MCA'
+ partner_phone: '6633225'
+-
+ !record {model: hr.applicant, id: hr_case_fresher0}:
+ date: !eval time.strftime('%Y-%m-15 16:10:00')
+ type_id: degree_licenced
+ priority: '1'
+ user_id: base.user_root
+ partner_name: 'Jose'
+ job_id: hr.job_jr_appli
+ stage_id: stage_job3
+ name: 'Fresher'
+ partner_phone: '999666735'
+-
+ !record {model: hr.applicant, id: hr_case_yrsexperienceinphp0}:
+ date: !eval time.strftime('%Y-%m-25 16:25:52')
+ job_id: hr.job_jr_appli
+ type_id: degree_bac5
+ user_id: base.user_root
+ partner_name: 'Sandra Elvis'
+ state: 'cancel'
+ stage_id: stage_job6
+ name: 'More than 5 yrs Experience in PHP'
+-
+ !record {model: hr.applicant, id: hr_case_marketingjob0}:
+ date: !eval time.strftime('%Y-%m-26 17:15:32')
+ type_id: degree_licenced
+ user_id: base.user_demo
+ partner_name: 'John Bruno'
+ state: 'done'
+ job_id: hr.job_jr_appli
+ stage_id: stage_job5
+ name: 'Marketing Job'
+-
+ !record {model: hr.applicant, id: hr_case_financejob0}:
+ date: !eval time.strftime('%Y-%m-26 17:39:42')
+ type_id: degree_licenced
+ priority: '4'
+ partner_name: 'David Armstrong'
+ state: 'pending'
+ state: open
+ partner_mobile: '9966332214'
+ job_id: hr.job_jr_appli
+ stage_id: stage_job2
+ name: 'Finance Job'
+ partner_phone: '33968745'
+-
+ !record {model: hr.applicant, id: hr_case_traineemca1}:
+ partner_address_id: base.res_partner_address_14
+ date: !eval time.strftime('%Y-%m-12 17:49:19')
+ type_id: degree_bac5
+ partner_name: 'Tina Augustie'
+ state: 'open'
+ partner_mobile: '9898745745'
+ job_id: hr.job_jr_appli
+ stage_id: stage_job4
+ name: 'Trainee - MCA'
+ partner_phone: '6630125'
+
+-
+ !record {model: hr.applicant, id: hr_case_programmer}:
+ partner_address_id: base.res_partner_address_14
+ date: !eval time.strftime('%Y-%m-12 17:49:19')
+ type_id: degree_bac5
+ partner_name: 'Shane Williams'
+ state: 'open'
+ partner_mobile: '9812398524'
+ stage_id: stage_job4
+ name: 'Programmer'
+ partner_phone: '6630125'
+ job_id: hr.job_jr_appli
+ department_id: hr.dep_it
+ salary_expected: 11000.0
+
+-
+ !record {model: hr.applicant, id: hr_case_advertisement}:
+ date: !eval time.strftime('%Y-%m-26 17:39:42')
+ type_id: degree_licenced
+ partner_id: base.res_partner_11
+ partner_name: 'David Armstrong'
+ job_id: hr.job_jr_appli
+ stage_id: stage_job2
+ name: 'Advertisement'
+ salary_expected: 11000.0
+
diff --git a/addons/hr_recruitment/hr_recruitment_menu.xml b/addons/hr_recruitment/hr_recruitment_menu.xml
index 7fe746f580b..04d73dcd2a8 100644
--- a/addons/hr_recruitment/hr_recruitment_menu.xml
+++ b/addons/hr_recruitment/hr_recruitment_menu.xml
@@ -6,13 +6,20 @@
Applicants
hr.applicant
- tree,form,graph,calendar,kanban
-
+ kanban,tree,form,graph,calendar
+
{'search_default_filter_inprogress':1,'search_default_filter_new':1,"search_default_department_id": department_id}
From this menu you can track applicants in the recruitment process and manage all operations: meetings, interviews, phone calls, etc. If you setup the email gateway, applicants and their attached CV are created automatically when an email is sent to jobs@yourcompany.com. If you install the document management modules, all documents (CV and motivation letters) are indexed automatically, so that you can easily search through their content.
+
+
+ kanban
+
+
+
+
tree
diff --git a/addons/hr_recruitment/hr_recruitment_view.xml b/addons/hr_recruitment/hr_recruitment_view.xml
index 4ccfcbe48a2..4bd68949bd5 100644
--- a/addons/hr_recruitment/hr_recruitment_view.xml
+++ b/addons/hr_recruitment/hr_recruitment_view.xml
@@ -17,7 +17,7 @@
form
[('object_id.model', '=', 'hr.applicant')]
- {'object_id':'hr.applicant'}
+
# ------------------------------------------------------
# Stage
@@ -145,7 +145,7 @@
-
+
@@ -155,32 +155,6 @@
context="{'mail.compose.message.mode':'reply', 'message_id':active_id}"
icon="terp-mail-replied" type="action" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
Hr Applicants kanban
hr.applicant
kanban
@@ -290,47 +264,70 @@
+
+
+
+
+ Phone:
+
+
+ Mobile:
+
+
-
-
+
oe_kanban_color_red
+
-
-
-
-
+
+
+
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
- (Not Good)
- (On Average)
- (Good)
- (Very Good)
- (Excellent)
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+ :
+
diff --git a/addons/hr_recruitment/report/hr_recruitment_report_view.xml b/addons/hr_recruitment/report/hr_recruitment_report_view.xml
index 5353a8497ed..07f160b8ee2 100644
--- a/addons/hr_recruitment/report/hr_recruitment_report_view.xml
+++ b/addons/hr_recruitment/report/hr_recruitment_report_view.xml
@@ -50,9 +50,10 @@
-
+
hr.recruitment.report
form
tree,graph
-
{'search_default_month':1,'search_default_department':1,'group_by_no_leaf':1,'group_by':[]}
+
{'search_default_year':1,'search_default_month':1,'search_default_department':1,'group_by_no_leaf':1,'group_by':[]}
diff --git a/addons/hr_recruitment/security/ir.model.access.csv b/addons/hr_recruitment/security/ir.model.access.csv
index 96baaf9e278..6449cc60fda 100644
--- a/addons/hr_recruitment/security/ir.model.access.csv
+++ b/addons/hr_recruitment/security/ir.model.access.csv
@@ -1,13 +1,13 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_hr_applicant_user","hr.applicant.user","model_hr_applicant","base.group_hr_user",1,1,1,1
-"access_hr_recruitment_report","hr.recruitment.report","model_hr_recruitment_report","base.group_hr_manager",1,1,1,1
-"access_hr_recruitment_stage_user","hr.recruitment.stage.user","model_hr_recruitment_stage","base.group_hr_user",1,1,1,1
-"access_hr_recruitment_degree","hr.recruitment.degree","model_hr_recruitment_degree","base.group_hr_user",1,1,1,1
-"access_mail_message_user","mail.message.user","mail.model_mail_message","base.group_hr_user",1,1,1,1
-"access_res_partner_hr_user","res.partner.user","base.model_res_partner","base.group_hr_user",1,1,1,1
-"access_res_partner_address_hr_user","res.partner.address.user","base.model_res_partner_address","base.group_hr_user",1,1,1,1
-"access_survey_hr_user","survey.hr.user","survey.model_survey","base.group_hr_user",1,1,1,0
-"access_crm_phonecall_hruser","crm.phonecall hruser","crm.model_crm_phonecall","base.group_hr_user",1,1,1,1
-"access_crm_meeting_hruser","crm.meeting.hruser","crm.model_crm_meeting","base.group_hr_user",1,1,1,1
-"access_hr_recruitment_source_hr_officer","hr.recruitment.source","model_hr_recruitment_source","base.group_hr_user",1,1,1,1
-"access_hr_recruitment_source_all","hr.recruitment.source","model_hr_recruitment_source",,1,0,0,0
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_hr_applicant_user,hr.applicant.user,model_hr_applicant,base.group_hr_user,1,1,1,1
+access_hr_recruitment_report,hr.recruitment.report,model_hr_recruitment_report,base.group_hr_manager,1,1,1,1
+access_hr_recruitment_stage_user,hr.recruitment.stage.user,model_hr_recruitment_stage,base.group_hr_user,1,1,1,1
+access_hr_recruitment_degree,hr.recruitment.degree,model_hr_recruitment_degree,base.group_hr_user,1,1,1,1
+access_mail_message_user,mail.message.user,mail.model_mail_message,base.group_hr_user,1,1,1,1
+access_res_partner_hr_user,res.partner.user,base.model_res_partner,base.group_hr_user,1,1,1,1
+access_res_partner_address_hr_user,res.partner.address.user,base.model_res_partner_address,base.group_hr_user,1,1,1,1
+access_survey_hr_user,survey.hr.user,survey.model_survey,base.group_hr_user,1,1,1,0
+access_crm_phonecall_hruser,crm.phonecall hruser,crm.model_crm_phonecall,base.group_hr_user,1,1,1,1
+access_crm_meeting_hruser,crm.meeting.hruser,crm.model_crm_meeting,base.group_hr_user,1,1,1,1
+access_hr_recruitment_source_hr_officer,hr.recruitment.source,model_hr_recruitment_source,base.group_hr_user,1,1,1,1
+access_hr_recruitment_source_all,hr.recruitment.source,model_hr_recruitment_source,,1,0,0,0
diff --git a/addons/hr_recruitment/test/recruitment_process.yml b/addons/hr_recruitment/test/recruitment_process.yml
new file mode 100644
index 00000000000..43575137a6e
--- /dev/null
+++ b/addons/hr_recruitment/test/recruitment_process.yml
@@ -0,0 +1,67 @@
+-
+ In Order to test process of Recruitment,
+-
+ Applicant interested in job position. so He send resume by email.
+-
+ !python {model: mail.thread}: |
+ import addons
+ request_file = open(addons.get_module_resource('hr_recruitment','test', 'resume.eml'),'rb')
+ request_message = request_file.read()
+ self.message_process(cr, uid, 'hr.applicant', request_message)
+-
+ After getting the mail, I check details of new applicant.
+-
+ !python {model: hr.applicant}: |
+ applicant_ids = self.search(cr, uid, [('email_from','=', 'Mr. Richard Anderson
')])
+ assert applicant_ids, "Applicant is not created after getting the mail"
+ applicant = self.browse(cr, uid, applicant_ids[0], context=context)
+ resume_ids = self.pool.get('ir.attachment').search(cr, uid, [('datas_fname','=','resume.doc'),('res_model','=',self._name),('res_id','=',applicant.id)])
+ assert applicant.name == "Application for the post of Jr.application Programmer.", "Subject does not match"
+ assert applicant.state == "draft"
+ assert len(resume_ids), "Resume does not attached."
+-
+ I assign the Job position to the applicant
+-
+ !python {model: hr.applicant}: |
+ self.write(cr, uid, [ref('hr_case_programmer')], {'job_id':ref('hr.job_jr_appli')})
+-
+ I open applicant for the Recruitment
+-
+
+ !python {model: hr.applicant}: |
+ self.case_open(cr, uid, [ref("hr_case_programmer")])
+-
+ I start communication with applicant, first schedule phonecall.
+-
+ !python {model: hr.recruitment.job2phonecall}: |
+ self.make_phonecall(cr, uid, [ref('hr_case_programmer')])
+-
+ I schedule meeting with applicant for interview.
+-
+ !python {model: hr.applicant}: |
+ self.action_makeMeeting(cr, uid, [ref('hr_case_programmer')])
+-
+ Applicant fillup the answer of the interview quetion.
+-
+ !python {model: survey.question.wiz}: |
+ ctx = context.copy()
+ ctx.update({'active_model': 'hr.applicant', 'active_id': ref("hr_case_programmer"), 'active_ids': [ref("hr_case_programmer")], 'survey_id': ref("survey_job_0")})
+ self.fields_view_get(cr, uid, ref("survey.view_survey_question_message"),"form", context=ctx)
+ vals = self.default_get(cr, uid , [], context=ctx)
+ self.create(cr, uid, vals, context=ctx)
+ self.action_new_page(cr, uid, [ref("survey_job_0")], context=ctx)
+-
+ I print Applicant fill up the interview quetion
+-
+ !python {model: hr.applicant}: |
+ self.action_print_survey(cr, uid, [ref('hr_case_programmer')])
+-
+ On a successful interview with the applicant, I hired employee.
+-
+ !python {model: hr.applicant}: |
+ self.case_close_with_emp(cr, uid, [ref('hr_case_programmer')])
+-
+ I check that applicant is "Hired".
+-
+ !assert {model: hr.applicant, id: hr_case_programmer}:
+ - state == 'done'
diff --git a/addons/hr_recruitment/test/resume.eml b/addons/hr_recruitment/test/resume.eml
new file mode 100644
index 00000000000..00cc5620563
--- /dev/null
+++ b/addons/hr_recruitment/test/resume.eml
@@ -0,0 +1,839 @@
+Return-Path:
+X-Original-To: hr@mycompany.com
+Delivered-To: hr@mycompany.com
+Received: by mail1.mycompany.com (Postfix, from userid 10002)
+ id 7047CBFC94; Fri, 18 Nov 2011 10:28:16 +0100 (CET)
+X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail1.mycompany.com
+X-Spam-Level:
+X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM,
+ HTML_MESSAGE autolearn=ham version=3.3.1
+Received: from nm12-vm2.bullet.mail.ne1.yahoo.com (nm12-vm2.bullet.mail.ne1.yahoo.com [98.138.91.88])
+ by mail1.mycompany.com (Postfix) with SMTP id 0D04ABF53A
+ for ; Fri, 18 Nov 2011 10:27:50 +0100 (CET)
+Received: from [98.138.90.50] by nm12.bullet.mail.ne1.yahoo.com with NNFMP; 18 Nov 2011 09:26:49 -0000
+Received: from [98.138.226.126] by tm3.bullet.mail.ne1.yahoo.com with NNFMP; 18 Nov 2011 09:26:49 -0000
+Received: from [127.0.0.1] by smtp205.mail.ne1.yahoo.com with NNFMP; 18 Nov 2011 09:26:49 -0000
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.in; s=s1024; t=1321608409; bh=GGVn24b6ZH8Ojn91evBkrwuNFmAsLAPy4OeUvOqjgig=; h=X-Yahoo-Newman-Id:X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:Subject:Content-Type; b=DFCOdjskDmdbkzvuxTqFWJOUHsT0nITWiQe5782VeyTrhymhIzNhwzdRq4wfTrzLu03rJhHadZTX0uweNCf0Jpr4OpEQevZa3aVPw44NNmhFeT2tjs9m3kNWyPnz5Nk1Yv8tiTRFSdssPfZAhwz8UXLCBFowa8DRnY2ZFIsATRE=
+X-Yahoo-Newman-Id: 644435.12111.bm@smtp205.mail.ne1.yahoo.com
+X-Yahoo-Newman-Property: ymail-3
+X-YMail-OSG: 09Al2uQVM1n5JcQepgua6wQsww7jiatAHXaSsMjP5Qvk9Ba
+ c65j0.ETzyjVh0vpjphFK3XqPtX0n17z9cUCfUhUDDXLUmUSFoZ.NjoiJ_mQ
+ vwd4S7.I4ObFZm5jgA0ML0cfTRAy_0msUfO3NKsh9LgBdUXztbVOwrTGQhzD
+ nu2v3TskGG9ZtRTiqM_Iad2qmMqveFdqUz5xBnwYYgBuLWRR7EUmU1qyOgss
+ LL33J2t9EOCUn2Kc9XQbSkPBBR7BYlIatTF.AAxLdsuOW6ovTGO.HM5ap0qo
+ LLM1_BE.EOvXdW38ZC_hHcrM4xYaYSR7c0WaOQsR8EZeXk_Vhio7HHUrdxZl
+ 1oZz7YWK9Q04M023JJoM4v6IrThy3BNepluEFFcavkyOnCw--
+X-Yahoo-SMTP: oNtzSBqswBAqJIGYOgyGesyleENrhUEtEgBkQ053
+Received: from [192.168.1.30] (test@180.211.100.2 with plain)
+ by smtp205.mail.ne1.yahoo.com with SMTP; 18 Nov 2011 01:26:47 -0800 PST
+Message-ID: <4EC624C7.6020000@yahoo.in>
+Date: Fri, 18 Nov 2011 14:56:31 +0530
+From: Mr. Richard Anderson
+User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110424 Thunderbird/3.1.10
+MIME-Version: 1.0
+To: hr@mycompany.com
+Subject: Application for the post of Jr.application Programmer.
+Content-Type: multipart/mixed;
+ boundary="------------010903010402010104090709"
+
+This is a multi-part message in MIME format.
+--------------010903010402010104090709
+Content-Type: multipart/alternative;
+ boundary="------------010004020303010906010104"
+
+
+--------------010004020303010906010104
+Content-Type: text/plain; charset=ISO-8859-1; format=flowed
+Content-Transfer-Encoding: 7bit
+
+Hello Sir,
+
+ I am**Richard Anderson completed MCA from Mac Technological
+university, i send my resume for the your company job position, i
+attached my resume here
+
+Thank you
+Richard Anderson
+
+--------------010004020303010906010104
+Content-Type: text/html; charset=ISO-8859-1
+Content-Transfer-Encoding: 7bit
+
+
+
+
+
+
+
+
+ Hello Sir,
+
+ I am Richard Anderson completed MCA from Mac Technological
+ university, i send my resume for the your company job position, i
+ attached my resume here
+
+ Thank you
+ Richard Anderson
+
+
+
+--------------010004020303010906010104--
+
+--------------010903010402010104090709
+Content-Type: application/msword;
+ name="resume.doc"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment;
+ filename="resume.doc"
+
+0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAOwADAP7/CQAGAAAAAAAAAAAAAAABAAAASwAAAAAA
+AAAAEAAAAgAAAAEAAAD+////AAAAAAAAAAD/////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+///////////////////////////////////9//////////7///9KAAAABQAAAAYAAAAHAAAA
+CAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAABIAAAATAAAAFAAAABUA
+AAD+////FwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAAIAAAACEAAAAiAAAA
+IwAAACQAAAAlAAAAJgAAACcAAAAoAAAA/v///yoAAAArAAAALAAAAC0AAAAuAAAALwAAADAA
+AAAxAAAAMgAAADMAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAAA6AAAAOwAAADwAAAA9AAAA
+PgAAAD8AAABAAAAAQQAAAEIAAABDAAAARAAAAEUAAABGAAAARwAAAEgAAABJAAAA/v////7/
+//9MAAAATQAAAP7/////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////1IA
+bwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAWAAUA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAA/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAA/v///wAAAAAAAAAAAQAAAP7////+////BAAAAAUAAAAGAAAABwAAAP7/
+//8JAAAA/v//////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////8BAP7/
+AwoAAP////8GCQIAAAAAAMAAAAAAAABGGAAAAE1pY3Jvc29mdCBXb3JkLURva3VtZW50AAoA
+AABNU1dvcmREb2MAEAAAAFdvcmQuRG9jdW1lbnQuOAD0ObJxAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAEAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/wAAAQACAAAAAAAAAAAAAAAAAAAAAAABAAAA
+4IWf8vlPaBCrkQgAKyez2TAAAADsAAAACgAAAAEAAABYAAAAAgAAAGAAAAAEAAAAeAAAAAcA
+AACUAAAACAAAAKQAAAAJAAAAsAAAAAoAAAC8AAAACwAAAMgAAAAMAAAA1AAAAA0AAADgAAAA
+AgAAAOn9AAAeAAAAEAAAAENhbmRpZGF0ZXMgTmFtZQAeAAAAFAAAAHNhZ2FyIHAgc3VyeWF3
+YW5zaGkAHgAAAAcAAABOb3JtYWwAAB4AAAAEAAAAc2FpAB4AAAAEAAAAMTY5AEAAAAAAyPid
+CgAAAEAAAAAAAAAAAAAAAEAAAAAAnpj/jovLAUAAAAAA1LJ/lhzMAQAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAZwAKAAEAWwAPAAIAAAAAAAAAYAAAEPH/AgBgAAAA
+BgBOAG8AcgBtAGEAbAAAABEAAAADJABhJAAxJAEqJAFBJAAALwBCKgBPSgAAUUoAAENKFABt
+SAkEc0gJBFBKAABuSAQIXkoAAGFKFABfSAEEdEgBBABcAAEQAQACAFwAAAAJAEgAZQBhAGQA
+aQBuAGcAIAAxAAAAJwABAAMkA2EkAw3GBQABOAQAXoQAAF2EoAVghAAAE6RkABSkZAAGJAEA
+DwBPSgIAUUoCAENKEgA1CAEAPgACEAEAAgA+AAAACQBIAGUAYQBkAGkAbgBnACAAMgAAAA0A
+AgATpGQAFKRkAAYkAQAMAE9KAgBRSgIAQ0oSADoAAxABAAIAOgAAAAkASABlAGEAZABpAG4A
+ZwAgADMAAAAFAAMABiQBAA8AT0oCAFFKAgBDShIANQgBAFYABBABAAIAVgAAAAkASABlAGEA
+ZABpAG4AZwAgADQAAAAfAAQAEmRoAQEADcYFAAFoAQBehGgBXYQAAGCEmP4GJAEAEgBPSgIA
+UUoCAENKEgA1CAFcCAEyAAUQAQBiBTIAAAAJAEgAZQBhAGQAaQBuAGcAIAA1AAAACgAFABOk
+ZAAUpGQAAwA1CAEAUAAGEAEAAgBQAAAACQBIAGUAYQBkAGkAbgBnACAANgAAABkABgANxgUA
+ATgEAF6EAABdhKAFYIQAAAYkAQASAE9KAgBRSgIAQ0oSAD4qAVwIAWAABxABAAIAYAAAAAkA
+SABlAGEAZABpAG4AZwAgADcAAAAwAAcAQCYGCiYGC0YBAAomBgtGAQAxJAANxgUAARwBADck
+AF6EHAFdhAAAYITk/gYkAQwAT0oCAFFKAgBDShIASAAIEAEAAgBIAAAACQBIAGUAYQBkAGkA
+bgBnACAAOAAAABcACAAxJAA3JABehBwBXYQAAGCE5P4GJAEADABPSgIAUUoCAENKEgAAAEIA
+QUDy/6EAQgAAABkAQQBiAHMAYQB0AHoALQBTAHQAYQBuAGQAYQByAGQAcwBjAGgAcgBpAGYA
+dABhAHIAdAAAAAAAAAAAAAAAAABCAP4f8v/xAEIAAAAZAEEAYgBzAGEAdAB6AC0AUwB0AGEA
+bgBkAGEAcgBkAHMAYwBoAHIAaQBmAHQAYQByAHQAAAAAAEgA/h/y/wEBSAAAABwAVwBXAC0A
+QQBiAHMAYQB0AHoALQBTAHQAYQBuAGQAYQByAGQAcwBjAGgAcgBpAGYAdABhAHIAdAAAAAAA
+SgD+H/L/EQFKAAAAHQBXAFcALQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMA
+aAByAGkAZgB0AGEAcgB0ADEAAAAAAEwA/h/y/yEBTAAAAB4AVwBXAC0AQQBiAHMAYQB0AHoA
+LQBTAHQAYQBuAGQAYQByAGQAcwBjAGgAcgBpAGYAdABhAHIAdAAxADEAAAAAAE4A/h/y/zEB
+TgAAAB8AVwBXAC0AQQBiAHMAYQB0AHoALQBTAHQAYQBuAGQAYQByAGQAcwBjAGgAcgBpAGYA
+dABhAHIAdAAxADEAMQAAAAAAUAD+H/L/QQFQAAAAIABXAFcALQBBAGIAcwBhAHQAegAtAFMA
+dABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0ADEAMQAxADEAAAAAAFIA/h/y/1EB
+UgAAACEAVwBXAC0AQQBiAHMAYQB0AHoALQBTAHQAYQBuAGQAYQByAGQAcwBjAGgAcgBpAGYA
+dABhAHIAdAAxADEAMQAxADEAAAAAAFQA/h/y/2EBVAAAACIAVwBXAC0AQQBiAHMAYQB0AHoA
+LQBTAHQAYQBuAGQAYQByAGQAcwBjAGgAcgBpAGYAdABhAHIAdAAxADEAMQAxADEAMQAAAAAA
+KgD+H/L/cQEqAAAACQBXAFcAOABOAHUAbQAyAHoAMAAAAAgAT0oBAFFKAQAuAP4f8v+BAS4A
+AAAJAFcAVwA4AE4AdQBtADIAegAxAAAADABPSgcAUUoHAF5KBwAqAP4f8v+RASoAAAAJAFcA
+VwA4AE4AdQBtADIAegAzAAAACABPSgEAUUoBADYA/h/y/6EBNgAAAAkAVwBXADgATgB1AG0A
+MwB6ADAAAAATAE9KAABRSgAANQgBUEoAAF5KAAAAKgD+H/L/sQEqAAAACQBXAFcAOABOAHUA
+bQAzAHoAMQAAAAgAT0oHAFFKBwAqAP4f8v/BASoAAAAJAFcAVwA4AE4AdQBtADMAegAyAAAA
+CABPSggAUUoIACoA/h/y/9EBKgAAAAkAVwBXADgATgB1AG0ANAB6ADAAAAAIAE9KCABRSggA
+LgD+H/L/4QEuAAAACQBXAFcAOABOAHUAbQA0AHoAMQAAAAwAT0oHAFFKBwBeSgcAKgD+H/L/
+8QEqAAAACQBXAFcAOABOAHUAbQA0AHoAMwAAAAgAT0oBAFFKAQA8AP4f8v8BAjwAAAAWAEQA
+ZQBmAGEAdQBsAHQAIABQAGEAcgBhAGcAcgBhAHAAaAAgAEYAbwBuAHQAAAAAACoA/h/y/xEC
+KgAAAAkAVwBXADgATgB1AG0AMQB6ADAAAAAIAE9KAABRSgAAKgD+H/L/IQIqAAAACQBXAFcA
+OABOAHUAbQAzAHoAMwAAAAgAT0oBAFFKAQAqAP4f8v8xAioAAAAJAFcAVwA4AE4AdQBtADUA
+egAwAAAACABPSgEAUUoBACoA/h/y/0ECKgAAAAkAVwBXADgATgB1AG0ANQB6ADEAAAAIAE9K
+BwBRSgcAKgD+H/L/UQIqAAAACQBXAFcAOABOAHUAbQA1AHoAMgAAAAgAT0oIAFFKCAAqAP4f
+8v9hAioAAAAJAFcAVwA4AE4AdQBtADcAegAwAAAACABPSgEAUUoBADwA/h/y/3ECPAAAAAkA
+VwBXADgATgB1AG0AOAB6ADAAAAAZAEIqBnBo/wAAAE9KCABRSggAUEoAAF5KAAAALgD+H/L/
+gQIuAAAACQBXAFcAOABOAHUAbQA4AHoAMQAAAAwAT0oHAFFKBwBeSgcAKgD+H/L/kQIqAAAA
+CQBXAFcAOABOAHUAbQA4AHoAMgAAAAgAT0oIAFFKCAAqAP4f8v+hAioAAAAJAFcAVwA4AE4A
+dQBtADgAegAzAAAACABPSgEAUUoBACoA/h/y/7ECKgAAAAkAVwBXADgATgB1AG0AOQB6ADAA
+AAAIAE9KAQBRSgEALAD+H/L/wQIsAAAACgBXAFcAOABOAHUAbQAxADAAegAwAAAACABPSgEA
+UUoBACwA/h/y/9ECLAAAAAoAVwBXADgATgB1AG0AMQAxAHoAMAAAAAgAT0oBAFFKAQAsAP4f
+8v/hAiwAAAAKAFcAVwA4AE4AdQBtADEAMgB6ADAAAAAIAE9KAQBRSgEALAD+H/L/8QIsAAAA
+CgBXAFcAOABOAHUAbQAxADIAegAxAAAACABPSgcAUUoHACwA/h/y/wEDLAAAAAoAVwBXADgA
+TgB1AG0AMQAyAHoAMgAAAAgAT0oIAFFKCAA2AP4f8v8RAzYAAAAKAFcAVwA4AE4AdQBtADEA
+MwB6ADAAAAARAEIqBnBo/wAAAE9KAQBRSgEAADAA/h/y/yEDMAAAAAoAVwBXADgATgB1AG0A
+MQAzAHoAMQAAAAwAT0oHAFFKBwBeSgcALAD+H/L/MQMsAAAACgBXAFcAOABOAHUAbQAxADMA
+egAyAAAACABPSggAUUoIACwA/h/y/0EDLAAAAAoAVwBXADgATgB1AG0AMQAzAHoAMwAAAAgA
+T0oBAFFKAQA+AP4f8v9RAz4AAAAKAFcAVwA4AE4AdQBtADEANAB6ADAAAAAZAEIqBnBo/wAA
+AE9KCABRSggAUEoAAF5KAAAAMAD+H/L/YQMwAAAACgBXAFcAOABOAHUAbQAxADQAegAxAAAA
+DABPSgcAUUoHAF5KBwAsAP4f8v9xAywAAAAKAFcAVwA4AE4AdQBtADEANAB6ADIAAAAIAE9K
+CABRSggALAD+H/L/gQMsAAAACgBXAFcAOABOAHUAbQAxADQAegAzAAAACABPSgEAUUoBACwA
+/h/y/5EDLAAAAAoAVwBXADgATgB1AG0AMQA2AHoAMAAAAAgAT0oBAFFKAQAwAP4f8v+hAzAA
+AAAKAFcAVwA4AE4AdQBtADEANgB6ADEAAAAMAE9KBwBRSgcAXkoHACwA/h/y/7EDLAAAAAoA
+VwBXADgATgB1AG0AMQA2AHoAMgAAAAgAT0oIAFFKCAAsAP4f8v/BAywAAAAKAFcAVwA4AE4A
+dQBtADEAOAB6ADAAAAAIAE9KAQBRSgEALAD+H/L/0QMsAAAACgBXAFcAOABOAHUAbQAxADkA
+egAwAAAACABPSgEAUUoBACwA/h/y/+EDLAAAAAoAVwBXADgATgB1AG0AMgAwAHoAMAAAAAgA
+T0oAAFFKAAAsAP4f8v/xAywAAAAKAFcAVwA4AE4AdQBtADIAMgB6ADAAAAAIAE9KAQBRSgEA
+LAD+H/L/AQQsAAAACgBXAFcAOABOAHUAbQAyADIAegAxAAAACABPSgcAUUoHACwA/h/y/xEE
+LAAAAAoAVwBXADgATgB1AG0AMgAyAHoAMgAAAAgAT0oIAFFKCAAsAP4f8v8hBCwAAAAKAFcA
+VwA4AE4AdQBtADIAMwB6ADAAAAAIAE9KAQBRSgEALAD+H/L/MQQsAAAACgBXAFcAOABOAHUA
+bQAyADQAegAwAAAACABPSgEAUUoBACwA/h/y/0EELAAAAAoAVwBXADgATgB1AG0AMgA0AHoA
+MQAAAAgAT0oHAFFKBwAsAP4f8v9RBCwAAAAKAFcAVwA4AE4AdQBtADIANAB6ADIAAAAIAE9K
+CABRSggALAD+H/L/YQQsAAAACgBXAFcAOABOAHUAbQAyADYAegAwAAAACABPSgEAUUoBADAA
+/h/y/3EEMAAAAAoAVwBXADgATgB1AG0AMgA2AHoAMQAAAAwAT0oIAFFKCABDShAALAD+H/L/
+gQQsAAAACgBXAFcAOABOAHUAbQAyADYAegAyAAAACABPSggAUUoIACwA/h/y/5EELAAAAAoA
+VwBXADgATgB1AG0AMgA2AHoANAAAAAgAT0oHAFFKBwA0AP4f8v+hBDQAAAAKAFcAVwA4AE4A
+dQBtADIANwB6ADAAAAAQAE9KAQBRSgEAUEoAAF5KAgAsAP4f8v+xBCwAAAAKAFcAVwA4AE4A
+dQBtADIANwB6ADEAAAAIAE9KBwBRSgcALAD+H/L/wQQsAAAACgBXAFcAOABOAHUAbQAyADcA
+egAyAAAACABPSggAUUoIACwA/h/y/9EELAAAAAoAVwBXADgATgB1AG0AMgA3AHoAMwAAAAgA
+T0oBAFFKAQAsAP4f8v/hBCwAAAAKAFcAVwA4AE4AdQBtADIAOAB6ADAAAAAIAE9KAQBRSgEA
+QgD+H/L/8QRCAAAAGQBXAFcALQBEAGUAZgBhAHUAbAB0ACAAUABhAHIAYQBnAHIAYQBwAGgA
+IABGAG8AbgB0AAAAAAA0AFcQ8v8BBTQAAAAPAFMAdAByAG8AbgBnACAARQBtAHAAaABhAHMA
+aQBzAAAABgA1CAFcCAEmAFgQ8v8RBSYAAAAIAEUAbQBwAGgAYQBzAGkAcwAAAAYANggBXQgB
+NgBVEPL/IQU2AAAADQBJAG4AdABlAHIAbgBlAHQAIABMAGkAbgBrAAAADABCKgJwaAAA/wA+
+KgFGAFYQ8v8xBUYAAAAVAFYAaQBzAGkAdABlAGQAIABJAG4AdABlAHIAbgBlAHQAIABMAGkA
+bgBrAAAADABCKgxwaIAAgAA+KgFCAP4fAgJBBUIAAAAKACAAQwBoAGEAcgAgAEMAaABhAHIA
+AAAeAENKGABtSAkEc0gJBDUIAWFKGABfSAEEdEgBBFwIAUYA/h8BAGIFRgAAAAcASABlAGEA
+ZABpAG4AZwAAAA0AVQATpPAAFKR4AAYkAQAYAE9KCQBRSgkAQ0ocAFBKCgBeSgoAYUocADIA
+QhABAGIFMgAAAAkAVABlAHgAdAAgAGIAbwBkAHkAAAAKAFYAE6RkABSkZAAEAENKGAAcAC8Q
+YQVyBRwAAAAEAEwAaQBzAHQAAAACAFcAAAA8AP4fAQCCBTwAAAAHAEMAYQBwAHQAaQBvAG4A
+AAANAFgAE6R4ABSkeAAMJAEADgBDShgANggBYUoYAF0IASIA/h8BAJIFIgAAAAUASQBuAGQA
+ZQB4AAAABQBZAAwkAQAAADgA/h8BAKIFOAAAAAwATgBvAHIAbQBhAGwAIAAoAFcAZQBiACkA
+AAAKAFoAE6RkABSkZAAEAENKGAA2AP4fAQCyBTYAAAALAEIAbwBkAHkAIABUAGUAeAB0ACAA
+MwAAAAoAWwATpGQAFKRkAAQAQ0oYAHwA/h8BAMIFfAAAABEASABUAE0ATAAgAFAAcgBlAGYA
+bwByAG0AYQB0AHQAZQBkAAAANwBcAA3GMgAQlAMoB7wKUA7kEXgVDBmgHDQgyCNcJ/AqhC4Y
+Mqw1QDkAAAAAAAAAAAAAAAAAAAAAABAAT0oHAFFKBwBQSgcAXkoHAEAAQxABANIFQAAAABAA
+VABlAHgAdAAgAGIAbwBkAHkAIABpAG4AZABlAG4AdAAAAA4AXQBehNACXYQAAGCEAAAAADgA
+ShABAGIFOAAAAAgAUwB1AGIAdABpAHQAbABlAAAACABeAAMkAmEkAg4AQ0oYADUIAWFKGABc
+CAE4AP4fAQDyBTgAAAAIAGMAbwBtAHAAbwBzAGUAZgAAAAoAXwATpGQAFKRkAAwAT0oHAFFK
+BwBQSgsASgD+HwEAAgZKAAAADABIAFQATQBMACAAQQBkAGQAcgBlAHMAcwAAAAIAYAAeAE9K
+CwBRSgsAQ0oYADYIAVBKCwBeSgsAYUoYAF0IAS4AIBABABIGLgAAAAYARgBvAG8AdABlAHIA
+AAAQAGEAMSQADcYIAALgEMAhAQIAADoA/h8BACIGOgAAAAsAQgBvAGQAeQAgAFQAZQB4AHQA
+IAAyAAAAAgBiABAAT0oCAFFKAgBDShIAXkoCACwAHxABADIGLAAAAAYASABlAGEAZABlAHIA
+AAANAGMADcYIAALgEMAhAQIAAAAwAP4fYQVCBjAAAAAOAEYAcgBhAG0AZQAgAGMAbwBuAHQA
+ZQBuAHQAcwAAAAIAZAAAADQA/h8BAFIGNAAAAA4AVABhAGIAbABlACAAQwBvAG4AdABlAG4A
+dABzAAAABQBlAAwkAQAAAD4A/h9RBmIGPgAAAA0AVABhAGIAbABlACAASABlAGEAZABpAG4A
+ZwAAAAsAZgADJAFhJAEMJAEABgA1CAFcCAEAAAAADAEAAA0BAAABAAAAAAAAAAAA/////wIE
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAQAADQEAAAAAAAAACAAAAAAAAAAA
+AACABgAABAAAQAAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAIAADCCwAARg8AAOASAAD+FAAACwAAAAwAAAANAAAADgAAAAAI
+AABQDAAAkgwAAP4MAABoDQAA1A0AAEIOAACuDgAAGA8AACIPAAAsDwAANg8AAEAPAAD2EAAA
+ahMAAO4TAACAFAAAABUAAA8AAAAQAAAAEQAAABIAAAATAAAAFAAAABUAAAAWAAAAFwAAABgA
+AAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAADwAA8GwAAAAAAAbwGAAAAAYEAAACAAAA
+BQAAAAEAAAABAAAABgAAAB8AAfAsAAAAYgAH8CQAAAAGBiP0F3wAAAAANiQDkRECABAAAGoB
+AAABAAAAMkAAAAAAAABAAB7xEAAAAAQAAAgBAAAIAgAACPcAABAADwAC8BwDAAAQAAjwCAAA
+AAUAAAAFBAAADwAD8K4CAAAPAATwKAAAAAEACfAQAAAAAAAAAAAAAAABgP//AYD//wIACvAI
+AAAAAAQAAAUAAAAPAATwqgAAAKIMCvAIAAAAAgQAAAAKAADTAAvwTgAAAIAAAAABAIEAAAAA
+AIIAAAAAAIMAAAAAAIQAAAAAAIgAAAAAAIEB////AIIBAAAAAIMBAAAAAL8BEAAQAP8BAAAI
+AIQDAAAAAIYDfL4BAEMAIvEYAAAAjwMAAAAAkAMAAAAAkQMAAAAAkgMCAAAAAAAQ8AQAAAAA
+AAAAAAAR8AQAAAABAAAAAAAN8AQAAAAAAAEADwAE8G4AAABCAQrwCAAAAAMEAAAACgAAkwAL
+8DYAAABEAQQAAAB/AQEQAAC/AQAAEADAAQAAAADCAf///wDLATBXAADWAQEAAAD/AQgACAA/
+AgAAAgBDACLxGAAAAI8DAAAAAJADAgAAAJEDAAAAAJIDAgAAAA8ABPBuAAAAQgEK8AgAAAAE
+BAAAAAoAAJMAC/A2AAAARAEEAAAAfwEBEAAAvwEAABAAwAEAAAAAwgH///8AywEwVwAA1gEB
+AAAA/wEIAAgAPwIAAAIAQwAi8RgAAACPAwAAAACQAwIAAACRAwAAAACSAwIAAAAPAATw2AAA
+ALIECvAIAAAABQQAAAAKAADzAAvwiAAAAIEAAAAAAIIAAAAAAIMAAAAAAIQAAAAAAARBAQAA
+AAYBAAAAAD8BAAAAAIEB////AIMBAAAAAL8BEAAQAP8BAAAIAIODLgAAAIQD98ABAIYD98AB
+AL8DIAAgAAUABQAIAIkGAACvDgAAiQYAAOM6AADCPgAA4zoAANVCAACvDgAAiQYAAK8OAABD
+ACLxGAAAAI8DAAAAAJADAgAAAJEDAAAAAJIDAgAAAAAAEPAEAAAAAAAAAAAAEfAEAAAAAQAA
+AA8ABPBOAAAAEgAK8AgAAAABBAAAAA4AAHMAC/AqAAAAgQH///8AgwEAAAAAvwEQABAAwAEB
+AAAIywEAAAAA/wEIAAgAAQICAAAIAAAR8AQAAAABAAAAHAAAAGwAAADcAQAAQQIAAIAGAAAE
+BAAAAAAAAAYAAACsJgAABgAAAHQAAAAAAAMEAAAAAAAAmgAAAKwmAACaAAAAdAAAAAAAAgQA
+AI////9iAAAAOCYAABkHAABUBgAAAAAFBAAAbAAAAPf///+dAQAAKAEAAJRAAAAAAP//AQAA
+AA8AXwBQAGkAYwB0AHUAcgBlAEIAdQBsAGwAZQB0AHMAcAUAAH8GAAAAAAAAcQUAAH8GAAAB
+AAEAAAABAAAA/w//D/8P/w//D/8P/w//D/8PAAACAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAA
+EAAAXoTQAmCEMP0VxgUAAdACBgIAAAApAAEAAAD/AAAAAAAAAAAAAAIAAAAAAAAAAAAQAABe
+hEACYITA/RXGBQABAAAGAAABAAAA/wAAAAAAAAAAAAACAAAAAAAAAAAAEAAAXoTQAmCEMP0V
+xgUAAQAABgAAAQAAAP8AAAAAAAAAAAAAAgAAAAAAAAAAABAAAF6EYANghKD8FcYFAAEAAAYA
+AAEAAAD/AAAAAAAAAAAAAAIAAAAAAAAAAAAQAABehPADYIQQ/BXGBQABAAAGAAABAAAA/wAA
+AAAAAAAAAAACAAAAAAAAAAAAEAAAXoSABGCEgPsVxgUAAQAABgAAAQAAAAAAAQAAAAAAAAAA
+AAAAAAAAAAAAABAAAF6EQAtghJj+FcYFAAFACwYCAAYALgABAAAA/wAAAAAAAAAAAAACAAAA
+AAAAAAAAEAAAXoSgBWCEYPoVxgUAAQAABgAAAQAAAP8AAAAAAAAAAAAAAgAAAAAAAAAAABAA
+AF6EMAZghND5FcYFAAEAAAYAAAEAAAABAAAAAAAAAAAAAAAAAAAA////////AQAAAAAA/0AA
+AAAAgAYAAAAAAAACEAAAAAAAAACABgAAUAAACAAAAAAMAAAARxaQAQAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAaQBtAGUAcwAgAE4AZQB3ACAAUgBvAG0AYQBuAAAA
+NRaQAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFMAeQBtAGIAbwBsAAAA
+MyaQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEAcgBpAGEAbAAAAEcW
+kAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAGkAbQBlAHMAIABOAGUA
+dwAgAFIAbwBtAGEAbgAAADUmkAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AABUAGEAaABvAG0AYQAAAD8WkAECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AABXAGkAbgBnAGQAaQBuAGcAcwAgADIAAAA3JpABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAVgBlAHIAZABhAG4AYQAAAD80kAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAABDAG8AdQByAGkAZQByACAATgBlAHcAAAA7BpABAgAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwBpAG4AZwBkAGkAbgBnAHMAAABTJpABgBAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATABpAGIAZQByAGEAdABpAG8AbgAgAFMA
+YQBuAHMAAABBAHIAaQBhAGwAAAA/BpABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAARABlAGoAYQBWAHUAIABTAGEAbgBzAAAASSaQAYAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAEEAcgBpAGEAbAAgAFUAbgBpAGMAbwBkAGUAIABNAFMAAABCAAQA
+AQiNGAAA0AIAAGgBAAAAAHPC62bU3fWmAAAAAAEAAAAAAMkAAAASBgAAAgA/AAAABACDkD8A
+AADJAAAAEgYAAAIAPwAAAD8AAAAAAAAAJwMA8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAIAAAAAAAAAAAAAAAAAAPAQAN/f//0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+gAAAAAAAAAAAAAAA//8SAAAAAAAAAA8AQwBhAG4AZABpAGQAYQB0AGUAcwAgAE4AYQBtAGUA
+AAAAAAAAEwBzAGEAZwBhAHIAIABwACAAcwB1AHIAeQBhAHcAYQBuAHMAaABpAAMAcwBhAGkA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAJ4EAABEAGQA7gAjAQAAAAAAAAAAAAAAAAAAAACHAKUA6APoAwAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAADwAE8GYAAACyBArwCAAAAAEEAAAACgAAswAL8EIAAACBAAAA
+AACCAAAAAACDAAAAAACEAAAAAAAEQQEAAAAGAQAAAAA/AQAAAACBAf///wCDAQAAAAC/ARAA
+EAD/AQAACAAAABDwBAAAAAAAAIBiAAfw5AMAAAYGnRZ3tgAAAAB7OGUgEgIAEAAAwAMAAAEA
+AAAAAAAAAAAAAABuHvC4AwAAnRZ3tgAAAAB7OGUgEgIAEP+JUE5HDQoaCgAAAA1JSERSAAAA
+CQAAAAsIAwAAAJqHVykAAAMAUExURQAAAPf39///////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////88f9h0AAAADdFJOU///ANfKDUEA
+AAABYktHRACIBR1IAAAADGNtUFBKQ21wMDcxMgAAAANIAHO8AAAALklEQVQYV22MQQoAAAjC
+rP8/Ol10K8IJiuo7tbChbMtiRIMkMeT7m9B4e5RP2B4eJACOUomEagAAAABJRU5ErkJgggAA
+ngQAAEQAZADuACMBAAAAAAAAAAAAAAAAAAAAAIcApQDoA+gDAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAPAATwZgAAALIECvAIAAAAAQQAAAAKAACzAAvwQgAAAIEAAAAAAIIA
+AAAAAIMAAAAAAIQAAAAAAARBAQAAAAYBAAAAAD8BAAAAAIEB////AIMBAAAAAL8BEAAQAP8B
+AAAIAAAAEPAEAAAAAAAAgGIAB/DkAwAABgadFne2AAAAAHs4ZSASAgAQAADAAwAAAQAAAAAA
+AAAAAAAAAG4e8LgDAACdFne2AAAAAHs4ZSASAgAQ/4lQTkcNChoKAAAADUlIRFIAAAAJAAAA
+CwgDAAAAmodXKQAAAwBQTFRFAAAA9/f3////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////zx/2HQAAAAN0Uk5T//8A18oNQQAAAAFi
+S0dEAIgFHUgAAAAMY21QUEpDbXAwNzEyAAAAA0gAc7wAAAAuSURBVBhXbYxBCgAACMKs/z86
+XXQrwgmK6ju1sKFsy2JEgyQx5Pub0Hh7lE/YHh4kAI5SiYRqAAAAAElFTkSuQmCCAACeBAAA
+RABkAO4AIwEAAAAAAAAAAAAAAAAAAAAAhwClAOgD6AMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAA8ABPBmAAAAsgQK8AgAAAABBAAAAAoAALMAC/BCAAAAgQAAAAAAggAAAAAA
+gwAAAAAAhAAAAAAABEEBAAAABgEAAAAAPwEAAAAAgQH///8AgwEAAAAAvwEQABAA/wEAAAgA
+AAAQ8AQAAAAAAACAYgAH8OQDAAAGBp0Wd7YAAAAAezhlIBICABAAAMADAAABAAAAAAAAAAAA
+AAAAbh7wuAMAAJ0Wd7YAAAAAezhlIBICABD/iVBORw0KGgoAAAANSUhEUgAAAAkAAAALCAMA
+AACah1cpAAADAFBMVEUAAAD39/f/////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+///////////////////////////////////PH/YdAAAAA3RSTlP//wDXyg1BAAAAAWJLR0QA
+iAUdSAAAAAxjbVBQSkNtcDA3MTIAAAADSABzvAAAAC5JREFUGFdtjEEKAAAIwqz/PzpddCvC
+CYrqO7WwoWzLYkSDJDHk+5vQeHuUT9geHiQAjlKJhGoAAAAASUVORK5CYIIAAJ4EAABEAGQA
+7gAjAQAAAAAAAAAAAAAAAAAAAACHAKUA6APoAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAADwAE8GYAAACyBArwCAAAAAEEAAAACgAAswAL8EIAAACBAAAAAACCAAAAAACDAAAA
+AACEAAAAAAAEQQEAAAAGAQAAAAA/AQAAAACBAf///wCDAQAAAAC/ARAAEAD/AQAACAAAABDw
+BAAAAAAAAIBiAAfw5AMAAAYGnRZ3tgAAAAB7OGUgEgIAEAAAwAMAAAEAAAAAAAAAAAAAAABu
+HvC4AwAAnRZ3tgAAAAB7OGUgEgIAEP+JUE5HDQoaCgAAAA1JSERSAAAACQAAAAsIAwAAAJqH
+VykAAAMAUExURQAAAPf39///////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+/////////////////////////////88f9h0AAAADdFJOU///ANfKDUEAAAABYktHRACIBR1I
+AAAADGNtUFBKQ21wMDcxMgAAAANIAHO8AAAALklEQVQYV22MQQoAAAjCrP8/Ol10K8IJiuo7
+tbChbMtiRIMkMeT7m9B4e5RP2B4eJACOUomEagAAAABJRU5ErkJgggAAngQAAEQAZADuACMB
+AAAAAAAAAAAAAAAAAAAAAIcApQDoA+gDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAPAATwZgAAALIECvAIAAAAAQQAAAAKAACzAAvwQgAAAIEAAAAAAIIAAAAAAIMAAAAAAIQA
+AAAAAARBAQAAAAYBAAAAAD8BAAAAAIEB////AIMBAAAAAL8BEAAQAP8BAAAIAAAAEPAEAAAA
+AAAAgGIAB/DkAwAABgadFne2AAAAAHs4ZSASAgAQAADAAwAAAQAAAAAAAAAAAAAAAG4e8LgD
+AACdFne2AAAAAHs4ZSASAgAQ/4lQTkcNChoKAAAADUlIRFIAAAAJAAAACwgDAAAAmodXKQAA
+AwBQTFRFAAAA9/f3////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////zx/2HQAAAAN0Uk5T//8A18oNQQAAAAFiS0dEAIgFHUgAAAAM
+Y21QUEpDbXAwNzEyAAAAA0gAc7wAAAAuSURBVBhXbYxBCgAACMKs/z86XXQrwgmK6ju1sKFs
+y2JEgyQx5Pub0Hh7lE/YHh4kAI5SiYRqAAAAAElFTkSuQmCCAACeBAAARABkAO4AIwEAAAAA
+AAAAAAAAAAAAAAAAhwClAOgD6AMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8A
+BPBmAAAAsgQK8AgAAAABBAAAAAoAALMAC/BCAAAAgQAAAAAAggAAAAAAgwAAAAAAhAAAAAAA
+BEEBAAAABgEAAAAAPwEAAAAAgQH///8AgwEAAAAAvwEQABAA/wEAAAgAAAAQ8AQAAAAAAACA
+YgAH8OQDAAAGBp0Wd7YAAAAAezhlIBICABAAAMADAAABAAAAAAAAAAAAAAAAbh7wuAMAAJ0W
+d7YAAAAAezhlIBICABD/iVBORw0KGgoAAAANSUhEUgAAAAkAAAALCAMAAACah1cpAAADAFBM
+VEUAAAD39/f/////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+///////////////////PH/YdAAAAA3RSTlP//wDXyg1BAAAAAWJLR0QAiAUdSAAAAAxjbVBQ
+SkNtcDA3MTIAAAADSABzvAAAAC5JREFUGFdtjEEKAAAIwqz/PzpddCvCCYrqO7WwoWzLYkSD
+JDHk+5vQeHuUT9geHiQAjlKJhGoAAAAASUVORK5CYIIAAJ4EAABEAGQA7gAjAQAAAAAAAAAA
+AAAAAAAAAACHAKUA6APoAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAE8GYA
+AACyBArwCAAAAAEEAAAACgAAswAL8EIAAACBAAAAAACCAAAAAACDAAAAAACEAAAAAAAEQQEA
+AAAGAQAAAAA/AQAAAACBAf///wCDAQAAAAC/ARAAEAD/AQAACAAAABDwBAAAAAAAAIBiAAfw
+5AMAAAYGnRZ3tgAAAAB7OGUgEgIAEAAAwAMAAAEAAAAAAAAAAAAAAABuHvC4AwAAnRZ3tgAA
+AAB7OGUgEgIAEP+JUE5HDQoaCgAAAA1JSERSAAAACQAAAAsIAwAAAJqHVykAAAMAUExURQAA
+APf39///////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+/////////////88f9h0AAAADdFJOU///ANfKDUEAAAABYktHRACIBR1IAAAADGNtUFBKQ21w
+MDcxMgAAAANIAHO8AAAALklEQVQYV22MQQoAAAjCrP8/Ol10K8IJiuo7tbChbMtiRIMkMeT7
+m9B4e5RP2B4eJACOUomEagAAAABJRU5ErkJgggAAngQAAEQAZADuACMBAAAAAAAAAAAAAAAA
+AAAAAIcApQDoA+gDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAATwZgAAALIE
+CvAIAAAAAQQAAAAKAACzAAvwQgAAAIEAAAAAAIIAAAAAAIMAAAAAAIQAAAAAAARBAQAAAAYB
+AAAAAD8BAAAAAIEB////AIMBAAAAAL8BEAAQAP8BAAAIAAAAEPAEAAAAAAAAgGIAB/DkAwAA
+BgadFne2AAAAAHs4ZSASAgAQAADAAwAAAQAAAAAAAAAAAAAAAG4e8LgDAACdFne2AAAAAHs4
+ZSASAgAQ/4lQTkcNChoKAAAADUlIRFIAAAAJAAAACwgDAAAAmodXKQAAAwBQTFRFAAAA9/f3
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////zx/2HQAAAAN0Uk5T//8A18oNQQAAAAFiS0dEAIgFHUgAAAAMY21QUEpDbXAwNzEy
+AAAAA0gAc7wAAAAuSURBVBhXbYxBCgAACMKs/z86XXQrwgmK6ju1sKFsy2JEgyQx5Pub0Hh7
+lE/YHh4kAI5SiYRqAAAAAElFTkSuQmCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAA7KUBAU0gCQQAAAgSvwAAAAAAADAAAAAAAAgAAAAVAAAOAENhb2xhbjgw
+AAAAAAAAAAAAAAAAAAAAAAAACQQWAJxBAAAAAAAAAAAAAHIFAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA0BAAAAAAAA//8PAAsAAAAEAAAA//8PAA8AAAARAAAA//8PAAAAAAAAAAAAAAAAAAAA
+AACIAAAAAACIFQAAAAAAAIgVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgV
+AAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsFQAANAAAACAWAAAkAAAA
+RBYAAIwAAAAAAAAAAAAAACYdAAAGAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAOUaAAAmAAAACxsAAAwAAAAXGwAACAAAAAMdAAACAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCAAAGICAACOIgAAdAAAABEd
+AAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+aRoAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQFgAAmQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAACIFQAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHxsAAB4A
+AADjHAAAGAAAAMAVAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+xwAAAgAAAAAAAAAAAAAAAUdAAAMAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAIA2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAgACAAQwBVAFIAUgBJAEMAVQBMAFUATQAgAFYA
+SQBUAEEARQANAAgADQBSAGkAYwBoAGEAcgBkACAAQQBuAGQAZQByAHMAbwBuACAACwAxADIA
+MwA0ACwAIABXAGUAcwB0ACAANgA3ACAAUwB0AHIAZQBlAHQALAAgAAsAQwBhAHIAbABpAHMA
+bABlACwAIABNAEEAIAAwADEANwA0ADEALAAgAAsAKAAxADIAMwApAC0ANAA1ADYAIAA3ADgA
+OQAwAC4ADQAIAAsAAQAgAEMAYQByAGUAZQByACAATwBiAGoAZQBjAHQAaQB2AGUADQANAEQA
+ZQBzAGkAcgBlACAAYQAgAGMAaABhAGwAbABlAG4AZwBpAG4AZwAgAHAAbwBzAGkAdABpAG8A
+bgAgAGkAbgAgAHQAaABlACAAYQByAGUAYQAgAG8AZgAgAFMAbwBmAHQAdwBhAHIAZQAgAGQA
+ZQB2AGUAbABvAHAAbQBlAG4AdAAsACAAdwBoAGkAYwBoACAAdwBpAGwAbAAgAHUAdABpAGwA
+aQB6AGUAIABtAHkAIABpAG4AdABlAHIAZABpAHMAYwBpAHAAbABpAG4AYQByAHkALAAgAHQA
+ZQBjAGgAbgBpAGMAYQBsACwAIABhAG4AZAAgAHMAbwBmAHQAdwBhAHIAZQAgAGQAZQB2AGUA
+bABvAHAAbQBlAG4AdAAgAGwAaQBmAGUAIABjAHkAYwBsAGUAIABzAGsAaQBsAGwAcwAgAGkA
+bgAgAGEAIABwAHIAbwBkAHUAYwB0AGkAdgBlACwAIABlAG4AdABoAHUAcwBpAGEAcwB0AGkA
+YwAgAGEAbgBkACAAaQBuACAAYQAgAHQAZQBhAG0ALQBvAHIAaQBlAG4AdABlAGQAIABlAG4A
+dgBpAHIAbwBuAG0AZQBuAHQALgANAA0AAQAgAEUAZAB1AGMAYQB0AGkAbwBuAGEAbAAgAFMA
+dQBtAG0AYQByAHkADQBQ8CAAQwBvAG0AcABsAGUAdABlAGQAIABNAGEAcwB0AGUAcgBzACAA
+aQBuACAAQwBvAG0AcAB1AHQAZQByACAAYQBwAHAAbABpAGMAYQB0AGkAbwBuACAAKABNAC4A
+QwAuAEEAKQAgAHcAaQB0AGgAIAA2ADMALgA3ADEAJQAgAA0AAQAgAFQAZQBjAGgAbgBpAGMA
+YQBsACAASwBuAG8AdwBsAGUAZABnAGUAIABTAHUAbQBtAGEAcgB5AA0ACAANAAEAIAAgAEQA
+ZQB0AGEAaQBsAGUAZAAgAEUAZAB1AGMAYQB0AGkAbwBuAGEAbAAgAEEAYwBhAGQAZQBtAGkA
+YwAgAEMAcgBlAGQAZQBuAHQAaQBhAGwAcwANAEUAeABhAG0AaQBuAGEAdABpAG8AbgAHAEIA
+bwBhAHIAZAAvAFUAbgBpAHYAZQByAHMAaQB0AHkABwBQAGEAcwBzAGkAbgBnACAAWQBlAGEA
+cgAHAFAAZQByAGMAZQBuAHQAYQBnAGUABwAHAAgATQAuAEMALgBBACAABwAHACAAIAAgACAA
+IAAgACAAIAAgACAAUwBlAG0AZQBzAHQAZQByACAAVgBJAAcAQwBhAHIAbABpAHMAbABlACAA
+VQBuAGkAdgBlAHIAcwBpAHQAeQAHADIAMAAxADEABwA2ADMALgA3ADEABwAHACAAIAAgACAA
+IAAgACAAIAAgACAAUwBlAG0AZQBzAHQAZQByACAAVgAHAEMAYQByAGwAaQBzAGwAZQAgAFUA
+bgBpAHYAZQByAHMAaQB0AHkABwAyADAAMQAwAAcANgA3AC4AMQA3AAcABwAgACAAIAAgACAA
+IAAgACAAIAAgAFMAZQBtAGUAcwB0AGUAcgAgAEkAVgAHAEMAYQByAGwAaQBzAGwAZQAgAFUA
+bgBpAHYAZQByAHMAaQB0AHkABwAyADAAMQAwAAcANgAyAC4AOAAwAAcABwAgACAAIAAgACAA
+IAAgACAAIAAgAFMAZQBtAGUAcwB0AGUAcgAgAEkASQBJAAcAQwBhAHIAbABpAHMAbABlACAA
+VQBuAGkAdgBlAHIAcwBpAHQAeQAHADIAMAAxADAABwA2ADIALgAyADUABwAHACAAIAAgACAA
+IAAgACAAIAAgACAAUwBlAG0AZQBzAHQAZQByACAASQBJAAcAQwBhAHIAbABpAHMAbABlACAA
+VQBuAGkAdgBlAHIAcwBpAHQAeQAHADIAMAAwADkABwA2ADUALgA3ADUABwAHACAAIAAgACAA
+IAAgACAAIAAgACAAUwBlAG0AZQBzAHQAZQByACAASQAHAEMAYQByAGwAaQBzAGwAZQAgAFUA
+bgBpAHYAZQByAHMAaQB0AHkABwAyADAAMAA5AAcANgAzAC4AMwAzAAcABwAHAAcABwAHAAcA
+BwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcAAQAgAFMAdQBiAGoAZQBjAHQAIAAgAEYA
+YQBtAGkAbABpAGEAcgBpAHQAeQA6AA0AUPAgAEQAYQB0AGEAYgBhAHMAZQAgAE0AYQBuAGEA
+ZwBlAG0AZQBuAHQAIABDAG8AbgBjAGUAcAB0AHMADQBQ8CAATwBiAGoAZQBjAHQAIABPAHIA
+aQBlAG4AdABlAGQAIABQAHIAbwBnAHIAYQBtAG0AaQBuAGcAIABDAG8AbgBjAGUAcAB0AA0A
+UPAgAFMAeQBzAHQAZQBtACAAQQBuAGEAbAB5AHMAaQBzACAAYQBuAGQAIABEAGUAcwBpAGcA
+bgANAFDwIABzAG8AZgB0AHcAYQByAGUAIABFAG4AZwBpAG4AZQBlAHIAaQBuAGcAIAANAFDw
+IABPAHAAZQByAGEAdABpAG4AZwAgAFMAeQBzAHQAZQBtACAAQwBvAG4AYwBlAHAAdAANAFDw
+IABVAG4AaQB4ACAAUwBoAGUAbABsACAAUAByAG8AZwByAGEAbQBtAGkAbgBnAA0AAQAgAEEA
+cgBlAGEAIABvAGYAIABJAG4AdABlAHIAZQBzAHQAOgANAFDwIABTAG8AZgB0AHcAYQByAGUA
+IABkAGUAdgBlAGwAbwBwAG0AZQBuAHQAIAAgAHUAcwBpAG4AZwAgAEoAYQB2AGEALwAuAE4A
+ZQB0ACAAdABlAGMAaABuAG8AbABvAGcAaQBlAHMADQBQ8CAATABlAGEAcgBuAGkAbgBnACAA
+bgBlAHcAIAB0AGUAYwBoAG4AbwBsAG8AZwBpAGUAcwAuAA0AAQAgAFAAZQByAHMAbwBuAGEA
+bAAgAEQAZQB0AGEAaQBsAHMADQBOAGEAbQBlADoAIAAgAAkACQBSAGkAYwBoAGEAcgBkACAA
+QQBuAGQAZQByAHMAbwBuAA0AQwB1AHIAcgBlAG4AdAAgAEEAZABkAHIAZQBzAHMACQAxADIA
+MwA0ACwAIABXAGUAcwB0ACAANgA3ACAAUwB0AHIAZQBlAHQALAAgAAsAQwBhAHIAbABpAHMA
+bABlACwAIABNAEEAIAAwADEANwA0ADEALAAgAAsAKAAxADIAMwApAC0ANAA1ADYAIAA3ADgA
+OQAwAC4ADQBEAGEAdABlACAAbwBmACAAQgBpAHIAdABoADoAIAAJADEAcwB0ACAAagB1AG4A
+ZQANAEcAZQBuAGQAZQByADoAIAAJAAkATQBhAGwAZQAJAA0ADQABAA0ATABhAG4AZwB1AGEA
+ZwBlAHMAIABLAG4AbwB3AG4AIAAHAEMALAAgAEMAKwArACwASgBBAFYAQQAsACAALgBOAEUA
+VAAgADMALgA1ACwAIABBAFMAUAAuAE4ARQBUACAAMwAuADUALABWAEIAIAAyADAAMAA4ACwA
+cAB5AHQAaABvAG4ABwAHAEQAQgBNAFMALwBSAEQAQgBNAFMAIAAHAE8AUgBBAEMATABFACwA
+TQBTACAAQQBjAGMAZQBzAHMALAAgAFMAUQBMACwAIABQAG8AcwB0AGcAcgBlAHMAcwAgAFMA
+UQBMAAcABwBXAGUAYgAgAFQAZQBjAGgAbgBvAGwAbwBnAHkABwBIAFQATQBMACwASgBBAFYA
+QQAgAFMAYwByAGkAcAB0AAcABwBPAHAAZQByAGEAdABpAG4AZwAgAFMAeQBzAHQAZQBtAAcA
+VwBpAG4AZABvAHcAcwAgACgAOQA4AC8AMgAwADAANwAvAFgAUAAgAC8AVgBJAFMAVABBACwA
+NwApACwAdQBiAHUAbgB0AHUABwAHAE8AdABoAGUAcgAHAE4AZQB0AHcAbwByAGsAIABQAHIA
+bwBnAHIAYQBtAG0AaQBuAGcAIABpAG4AIABKAGEAdgBhACwAIABVAG4AaQB4ACAAUwBoAGUA
+bABsACAAUAByAG8AZwByAGEAbQBtAGkAbgBnAAcABwAgAA0ADQANAA0AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAWCAAAOAgAADoIAAA8CAAAXAgAANgI
+AADaCAAA3AgAAN4IAADgCAAAAgkAAAQJAADMCgAAzgoAANAKAADSCgAA+goAAPwKAAD+CgAA
+EgsAAGALAABiCwAAbAsAAHwLAAB+CwAAgAsAALgLAAC6CwAAvAsAAL4LAADACwAAwgsAAPn5
+9Ovh2PTMv7bMANisn7aVjoeHf3h4eGu2YfQAVLZhAAAAABlVCAEDauANAAAwSlAAXkoEAE9K
+BABRSgQAEj4qATUIAV5KBABPSgQAUUoEAAAZVQgBA2pACQAAMEpQAF5KBABPSgQAUUoEAAxe
+SgQAT0oEAFFKBAAADzUIAV5KBABPSgQAUUoEAAxDShIAT0oCAFFKAgAADENKEgBPSgUAUUoF
+AAATMEpQAD4qAV5KBABPSgQAUUoEABlVCAEDaqAEAAAwSlAAXkoEAE9KBABRSgQAEkNKEgA+
+KgE1CAFPSgIAUUoCAAAQMEpQAF5KBABPSgQAUUoEAAAZVQgBA2oAAAAAMEpQAF5KBABPSgQA
+UUoEABcwSlAAQ0oUAD4qAV5KBABPSgQAUUoEABBDShQAXkoEAE9KBABRSgQAABNDShQANQgB
+XkoEAE9KBABRSgQAEENKFABtSAAEc0gABG5IAAQACQNqAAAAAFUIAQxDShYAT0oCAFFKAgAg
+wgsAABYMAAAuDAAAUAwAAGoMAACADAAAggwAAIQMAACGDAAAkgwAAKgMAADADAAA0AwAAOgM
+AADyDAAA/gwAABQNAAAqDQAAOg0AAFINAABcDQAAaA0AAH4NAACWDQAApg0AAL4NAADIDQAA
+1A0AAOoNAAAEDgAAFA4AACwOAAA2DgAAQg4AAFgOAABwDgAAgA4AAJgOAACiDgAArg4AAMQO
+AADaDgAA6g4AAAIPAAAMDwAAGA8AABwPAAAeDwAAIA8AACIPAAAmDwAAKA8AACoPAAAsDwAA
+MA8AADIPAAA0DwAANg8AADoPAAA8DwAAPg8AAEAPAABCDwAARA8AAEYPAAD27Ozs7ADn39/Y
+2M/Y2NjY2M/Y2NjY2M/Y2MnY2M/Y2MnY2M/Y2MnY2M/Y2Mnf2NjYvdjY2N/Y2Njf2NjYALCn
+AAAAAAAAAAAAABAwSlAAXkoEAE9KBABRSgQAABlVCAEDaoASAAAwSlAAXkoEAE9KBABRSgQA
+FkNKEgA1CAFhShIAXAgBT0oGAFFKBgAAC1wIAU9KBgBRSgYAEENKFABeSgQAT0oEAFFKBAAA
+DF5KBABPSgQAUUoEAAAPNQgBXkoEAE9KBABRSgQACQNqAAAAAFUIARNDShIANQgBXkoEAE9K
+BABRSgQAEj4qATUIAV5KBABPSgQAUUoEAEBGDwAAbg8AAHIPAAB0DwAAdg8AALAPAACyDwAA
+tA8AAPwPAAD+DwAAABAAADYQAAA4EAAAOhAAAGYQAABoEAAAahAAAJwQAACeEAAAoBAAAM4Q
+AADQEAAA0hAAAPYQAAD4EAAA+hAAAGARAABiEQAAZBEAAJoRAACcEQAAnhEAAMARAADMEQAA
+0hEAAPQRAAASEgAAFBIAAIwSAACqEgAArhIAALISAAC+EgAA0hIAANoSAADeEgAA4BIAAPLm
+4dra4dra4dra4dra4dra4drazcS64dra4drarcS6pdqbpZaNpdqF2qXapQAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9IKgFeSgQAT0oEAFFKBAAQQ0oUAF5KBABPSgQAUUoE
+AAAIT0oGAFFKBgAAE0NKFAA1CAFeSgQAT0oEAFFKBAAPNQgBXkoEAE9KBABRSgQAGVUIAQNq
+wBsAADBKUABeSgQAT0oEAFFKBAASQ0oSAD4qATUIAU9KAgBRSgIAABAwSlAAXkoEAE9KBABR
+SgQAABlVCAEDaiAXAAAwSlAAXkoEAE9KBABRSgQADF5KBABPSgQAUUoEAAAIT0oFAFFKBQAA
+F0NKEgA1CAFeSgIAYUoSAE9KAgBRSgIAGkNKEgA+KgE1CAFeSgIAYUoSAE9KAgBRSgIALuAS
+AADiEgAAAhMAAAYTAABqEwAAhBMAAM4TAADuEwAAEBQAADQUAAB+FAAAjBQAAPQUAAD+FAAA
+8eri3erd193q3eLdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALXAgB
+T0oGAFFKBgAIT0oGAFFKBgAAD15KBABcCAFPSgQAUUoEAAxeSgQAT0oEAFFKBAAAHFUIAQNq
+YCAAADBKUABeSgQAPAgBT0oEAFFKBAANAAgAADgIAAA8CAAA2AgAAAIJAAAECQAAzAoAAM4K
+AAD6CgAAfAsAALgLAAC8CwAAFgwAAC4MAABQDAAA9wAAAAAAAAAAAAAAAPIAAAAAAAAAAAAA
+AADkAAAAAAAAAAAAAAAA1QAAAAAAAAAAAAAAAMYAAAAAAAAAAAAAAAC3AAAAAAAAAAAAAAAA
+sgAAAAAAAAAAAAAAAK0AAAAAAAAAAAAAAACoAAAAAAAAAAAAAAAAowAAAAAAAAAAAAAAAJ4A
+AAAAAAAAAAAAAACZAAAAAAAAAAAAAAAAiwAAAAAAAAAAAAAAAH0AAAAAAAAAAAAAAAAAAAAA
+AAAAAAANAAAWJAFJZgEAAAASZGgBAQADJAFhJAFHJAAADQAAFiQBSWYBAAAAEmRoAQEAAyQB
+YSQBRyQAAAQAABJkaAEBAAAEAAASZGgBAQAABAAAEmRoAQEAAAQAABJkaAEBAAAEAAASZGgB
+AQAABAAAEmRoAQEAAA5aAAMkA2EkA16EAABdhNACYIQAABOkAAAUpAAAAA5aAAMkA2EkA16E
+AABdhNACYIQAABOkAAAUpAAAAA5aAAMkA2EkA16EAABdhKAFYIQAABOkAAAUpAAADlYAAyQB
+YSQBDcYIAAJwCEALAAATpAAAFKQAAAAEXgADJANhJAMAB14AXoSAFl2EAABghNACAA5QDAAA
+agwAAIAMAACCDAAAkgwAAPEAAAAAAAAAAAAAAADjAAAAAAAAAAAAAAAAZgAAAAAAAAAAAAAA
+AFsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAKAAAWJAFJZgEAAAASZGgBAQBHJAAAfAAAFiQBFyQBSWYBAAAA
+CNZcAARi/8ILeBlyH8IkgAAAAAQBAQAEAQEABAEBAAAAAACAAAAABAEBAAQBAQAEAQEAAAAA
+AIAAAAAEAQEABAEBAAQBAQAAAAAAgAAAAAQBAQAEAQEABAEBAAQBAQAJ1ggAAQABAAEAARLW
+KAAAAP/l5eUAAAAAAAD/5eXlAAAAAAAA/+Xl5QAAAAAAAP/l5eUAAABw1igAAAD/5eXlAAAA
+AAAA/+Xl5QAAAAAAAP/l5eUAAAAAAAD/5eXlAAAANNYGAAEBAwAANNYGAAECA2wANNYGAAEE
+AwAANNYGAAEIA2wAAzQAZjQAAA0AABYkAUlmAQAAABJkaAEBAAMkAWEkAUckAAANAAAWJAFJ
+ZgEAAAASZGgBAQADJAFhJAFHJAAABJIMAACUDAAAwAwAAOgMAADyDAAA/gwAAMQAAAAAAAAA
+AAAAAAC5AAAAAAAAAAAAAAAArgAAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAACSAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAFiQBSWYB
+AAAAEmRoAQEAAyQBYSQBRyQAAA0AABYkAUlmAQAAABJkaAEBAAMkAWEkAUckAAAKAAAWJAFJ
+ZgEAAAASZGgBAQBHJAAACgAAFiQBSWYBAAAAEmRoAQEARyQAADoAABYkARckAUlmAQAAAAjW
+GgABYv/CJIAAAAAEAQEABAEBAAQBAQAEAQEACdYCAAAS1goAAAD/AAAA/wAAcNYKAAAA/wAA
+AP8AADTWBgABAQMAADTWBgABAgNsADTWBgABBAMAADTWBgABCANsAAM0AGY0AAAF/gwAAAAN
+AAAqDQAAUg0AAFwNAABoDQAAggAAAAAAAAAAAAAAAHcAAAAAAAAAAAAAAABsAAAAAAAAAAAA
+AAAAXgAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAWJAFJ
+ZgEAAAASZGgBAQADJAFhJAFHJAAADQAAFiQBSWYBAAAAEmRoAQEAAyQBYSQBRyQAAAoAABYk
+AUlmAQAAABJkaAEBAEckAAAKAAAWJAFJZgEAAAASZGgBAQBHJAAAfAAAFiQBFyQBSWYBAAAA
+CNZcAARi/8IL0hlyH8IkgAAAAAQBAQAEAQEABAEBAAAAAACAAAAABAEBAAQBAQAEAQEAAAAA
+AIAAAAAEAQEABAEBAAQBAQAAAAAAgAAAAAQBAQAEAQEABAEBAAQBAQAJ1ggAAAAAAAAAABLW
+KAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AABw1igAAAD/AAAA/wAA
+AAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAANNYGAAEBAwAANNYGAAECA2wANNYGAAEE
+AwAANNYGAAEIA2wAAzQAZjQAAAVoDQAAag0AAJYNAAC+DQAAyA0AANQNAACCAAAAAAAAAAAA
+AAAAdwAAAAAAAAAAAAAAAGwAAAAAAAAAAAAAAABeAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAA0AABYkAUlmAQAAABJkaAEBAAMkAWEkAUckAAANAAAWJAFJ
+ZgEAAAASZGgBAQADJAFhJAFHJAAACgAAFiQBSWYBAAAAEmRoAQEARyQAAAoAABYkAUlmAQAA
+ABJkaAEBAEckAAB8AAAWJAEXJAFJZgEAAAAI1lwABGL/wgvSGXIfwiSAAAAABAEBAAQBAQAE
+AQEAAAAAAIAAAAAEAQEABAEBAAQBAQAAAAAAgAAAAAQBAQAEAQEABAEBAAAAAACAAAAABAEB
+AAQBAQAEAQEABAEBAAnWCAAAAAAAAAAAEtYoAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA
+/wAAAAAA/wAAAP8AAHDWKAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/
+AAA01gYAAQEDAAA01gYAAQIDbAA01gYAAQQDAAA01gYAAQgDbAADNABmNAAABdQNAADWDQAA
+BA4AACwOAAA2DgAAQg4AAIIAAAAAAAAAAAAAAAB3AAAAAAAAAAAAAAAAbAAAAAAAAAAAAAAA
+AF4AAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAFiQBSWYB
+AAAAEmRoAQEAAyQBYSQBRyQAAA0AABYkAUlmAQAAABJkaAEBAAMkAWEkAUckAAAKAAAWJAFJ
+ZgEAAAASZGgBAQBHJAAACgAAFiQBSWYBAAAAEmRoAQEARyQAAHwAABYkARckAUlmAQAAAAjW
+XAAEYv/CC9IZch/CJIAAAAAEAQEABAEBAAQBAQAAAAAAgAAAAAQBAQAEAQEABAEBAAAAAACA
+AAAABAEBAAQBAQAEAQEAAAAAAIAAAAAEAQEABAEBAAQBAQAEAQEACdYIAAAAAAAAAAAS1igA
+AAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAcNYoAAAA/wAAAP8AAAAA
+AP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AADTWBgABAQMAADTWBgABAgNsADTWBgABBAMA
+ADTWBgABCANsAAM0AGY0AAAFQg4AAEQOAABwDgAAmA4AAKIOAACuDgAAggAAAAAAAAAAAAAA
+AHcAAAAAAAAAAAAAAABsAAAAAAAAAAAAAAAAXgAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAANAAAWJAFJZgEAAAASZGgBAQADJAFhJAFHJAAADQAAFiQBSWYB
+AAAAEmRoAQEAAyQBYSQBRyQAAAoAABYkAUlmAQAAABJkaAEBAEckAAAKAAAWJAFJZgEAAAAS
+ZGgBAQBHJAAAfAAAFiQBFyQBSWYBAAAACNZcAARi/8IL0hlyH8IkgAAAAAQBAQAEAQEABAEB
+AAAAAACAAAAABAEBAAQBAQAEAQEAAAAAAIAAAAAEAQEABAEBAAQBAQAAAAAAgAAAAAQBAQAE
+AQEABAEBAAQBAQAJ1ggAAAAAAAAAABLWKAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8A
+AAAAAP8AAAD/AABw1igAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAA
+NNYGAAEBAwAANNYGAAECA2wANNYGAAEEAwAANNYGAAEIA2wAAzQAZjQAAAWuDgAAsA4AANoO
+AAACDwAADA8AABgPAACCAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAGwAAAAAAAAAAAAAAABe
+AAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AABYkAUlmAQAA
+ABJkaAEBAAMkAWEkAUckAAANAAAWJAFJZgEAAAASZGgBAQADJAFhJAFHJAAACgAAFiQBSWYB
+AAAAEmRoAQEARyQAAAoAABYkAUlmAQAAABJkaAEBAEckAAB8AAAWJAEXJAFJZgEAAAAI1lwA
+BGL/wgvSGXIfwiSAAAAABAEBAAQBAQAEAQEAAAAAAIAAAAAEAQEABAEBAAQBAQAAAAAAgAAA
+AAQBAQAEAQEABAEBAAAAAACAAAAABAEBAAQBAQAEAQEABAEBAAnWCAAAAAAAAAAAEtYoAAAA
+/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAHDWKAAAAP8AAAD/AAAAAAD/
+AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAA01gYAAQEDAAA01gYAAQIDbAA01gYAAQQDAAA0
+1gYAAQgDbAADNABmNAAABRgPAAAaDwAAHA8AAB4PAAAgDwAAIg8AAIIAAAAAAAAAAAAAAAB3
+AAAAAAAAAAAAAAAAbAAAAAAAAAAAAAAAAF4AAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAADQAAFiQBSWYBAAAAEmRoAQEAAyQBYSQBRyQAAA0AABYkAUlmAQAA
+ABJkaAEBAAMkAWEkAUckAAAKAAAWJAFJZgEAAAASZGgBAQBHJAAACgAAFiQBSWYBAAAAEmRo
+AQEARyQAAHwAABYkARckAUlmAQAAAAjWXAAEYv/CC9IZch/CJIAAAAAEAQEABAEBAAQBAQAA
+AAAAgAAAAAQBAQAEAQEABAEBAAAAAACAAAAABAEBAAQBAQAEAQEAAAAAAIAAAAAEAQEABAEB
+AAQBAQAEAQEACdYIAAAAAAAAAAAS1igAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAA
+AAD/AAAA/wAAcNYoAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AADTW
+BgABAQMAADTWBgABAgNsADTWBgABBAMAADTWBgABCANsAAM0AGY0AAAFIg8AACQPAAAmDwAA
+KA8AACoPAAAsDwAAggAAAAAAAAAAAAAAAHcAAAAAAAAAAAAAAABsAAAAAAAAAAAAAAAAXgAA
+AAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAWJAFJZgEAAAAS
+ZGgBAQADJAFhJAFHJAAADQAAFiQBSWYBAAAAEmRoAQEAAyQBYSQBRyQAAAoAABYkAUlmAQAA
+ABJkaAEBAEckAAAKAAAWJAFJZgEAAAASZGgBAQBHJAAAfAAAFiQBFyQBSWYBAAAACNZcAARi
+/8IL0hlyH7gkgAAAAAQBAQAEAQEABAEBAAAAAACAAAAABAEBAAQBAQAEAQEAAAAAAIAAAAAE
+AQEABAEBAAQBAQAAAAAAgAAAAAQBAQAEAQEABAEBAAQBAQAJ1ggAAAAAAAAAABLWKAAAAP8A
+AAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AABw1igAAAD/AAAA/wAAAAAA/wAA
+AP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAANNYGAAEBAwAANNYGAAECA2wANNYGAAEEAwAANNYG
+AAEIA2wAAzQAZjQAAAUsDwAALg8AADAPAAAyDwAANA8AADYPAACCAAAAAAAAAAAAAAAAdwAA
+AAAAAAAAAAAAAGwAAAAAAAAAAAAAAABeAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAA0AABYkAUlmAQAAABJkaAEBAAMkAWEkAUckAAANAAAWJAFJZgEAAAAS
+ZGgBAQADJAFhJAFHJAAACgAAFiQBSWYBAAAAEmRoAQEARyQAAAoAABYkAUlmAQAAABJkaAEB
+AEckAAB8AAAWJAEXJAFJZgEAAAAI1lwABGL/wgvSGXIfuCSAAAAABAEBAAQBAQAEAQEAAAAA
+AIAAAAAEAQEABAEBAAQBAQAAAAAAgAAAAAQBAQAEAQEABAEBAAAAAACAAAAABAEBAAQBAQAE
+AQEABAEBAAnWCAAAAAAAAAAAEtYoAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA
+/wAAAP8AAHDWKAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAA01gYA
+AQEDAAA01gYAAQIDbAA01gYAAQQDAAA01gYAAQgDbAADNABmNAAABTYPAAA4DwAAOg8AADwP
+AAA+DwAAQA8AAIIAAAAAAAAAAAAAAAB3AAAAAAAAAAAAAAAAbAAAAAAAAAAAAAAAAF4AAAAA
+AAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAFiQBSWYBAAAAEmRo
+AQEAAyQBYSQBRyQAAA0AABYkAUlmAQAAABJkaAEBAAMkAWEkAUckAAAKAAAWJAFJZgEAAAAS
+ZGgBAQBHJAAACgAAFiQBSWYBAAAAEmRoAQEARyQAAHwAABYkARckAUlmAQAAAAjWXAAEYv/C
+C9IZch+4JIAAAAAEAQEABAEBAAQBAQAAAAAAgAAAAAQBAQAEAQEABAEBAAAAAACAAAAABAEB
+AAQBAQAEAQEAAAAAAIAAAAAEAQEABAEBAAQBAQAEAQEACdYIAAAAAAAAAAAS1igAAAD/AAAA
+/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAcNYoAAAA/wAAAP8AAAAAAP8AAAD/
+AAAAAAD/AAAA/wAAAAAA/wAAAP8AADTWBgABAQMAADTWBgABAgNsADTWBgABBAMAADTWBgAB
+CANsAAM0AGY0AAAFQA8AAEIPAAByDwAAsA8AAPwPAAA2EAAAZhAAAJwQAADOEAAA9hAAAIIA
+AAAAAAAAAAAAAAB9AAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAHMAAAAAAAAAAAAAAABuAAAA
+AAAAAAAAAAAAaQAAAAAAAAAAAAAAAGQAAAAAAAAAAAAAAABfAAAAAAAAAAAAAAAAWgAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAABJkaAEBAAAEAAASZGgBAQAABAAA
+EmRoAQEAAAQAABJkaAEBAAAEAAASZGgBAQAABAAAEmRoAQEAAAQAABJkaAEBAAAEAAASZGgB
+AQAAfAAAFiQBFyQBSWYBAAAACNZcAARi/8IL0hlyH7gkgAAAAAQBAQAEAQEABAEBAAAAAACA
+AAAABAEBAAQBAQAEAQEAAAAAAIAAAAAEAQEABAEBAAQBAQAAAAAAgAAAAAQBAQAEAQEABAEB
+AAQBAQAJ1ggAAAAAAAAAABLWKAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8A
+AAD/AABw1igAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAANNYGAAEB
+AwAANNYGAAECA2wANNYGAAEEAwAANNYGAAEIA2wAAzQAZjQAAAn2EAAAYBEAAJoRAADAEQAA
+9BEAAIwSAAC+EgAA3hIAAOASAADkEgAABhMAAGoTAAD6AAAAAAAAAAAAAAAA9QAAAAAAAAAA
+AAAAAPAAAAAAAAAAAAAAAADoAAAAAAAAAAAAAAAA3QAAAAAAAAAAAAAAANUAAAAAAAAAAAAA
+AADNAAAAAAAAAAAAAAAAxQAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAC1AAAAAAAAAAAAAAAA
+qgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAoAABYkAUlmAQAAABJkaAEBAEckAAAKAAAWJAFJZgEAAAASZGgBAQBHJAAABF4AAyQAYSQA
+AAcAABJkaAEBAAMkA2EkAwAHAAASZGgBAQADJANhJAMABwAAEmRoAQEAAyQDYSQDAAoAABJk
+aAEBAF6EcAhdhAAAYISQ9wAHAAASZGgBAQADJANhJAMABAAAEmRoAQEAAAQAABJkaAEBAAAE
+AAASZGgBAQAAC2oTAABsEwAAhBMAAM4TAADQEwAA7hMAAKwAAAAAAAAAAAAAAAChAAAAAAAA
+AAAAAAAAmQAAAAAAAAAAAAAAAEYAAAAAAAAAAAAAAAA7AAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAFiQBSWYBAAAAEmRoAQEARyQAAFIAABYkARckAUlm
+AQAAAAjWMAACAADeCgIngAAAAAQBAQAEAQEABAEBAAAAAACAAAAABAEBAAQBAQAEAQEABAEB
+AAeUSAEJ1gQAAAAAEtYUAAAA/wAAAP8AAAAAAP8AAAD/AABw1hQAAAD/AAAA/wAAAAAA/wAA
+AP8AADTWBgABAQMAADTWBgABAgNsADTWBgABBAMAADTWBgABCANsAAM0AGY0AAAHAAAWJAFJ
+ZgEAAABHJAAACgAAFiQBSWYBAAAAEmRoAQEARyQAAFIAABYkARckAUlmAQAAAAjWMAACAADe
+CgIngAAAAAQBAQAEAQEABAEBAAAAAACAAAAABAEBAAQBAQAEAQEABAEBAAeUOwEJ1gQAAAAA
+EtYUAAAA/wAAAP8AAAAAAP8AAAD/AABw1hQAAAD/AAAA/wAAAAAA/wAAAP8AADTWBgABAQMA
+ADTWBgABAgNsADTWBgABBAMAADTWBgABCANsAAM0AGY0AAAF7hMAABAUAAASFAAANBQAAH4U
+AACAFAAA9AAAAAAAAAAAAAAAAKEAAAAAAAAAAAAAAACWAAAAAAAAAAAAAAAAiwAAAAAAAAAA
+AAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSAAAWJAEXJAFJZgEA
+AAAI1jAAAgAA3goCJ4AAAAAEAQEABAEBAAQBAQAAAAAAgAAAAAQBAQAEAQEABAEBAAQBAQAH
+lFkBCdYEAAAAABLWFAAAAP8AAAD/AAAAAAD/AAAA/wAAcNYUAAAA/wAAAP8AAAAAAP8AAAD/
+AAA01gYAAQEDAAA01gYAAQIDbAA01gYAAQQDAAA01gYAAQgDbAADNABmNAAACgAAFiQBSWYB
+AAAAEmRoAQEARyQAAAoAABYkAUlmAQAAABJkaAEBAEckAABSAAAWJAEXJAFJZgEAAAAI1jAA
+AgAA3goCJ4AAAAAEAQEABAEBAAQBAQAAAAAAgAAAAAQBAQAEAQEABAEBAAQBAQAHlIEBCdYE
+AAAAABLWFAAAAP8AAAD/AAAAAAD/AAAA/wAAcNYUAAAA/wAAAP8AAAAAAP8AAAD/AAA01gYA
+AQEDAAA01gYAAQIDbAA01gYAAQQDAAA01gYAAQgDbAADNABmNAAACgAAFiQBSWYBAAAAEmRo
+AQEARyQAAAWAFAAAjBQAAPQUAAD2FAAA+hQAAPwUAAD+FAAAABUAAPcAAAAAAAAAAAAAAADv
+AAAAAAAAAAAAAAAAnAAAAAAAAAAAAAAAAJoAAAAAAAAAAAAAAACYAAAAAAAAAAAAAAAAlgAA
+AAAAAAAAAAAAAJEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEXgADJABhJAAAAQAAAAEAAAABAAAAUgAA
+FiQBFyQBSWYBAAAACNYwAAIAAN4KAieAAAAABAEBAAQBAQAEAQEAAAAAAIAAAAAEAQEABAEB
+AAQBAQAEAQEAB5RZAQnWBAAAAAAS1hQAAAD/AAAA/wAAAAAA/wAAAP8AAHDWFAAAAP8AAAD/
+AAAAAAD/AAAA/wAANNYGAAEBAwAANNYGAAECA2wANNYGAAEEAwAANNYGAAEIA2wAAzQAZjQA
+AAcAABYkAUlmAQAAAEckAAAHAAAWJAFJZgEAAABHJAAABzAAH7DQLyCw4D0hsKAFIrCgBSOQ
+0AIkkKAFMlAAADGQaAEwcAAAAAAzUAAAKDIADjAAAG4e8GIBAAAj9Bd8AAAAADYkA5ERAgAQ
+/4lQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAABaPTP9wAAAAlwSFlzAAALEgAACxIB0t1+
+/AAAAQNJREFUeJxjYYACFhDx/vXz/yxwke+f3//n5BVkBIv8BwIQzQgELDAGimZkgF3Lhw8v
+GN6/eI5QISgoidsMrGaCwPfv3//D2B/ePGeQlFViRFFw/8Yxhg+vPwBZP4CYA9MELUNnuL1Y
+rSDoBrwKqmdt/d+S6gUXrJm9jaE1zRvVkT9+/IAw/vzAYQVQAqTox4/v2BWcP70PovsPiCeA
+qgBkXytFvqAEoBiw9fC1/8eu38ep2EpTkcHbVgslRlAMAGlGDk9kAAqhlsX78LsAppCTkxND
+4b3b17AajGEAKKndu30OnKh+MMAiD5SqnxM2AOTHKduvY1UIk8drAHoAEQMojkYAJEdjeTsx
+JnYAAAAASUVORK5CYIIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAA/v8AAAEAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAALVzdWcLhsQk5cIACss+a5EAAAA
+BdXN1ZwuGxCTlwgAKyz5rlwAAAAYAAAAAQAAAAEAAAAQAAAAAgAAAOn9AAAYAAAAAQAAAAEA
+AAAQAAAAAgAAAOn9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSAG8AbwB0ACAARQBuAHQAcgB5AAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAFAP//////////
+AQAAAAYJAgAAAAAAwAAAAAAAAEYAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAACAAgAAAAAAAAEA
+QwBvAG0AcABPAGIAagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAASAAIAAgAAAAUAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAGoAAAAAAAAAAQBPAGwAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAgD/////AwAAAP////8AAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAFAAAAAAAAAAxAFQAYQBiAGwAZQAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgACAAQA
+AAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAACIwAA
+AAAAAEQAYQB0AGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAKAAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAFgAAAP4kAAAAAAAABQBTAHUAbQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEA
+dABpAG8AbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAgAGAAAACAAAAP////8AAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAHAEAAAAAAABXAG8AcgBkAEQA
+bwBjAHUAbQBlAG4AdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+GgACAAcAAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkA
+AACcQQAAAAAAAE8AYgBqAGUAYwB0AFAAbwBvAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAWAAEA////////////////AAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAAAAAAAABQBEAG8AYwB1AG0AZQBuAHQAUwB1AG0A
+bQBhAHIAeQBJAG4AZgBvAHIAbQBhAHQAaQBvAG4AAAAAAAAAAAAAADgAAgD/////////////
+//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAdAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAP7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////
+//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAAAAA
+AAA=
+--------------010903010402010104090709--
diff --git a/addons/hr_recruitment/test/test_hr_recruitment.yml b/addons/hr_recruitment/test/test_hr_recruitment.yml
deleted file mode 100644
index b797353bde2..00000000000
--- a/addons/hr_recruitment/test/test_hr_recruitment.yml
+++ /dev/null
@@ -1,139 +0,0 @@
--
- In order to test hr_recruitment module for OpenERP, I will create applicants form, Manages job positions and the recruitment process.
--
-
- I create a department.
--
- !record {model: hr.department, id: hr_department_rd0}:
- manager_id: base.user_root
- name: 'R & D '
-
--
- I create new Job Position.
--
- !record {model: hr.job, id: hr_job_jea0}:
- department_id: 'hr_department_rd0'
- description: 'Position of Jr. Application Engineer'
- expected_employees: 5
- name: 'JAE '
--
- I create a recruitment stage "Initial Jobs Demand".
--
- !record {model: hr.recruitment.stage, id: hr_recrutiment_stage_first0}:
- name: 'Initial Jobs Demand'
- sequence: 1
--
- I create an applicant.
--
- !record {model: hr.applicant, id: hr_applicant_fresher0}:
- availability: 0.0
- department_id: hr.dep_it
- name: Fresher
- partner_address_id: base.res_partner_address_tang
- partner_id: base.res_partner_asus
- partner_name: Marion Jones
- partner_phone: '1111112223'
- response: 0.0
- job_id: hr.job_jr_developers
- salary_expected: 0.0
- salary_proposed: 0.0
- stage_id: hr_recrutiment_stage_first0
- type_id: hr_recruitment.degree_licenced
-
--
- I check that applicant is on "draft" state.
--
- !assert {model: hr.applicant, id: hr_applicant_fresher0}:
- - state == 'draft'
-
--
- I change the state by click on "In Progress" button.
--
- !python {model: hr.applicant}: |
- self.case_open(cr, uid, [ref("hr_applicant_fresher0")], {"active_ids": [ref("hr_recruitment.menu_crm_case_categ0_act_job")],
- })
--
- I change the stages by clicking on stage next and stage previous buttons.
--
- !python {model: hr.applicant}: |
- self.stage_next(cr, uid, [ref('hr_applicant_fresher0')], None)
- self.stage_previous(cr, uid, [ref('hr_applicant_fresher0')], None)
--
- I create a new case category.
--
- !record {model: crm.case.categ, id: crm_case_categ_employee0}:
- name: 'Employee'
-
--
- I schedule a phonecall for this applicant by click on "Schedule a Phone Call" button.
--
- !record {model: hr.recruitment.job2phonecall, id: hr_recruitment_forinterview0}:
- user_id: base.user_root
- deadline: !eval time.strftime('%Y-%m-%d 11:51:00')
- note: 'For interview.'
- category_id: 'crm_case_categ_employee0'
-
--
- I click on "Schedule phonecall" button of this wizard.
--
- !python {model: hr.recruitment.job2phonecall}: |
- self.make_phonecall(cr, uid, [ref('hr_recruitment_forinterview0')], {'active_ids': [ref('hr_applicant_fresher0')]})
-
--
- I schedule meeting for interview of this applicant by click on "Schedule Meeting" button.
--
- !python {model: hr.applicant}: |
- self.action_makeMeeting(cr, uid, [ref('hr_recruitment_forinterview0')])
--
- I create an entry for the meeting with the applicant.
--
- !record {model: crm.meeting, id: crm_meeting_fresher0}:
- alarm_id: base_calendar.alarm1
- count: 0.0
- date: !eval "(datetime.now() + timedelta(1)).strftime('%Y-%m-%d 00:00:00')"
- date_deadline: !eval "(datetime.now() + timedelta(1)).strftime('%Y-%m-%d 08:00:00')"
- day: 0.0
- duration: 8.0
- name: Fresher
- opportunity_id: crm.crm_case_construstazunits0
- partner_address_id: base.res_partner_address_tang
- partner_id: base.res_partner_asus
- recurrent_uid: 0.0
- rrule_type: none
- state: open
- user_id: base.user_root
--
- I print the survery filled up by the applicant.
--
- !python {model: hr.applicant}: |
- self.action_print_survey(cr, uid, [ref('hr_applicant_fresher0')], None)
--
- I assign the position to the applicant and its relevant department.
--
- !python {model: hr.applicant}: |
- res = self.onchange_job(cr, uid, [ref('hr_applicant_fresher0')], ref('hr.job_jr_developers'), None)
- values = dict([('job_id', ref('hr.job_jr_developers'))] + res['value'].items())
- res1 = self.onchange_department_id(cr, uid, [ref('hr_applicant_fresher0')], ref('hr.dep_it'), None)
- values.update(dict([('department_id', ref('hr.dep_it'))] + res1['value'].items()))
- self.write(cr, uid, [ref('hr_applicant_fresher0')], values, None)
--
- On a successful meeting with the applicant, I hired employee by click on "Hired" button.
--
- !python {model: hired.employee}: |
- self.case_close(cr, uid, [], context={'active_ids': [ref('hr_applicant_fresher0')]})
--
- I check that applicant state is "Hired".
--
- !assert {model: hr.applicant, id: hr_applicant_fresher0}:
- - state == 'done'
--
- I create partner for the hired applicant for accounting purpose.
--
- !record {model: hr.recruitment.partner.create, id: hr_recruitment_partner_create0}:
- close: False
--
- I click on Create Partner button to create a partner for applicant.
--
- !python {model: hr.recruitment.partner.create}: |
- self.make_order(cr, uid, [ref('hr_recruitment_partner_create0')], context={'active_ids': [ref('hr_applicant_fresher0')]})
-
diff --git a/addons/hr_recruitment/wizard/hr_recruitment_employee_hired.py b/addons/hr_recruitment/wizard/hr_recruitment_employee_hired.py
index d11a1f16775..291c16a7644 100644
--- a/addons/hr_recruitment/wizard/hr_recruitment_employee_hired.py
+++ b/addons/hr_recruitment/wizard/hr_recruitment_employee_hired.py
@@ -48,8 +48,7 @@ class hired_employee(osv.osv_memory):
"""
if context is None:
context = {}
- self.pool.get('hr.applicant').case_close_with_emp(cr, uid,context.get('active_ids', []))
- return {}
+ return self.pool.get('hr.applicant').case_close_with_emp(cr, uid,context.get('active_ids', []))
hired_employee()
diff --git a/addons/hr_recruitment/wizard/hr_recruitment_phonecall.py b/addons/hr_recruitment/wizard/hr_recruitment_phonecall.py
index cd9cbea52f7..0f7d30b215a 100644
--- a/addons/hr_recruitment/wizard/hr_recruitment_phonecall.py
+++ b/addons/hr_recruitment/wizard/hr_recruitment_phonecall.py
@@ -88,7 +88,7 @@ class job2phonecall(osv.osv_memory):
id2 = data_obj.browse(cr, uid, id2, context=context).res_id
if id3:
id3 = data_obj.browse(cr, uid, id3, context=context).res_id
-
+ new_phonecall_id = []
for job in job_case_obj.browse(cr, uid, context.get('active_ids', []), context=context):
#TODO: Take other info from job
new_phonecall_id = phonecall_case_obj.create(cr, uid, {
diff --git a/addons/hr_timesheet/__openerp__.py b/addons/hr_timesheet/__openerp__.py
index 76886a45aaf..16331a7a2cf 100644
--- a/addons/hr_timesheet/__openerp__.py
+++ b/addons/hr_timesheet/__openerp__.py
@@ -21,9 +21,9 @@
{
- 'name': 'Human Resources (Timesheet encoding)',
+ 'name': 'Timesheets',
'version': '1.0',
- 'category': 'Hidden',
+ "category": "Human Resources",
'complexity': "easy",
'description': """
This module implements a timesheet system.
diff --git a/addons/hr_timesheet/hr_timesheet_data.xml b/addons/hr_timesheet/hr_timesheet_data.xml
index 5dc95cf9ddc..e9aa56d4646 100644
--- a/addons/hr_timesheet/hr_timesheet_data.xml
+++ b/addons/hr_timesheet/hr_timesheet_data.xml
@@ -2,9 +2,6 @@
-
-
-
TS
@@ -12,5 +9,10 @@
general
+
+
+
+
+
diff --git a/addons/hr_timesheet/report/__init__.py b/addons/hr_timesheet/report/__init__.py
index 98e34ed92d4..8304c90421d 100644
--- a/addons/hr_timesheet/report/__init__.py
+++ b/addons/hr_timesheet/report/__init__.py
@@ -22,3 +22,5 @@
import user_timesheet
import users_timesheet
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_timesheet/report/user_timesheet.py b/addons/hr_timesheet/report/user_timesheet.py
index 533989210d6..7699f94f41b 100644
--- a/addons/hr_timesheet/report/user_timesheet.py
+++ b/addons/hr_timesheet/report/user_timesheet.py
@@ -118,3 +118,5 @@ class report_custom(report_rml):
report_custom('report.hr.analytical.timesheet', 'hr.employee', '', 'addons/hr_timesheet/report/user_timesheet.xsl')
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_timesheet/security/ir.model.access.csv b/addons/hr_timesheet/security/ir.model.access.csv
index 2b2064a89b4..d5f89098a69 100644
--- a/addons/hr_timesheet/security/ir.model.access.csv
+++ b/addons/hr_timesheet/security/ir.model.access.csv
@@ -1,14 +1,14 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_hr_analytic_timesheet","hr.analytic.timesheet","model_hr_analytic_timesheet","base.group_hr_user",1,1,1,1
-"access_hr_analytic_timesheet_employee","hr.analytic.timesheet","model_hr_analytic_timesheet","base.group_user",1,1,1,0
-"access_hr_account_analytic_line","account.account.analytic.line","account.model_account_analytic_line","base.group_hr_user",1,1,1,1
-"access_hr_account_analytic_line_employee","account.account.analytic.line employee","account.model_account_analytic_line","base.group_user",1,1,1,0
-"access_account_analytic_journal","account.account.analytic.journal","account.model_account_analytic_journal","base.group_hr_user",1,1,1,1
-"access_product_product_user","product.product user","product.model_product_product","base.group_hr_user",1,1,1,1
-"access_product_template_hr_timesheet","product.template.hr.timesheet","product.model_product_template","base.group_hr_user",1,1,1,1
-"access_product_uom_hr_timesheet","product.uom.hr.timesheet","product.model_product_uom","base.group_hr_user",1,1,1,1
-"access_account_fiscalyear_hr_user","account.account.fiscalyear.user","account.model_account_fiscalyear","base.group_hr_user",1,1,1,1
-"hr.access_account_journal_view_hruser","account.journal.view hruser","account.model_account_journal_view","base.group_hr_user",1,0,0,0
-"hr.access_account_journal_column_hruser","account.journal.column hruser","account.model_account_journal_column","base.group_hr_user",1,0,0,0
-"access_hr_analytic_timesheet_user","hr.analytic.timesheet.user","model_hr_analytic_timesheet","base.group_user",1,1,1,0
-"access_account_analytic_journal_user","account.account.analytic.journal.user","account.model_account_analytic_journal","base.group_user",1,0,0,0
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_hr_analytic_timesheet,hr.analytic.timesheet,model_hr_analytic_timesheet,base.group_hr_user,1,1,1,1
+access_hr_analytic_timesheet_employee,hr.analytic.timesheet,model_hr_analytic_timesheet,base.group_user,1,1,1,0
+access_hr_account_analytic_line,account.account.analytic.line,account.model_account_analytic_line,base.group_hr_user,1,1,1,1
+access_hr_account_analytic_line_employee,account.account.analytic.line employee,account.model_account_analytic_line,base.group_user,1,1,1,0
+access_account_analytic_journal,account.account.analytic.journal,account.model_account_analytic_journal,base.group_hr_user,1,1,1,1
+access_product_product_user,product.product user,product.model_product_product,base.group_hr_user,1,1,1,1
+access_product_template_hr_timesheet,product.template.hr.timesheet,product.model_product_template,base.group_hr_user,1,1,1,1
+access_product_uom_hr_timesheet,product.uom.hr.timesheet,product.model_product_uom,base.group_hr_user,1,1,1,1
+access_account_fiscalyear_hr_user,account.account.fiscalyear.user,account.model_account_fiscalyear,base.group_hr_user,1,1,1,1
+hr.access_account_journal_view_hruser,account.journal.view hruser,account.model_account_journal_view,base.group_hr_user,1,0,0,0
+hr.access_account_journal_column_hruser,account.journal.column hruser,account.model_account_journal_column,base.group_hr_user,1,0,0,0
+access_hr_analytic_timesheet_user,hr.analytic.timesheet.user,model_hr_analytic_timesheet,base.group_user,1,1,1,0
+access_account_analytic_journal_user,account.account.analytic.journal.user,account.model_account_analytic_journal,base.group_user,1,0,0,0
diff --git a/addons/hr_timesheet_invoice/__openerp__.py b/addons/hr_timesheet_invoice/__openerp__.py
index d4237baf36c..e731f9215ff 100644
--- a/addons/hr_timesheet_invoice/__openerp__.py
+++ b/addons/hr_timesheet_invoice/__openerp__.py
@@ -21,9 +21,9 @@
{
- 'name': 'Invoice on analytic lines',
+ 'name': 'Invoice on Timesheets',
'version': '1.0',
- 'category': 'Hidden/Link',
+ 'category': 'Sales Management',
'description': """Generate your Invoices from Expenses, Timesheet Entries, ...
Module to generate invoices based on costs (human resources, expenses, ...).
============================================================================
diff --git a/addons/hr_timesheet_invoice/board_hr_timesheet_invoice.xml b/addons/hr_timesheet_invoice/board_hr_timesheet_invoice.xml
index 96d91ef3e5c..7327ca66f63 100644
--- a/addons/hr_timesheet_invoice/board_hr_timesheet_invoice.xml
+++ b/addons/hr_timesheet_invoice/board_hr_timesheet_invoice.xml
@@ -17,9 +17,9 @@
form
-
-
-
+
+
+
-->
@@ -31,8 +31,8 @@
form
-
-
+
+
-->
@@ -67,8 +67,8 @@
form
-
-
+
+
diff --git a/addons/hr_timesheet_invoice/hr_timesheet_invoice.py b/addons/hr_timesheet_invoice/hr_timesheet_invoice.py
index 87fb6064a04..19d08f7faf3 100644
--- a/addons/hr_timesheet_invoice/hr_timesheet_invoice.py
+++ b/addons/hr_timesheet_invoice/hr_timesheet_invoice.py
@@ -63,12 +63,12 @@ class account_analytic_account(osv.osv):
_inherit = "account.analytic.account"
_columns = {
- 'pricelist_id': fields.many2one('product.pricelist', 'Sale Pricelist',
+ 'pricelist_id': fields.many2one('product.pricelist', 'Customer Pricelist',
help="The product to invoice is defined on the employee form, the price will be deduced by this pricelist on the product."),
'amount_max': fields.float('Max. Invoice Price'),
'amount_invoiced': fields.function(_invoiced_calc, string='Invoiced Amount',
help="Total invoiced"),
- 'to_invoice': fields.many2one('hr_timesheet_invoice.factor', 'Reinvoice Costs',
+ 'to_invoice': fields.many2one('hr_timesheet_invoice.factor', 'Invoice on Timesheet & Costs',
help="Fill this field if you plan to automatically generate invoices based " \
"on the costs in this analytic account: timesheets, expenses, ..." \
"You can configure an automatic invoice rate on analytic accounts."),
@@ -76,7 +76,16 @@ class account_analytic_account(osv.osv):
_defaults = {
'pricelist_id': lambda self, cr, uid, ctx: ctx.get('pricelist_id', False),
}
-
+ def on_change_partner_id(self, cr, uid, id, partner_id, context={}):
+ res = super(account_analytic_account, self).on_change_partner_id(cr, uid, id, partner_id, context)
+ if (not res.get('value', False)) or not partner_id:
+ return res
+ part = self.pool.get('res.partner').browse(cr, uid, partner_id)
+ pricelist = part.property_product_pricelist and part.property_product_pricelist.id or False
+ if pricelist:
+ res['value']['pricelist_id'] = pricelist
+ return res
+
def set_close(self, cr, uid, ids, context=None):
return self.write(cr, uid, ids, {'state':'close'}, context=context)
diff --git a/addons/hr_timesheet_invoice/hr_timesheet_invoice_view.xml b/addons/hr_timesheet_invoice/hr_timesheet_invoice_view.xml
index 2ce309e0df4..e0652355063 100644
--- a/addons/hr_timesheet_invoice/hr_timesheet_invoice_view.xml
+++ b/addons/hr_timesheet_invoice/hr_timesheet_invoice_view.xml
@@ -7,23 +7,27 @@
form
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -123,7 +127,7 @@
tree,form
[]
{'search_default_to_invoice': 1}
-
+
This list shows you every task you can invoice to the customer. Select the lines and click the Action button to generate the invoices automatically.
+ context="{'search_default_account_id': [active_id]}"
+ id="act_account_analytic_account_2_report_timehsheet_account"
+ name="Timesheets"
+ res_model="hr.analytic.timesheet"
+ src_model="account.analytic.account"/>
', False), ('account_id', 'in', context['active_ids'])], context=context)
+ invs = self.pool.get('account.analytic.line').invoice_cost_create(cr, uid, ids, data, context=context)
mod_obj = self.pool.get('ir.model.data')
- analytic_account_obj = self.pool.get('account.analytic.account')
- res_partner_obj = self.pool.get('res.partner')
- account_payment_term_obj = self.pool.get('account.payment.term')
- invoice_obj = self.pool.get('account.invoice')
- product_obj = self.pool.get('product.product')
- fiscal_pos_obj = self.pool.get('account.fiscal.position')
- invoice_line_obj = self.pool.get('account.invoice.line')
- invoices = []
-
- if context is None:
- context = {}
- result = mod_obj._get_id(cr, uid, 'account', 'view_account_invoice_filter')
- res = mod_obj.read(cr, uid, result, ['res_id'], context=context)
-
- data = self.browse(cr, uid, ids, context=context)[0]
- balance_product = data.balance_product.id
-
- account_ids = 'active_ids' in context and context['active_ids'] or []
-
- for account in analytic_account_obj.browse(cr, uid, account_ids, context=context):
- partner = account.partner_id
- amount_total=0.0
- if (not partner) or not (account.pricelist_id):
- raise osv.except_osv(_('Analytic account incomplete'),
- _('Please fill in the partner and pricelist field '
- 'in the analytic account:\n%s') % (account.name,))
-
- date_due = False
- if partner.property_payment_term:
- pterm_list= account_payment_term_obj.compute(cr, uid,
- partner.property_payment_term.id, value=1,
- date_ref=time.strftime('%Y-%m-%d'))
- if pterm_list:
- pterm_list = [line[0] for line in pterm_list]
- pterm_list.sort()
- date_due = pterm_list[-1]
-
- curr_invoice = {
- 'name': time.strftime('%d/%m/%Y')+' - '+account.name,
- 'partner_id': account.partner_id.id,
- 'address_contact_id': res_partner_obj.address_get(cr, uid, [account.partner_id.id], adr_pref=['contact'])['contact'],
- 'address_invoice_id': res_partner_obj.address_get(cr, uid, [account.partner_id.id], adr_pref=['invoice'])['invoice'],
- 'payment_term': partner.property_payment_term.id or False,
- 'account_id': partner.property_account_receivable.id,
- 'currency_id': account.pricelist_id.currency_id.id,
- 'date_due': date_due,
- 'fiscal_position': account.partner_id.property_account_position.id
- }
- last_invoice = invoice_obj.create(cr, uid, curr_invoice, context=context)
- invoices.append(last_invoice)
-
- context2 = context.copy()
- context2['lang'] = partner.lang
-
- cr.execute("""SELECT
- line.product_id,
- sum(line.amount),
- line.general_account_id,
- line.product_uom_id,
- move_line.ref
- FROM
- account_analytic_line as line
- LEFT JOIN account_move_line as move_line on (line.move_id=move_line.id)
- LEFT JOIN account_analytic_journal as journal on (line.journal_id=journal.id)
- WHERE
- line.account_id = %s AND
- line.move_id IS NOT NULL AND
- journal.type = 'sale'
- GROUP BY
- line.product_id,
- line.general_account_id,
- line.product_uom_id,
- move_line.ref""", (account.id,))
- for product_id, amount, account_id, product_uom_id, ref in cr.fetchall():
- product = product_obj.browse(cr, uid, product_id, context2)
-
- if product:
- taxes = product.taxes_id
- else:
- taxes = []
-
- tax = fiscal_pos_obj.map_tax(cr, uid, account.partner_id.property_account_position, taxes)
- if not account_id:
- raise osv.except_osv(_("Configuration Error"), _("No income account defined for product '%s'") % product.name)
- curr_line = {
- 'price_unit': -amount,
- 'quantity': 1.0,
- 'discount': 0.0,
- 'invoice_line_tax_id': [(6,0,tax)],
- 'invoice_id': last_invoice,
- 'name': ref or '' +(product and ' - '+product.name or ''),
- 'product_id': product_id,
- 'uos_id': product_uom_id,
- 'account_id': account_id,
- 'account_analytic_id': account.id
- }
- invoice_line_obj.create(cr, uid, curr_line, context=context)
-
- if not balance_product:
- raise osv.except_osv(_('Balance product needed'), _('Please fill a Balance product in the wizard'))
- product = product_obj.browse(cr, uid, balance_product, context=context2)
- taxes = product.taxes_id
- tax = fiscal_pos_obj.map_tax(cr, uid, account.partner_id.property_account_position, taxes)
- account_id = product.product_tmpl_id.property_account_income.id or product.categ_id.property_account_income_categ.id
- if not account_id:
- raise osv.except_osv(_("Configuration Error"), _("No income account defined for product '%s'") % product.name)
- curr_line = {
- 'price_unit': account.amount_max - amount_total,
- 'quantity': 1.0,
- 'discount': 0.0,
- 'invoice_line_tax_id': [(6,0,tax)],
- 'invoice_id': last_invoice,
- 'name': product.name,
- 'product_id': product.id,
- 'uos_id': product.uom_id.id,
- 'account_id': account_id,
- 'account_analytic_id': account.id
- }
- invoice_line_obj.create(cr, uid, curr_line, context=context)
- if account.amount_max < amount_total:
- invoice_obj.write(cr, uid, [last_invoice], {'type': 'out_refund',}, context=context)
- cr.execute('update account_analytic_line set invoice_id=%s where invoice_id is null and account_id=%s', (last_invoice, account.id))
-
- return {
- 'domain': "[('id','in', ["+','.join(map(str,invoices))+"])]",
- 'name': 'Invoices',
- 'view_type': 'form',
- 'view_mode': 'tree,form',
- 'res_model': 'account.invoice',
- 'view_id': False,
- 'context': "{'type':'out_invoice'}",
- 'type': 'ir.actions.act_window',
- 'search_view_id': res['res_id']
- }
+ act_obj = self.pool.get('ir.actions.act_window')
+ mod_ids = mod_obj.search(cr, uid, [('name', '=', 'action_invoice_tree1')], context=context)[0]
+ res_id = mod_obj.read(cr, uid, mod_ids, ['res_id'], context=context)['res_id']
+ act_win = act_obj.read(cr, uid, res_id, [], context=context)
+ act_win['domain'] = [('id','in',invs),('type','=','out_invoice')]
+ act_win['name'] = _('Invoices')
+ return act_win
final_invoice_create()
diff --git a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py
index 502d35ff2d1..134bde8a872 100644
--- a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py
+++ b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py
@@ -27,43 +27,18 @@ from tools.translate import _
## Create an invoice based on selected timesheet lines
#
-#
-# TODO: check unit of measure !!!
-#
-class hr_timesheet_invoice_create(osv.osv_memory):
+class account_analytic_line(osv.osv):
+ _inherit = "account.analytic.line"
- _name = 'hr.timesheet.invoice.create'
- _description = 'Create invoice from timesheet'
- _columns = {
- 'date': fields.boolean('Date', help='The real date of each work will be displayed on the invoice'),
- 'time': fields.boolean('Time spent', help='The time of each work done will be displayed on the invoice'),
- 'name': fields.boolean('Description', help='The detail of each work done will be displayed on the invoice'),
- 'price': fields.boolean('Cost', help='The cost of each work done will be displayed on the invoice. You probably don\'t want to check this'),
- 'product': fields.many2one('product.product', 'Product', help='Complete this field only if you want to force to use a specific product. Keep empty to use the real product that comes from the cost.'),
- }
-
- _defaults = {
- 'date': lambda *args: 1,
- 'name': lambda *args: 1
- }
-
- def view_init(self, cr, uid, fields, context=None):
- """
- This function checks for precondition before wizard executes
- @param self: The object pointer
- @param cr: the current row, from the database cursor,
- @param uid: the current user’s ID for security checks,
- @param fields: List of fields for default value
- @param context: A standard dictionary for contextual values
- """
- analytic_obj = self.pool.get('account.analytic.line')
- data = context and context.get('active_ids', [])
- for analytic in analytic_obj.browse(cr, uid, data, context=context):
- if analytic.invoice_id:
- raise osv.except_osv(_('Warning !'), _("Invoice is already linked to some of the analytic line(s)!"))
-
- def do_create(self, cr, uid, ids, context=None):
- mod_obj = self.pool.get('ir.model.data')
+ #
+ # data = {
+ # 'date': boolean
+ # 'time': boolean
+ # 'name': boolean
+ # 'price': boolean
+ # 'product': many2one id
+ # }
+ def invoice_cost_create(self, cr, uid, ids, data={}, context=None):
analytic_account_obj = self.pool.get('account.analytic.account')
res_partner_obj = self.pool.get('res.partner')
account_payment_term_obj = self.pool.get('account.payment.term')
@@ -77,11 +52,9 @@ class hr_timesheet_invoice_create(osv.osv_memory):
invoices = []
if context is None:
context = {}
- result = mod_obj._get_id(cr, uid, 'account', 'view_account_invoice_filter')
- data = self.read(cr, uid, ids, [], context=context)[0]
account_ids = {}
- for line in self.pool.get('account.analytic.line').browse(cr, uid, context['active_ids'], context=context):
+ for line in self.pool.get('account.analytic.line').browse(cr, uid, ids, context=context):
account_ids[line.account_id.id] = True
account_ids = account_ids.keys() #data['accounts']
@@ -127,7 +100,7 @@ class hr_timesheet_invoice_create(osv.osv_memory):
"FROM account_analytic_line as line " \
"WHERE account_id = %s " \
"AND id IN %s AND to_invoice IS NOT NULL " \
- "GROUP BY product_id,to_invoice,product_uom_id", (account.id, tuple(context['active_ids']),))
+ "GROUP BY product_id,to_invoice,product_uom_id", (account.id, tuple(ids),))
for product_id, factor_id, qty, uom in cr.fetchall():
product = product_obj.browse(cr, uid, product_id, context2)
@@ -135,7 +108,7 @@ class hr_timesheet_invoice_create(osv.osv_memory):
raise osv.except_osv(_('Error'), _('At least one line has no product !'))
factor_name = ''
factor = invoice_factor_obj.browse(cr, uid, factor_id, context2)
- if not data['product']:
+ if not data.get('product', False):
if factor.customer_name:
factor_name = product.name+' - '+factor.customer_name
else:
@@ -148,7 +121,7 @@ class hr_timesheet_invoice_create(osv.osv_memory):
ctx.update({'uom':uom})
if account.pricelist_id:
pl = account.pricelist_id.id
- price = pro_price_obj.price_get(cr,uid,[pl], data['product'] or product_id, qty or 1.0, account.partner_id.id, context=ctx)[pl]
+ price = pro_price_obj.price_get(cr,uid,[pl], data.get('product', False) or product_id, qty or 1.0, account.partner_id.id, context=ctx)[pl]
else:
price = 0.0
@@ -164,7 +137,7 @@ class hr_timesheet_invoice_create(osv.osv_memory):
'invoice_line_tax_id': [(6,0,tax )],
'invoice_id': last_invoice,
'name': factor_name,
- 'product_id': data['product'] or product_id,
+ 'product_id': data.get('product',product_id),
'invoice_line_tax_id': [(6,0,tax)],
'uos_id': uom,
'account_id': account_id,
@@ -174,37 +147,76 @@ class hr_timesheet_invoice_create(osv.osv_memory):
#
# Compute for lines
#
- cr.execute("SELECT * FROM account_analytic_line WHERE account_id = %s and id IN %s AND product_id=%s and to_invoice=%s ORDER BY account_analytic_line.date", (account.id, tuple(context['active_ids']), product_id, factor_id))
+ cr.execute("SELECT * FROM account_analytic_line WHERE account_id = %s and id IN %s AND product_id=%s and to_invoice=%s ORDER BY account_analytic_line.date", (account.id, tuple(ids), product_id, factor_id))
line_ids = cr.dictfetchall()
note = []
for line in line_ids:
# set invoice_line_note
details = []
- if data['date']:
+ if data.get('date', False):
details.append(line['date'])
- if data['time']:
+ if data.get('time', False):
if line['product_uom_id']:
details.append("%s %s" % (line['unit_amount'], product_uom_obj.browse(cr, uid, [line['product_uom_id']],context2)[0].name))
else:
details.append("%s" % (line['unit_amount'], ))
- if data['name']:
+ if data.get('name', False):
details.append(line['name'])
note.append(u' - '.join(map(lambda x: unicode(x) or '',details)))
curr_line['note'] = "\n".join(map(lambda x: unicode(x) or '',note))
invoice_line_obj.create(cr, uid, curr_line, context=context)
- cr.execute("update account_analytic_line set invoice_id=%s WHERE account_id = %s and id IN %s", (last_invoice, account.id, tuple(context['active_ids'])))
+ cr.execute("update account_analytic_line set invoice_id=%s WHERE account_id = %s and id IN %s", (last_invoice, account.id, tuple(ids)))
invoice_obj.button_reset_taxes(cr, uid, [last_invoice], context)
+ return invoices
+#
+# TODO: check unit of measure !!!
+#
+
+class hr_timesheet_invoice_create(osv.osv_memory):
+
+ _name = 'hr.timesheet.invoice.create'
+ _description = 'Create invoice from timesheet'
+ _columns = {
+ 'date': fields.boolean('Date', help='The real date of each work will be displayed on the invoice'),
+ 'time': fields.boolean('Time spent', help='The time of each work done will be displayed on the invoice'),
+ 'name': fields.boolean('Description', help='The detail of each work done will be displayed on the invoice'),
+ 'price': fields.boolean('Cost', help='The cost of each work done will be displayed on the invoice. You probably don\'t want to check this'),
+ 'product': fields.many2one('product.product', 'Product', help='Complete this field only if you want to force to use a specific product. Keep empty to use the real product that comes from the cost.'),
+ }
+
+ _defaults = {
+ 'date': lambda *args: 1,
+ 'name': lambda *args: 1
+ }
+
+ def view_init(self, cr, uid, fields, context=None):
+ """
+ This function checks for precondition before wizard executes
+ @param self: The object pointer
+ @param cr: the current row, from the database cursor,
+ @param uid: the current user’s ID for security checks,
+ @param fields: List of fields for default value
+ @param context: A standard dictionary for contextual values
+ """
+ analytic_obj = self.pool.get('account.analytic.line')
+ data = context and context.get('active_ids', [])
+ for analytic in analytic_obj.browse(cr, uid, data, context=context):
+ if analytic.invoice_id:
+ raise osv.except_osv(_('Warning !'), _("Invoice is already linked to some of the analytic line(s)!"))
+
+ def do_create(self, cr, uid, ids, context=None):
+ data = self.read(cr, uid, ids, [], context=context)[0]
+ invs = self.pool.get('account.analytic.line').invoice_cost_create(cr, uid, context['active_ids'], data, context=context)
mod_obj = self.pool.get('ir.model.data')
act_obj = self.pool.get('ir.actions.act_window')
-
mod_ids = mod_obj.search(cr, uid, [('name', '=', 'action_invoice_tree1')], context=context)[0]
res_id = mod_obj.read(cr, uid, mod_ids, ['res_id'], context=context)['res_id']
act_win = act_obj.read(cr, uid, res_id, [], context=context)
- act_win['domain'] = [('id','in',invoices),('type','=','out_invoice')]
+ act_win['domain'] = [('id','in',invs),('type','=','out_invoice')]
act_win['name'] = _('Invoices')
return act_win
diff --git a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create_final_view.xml b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create_final_view.xml
index b45deeae8a2..514996816cc 100644
--- a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create_final_view.xml
+++ b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create_final_view.xml
@@ -1,49 +1,49 @@
-
-
- hr.timesheet.invoice.create.final.form
- hr.timesheet.invoice.create.final
- form
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Final Invoice
+ Create Invoice
ir.actions.act_window
hr.timesheet.invoice.create.final
form
form
new
+
-
+
-
- Final Invoice
+ Invoice
client_action_multi
action
account.analytic.account
-
+
+
+ hr.timesheet.invoice.create.final.form
+ hr.timesheet.invoice.create.final
+ form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create_view.xml b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create_view.xml
index 1696710b712..60b60e88550 100644
--- a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create_view.xml
+++ b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create_view.xml
@@ -43,7 +43,6 @@
-
Create Invoice
client_action_multi
diff --git a/addons/hr_timesheet_sheet/__openerp__.py b/addons/hr_timesheet_sheet/__openerp__.py
index 403d435df71..7299e283d6d 100644
--- a/addons/hr_timesheet_sheet/__openerp__.py
+++ b/addons/hr_timesheet_sheet/__openerp__.py
@@ -21,7 +21,7 @@
{
- 'name': 'Timesheets',
+ 'name': 'Timesheets Validation',
'version': '1.0',
'category': 'Human Resources',
'description': """
@@ -69,5 +69,6 @@ The validation can be configured in the company:
'installable': True,
'active': False,
'certificate': '0073297700829',
+ 'application': True,
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_timesheet_sheet/board_hr_timesheet_view.xml b/addons/hr_timesheet_sheet/board_hr_timesheet_view.xml
index fd9b27f42aa..74530b81859 100644
--- a/addons/hr_timesheet_sheet/board_hr_timesheet_view.xml
+++ b/addons/hr_timesheet_sheet/board_hr_timesheet_view.xml
@@ -40,8 +40,8 @@
form
-
-
+
+
diff --git a/addons/hr_timesheet_sheet/report/hr_timesheet_report.py b/addons/hr_timesheet_sheet/report/hr_timesheet_report.py
index d20ad3a5f4c..49b18f75e4b 100644
--- a/addons/hr_timesheet_sheet/report/hr_timesheet_report.py
+++ b/addons/hr_timesheet_sheet/report/hr_timesheet_report.py
@@ -80,3 +80,5 @@ class hr_timesheet_report(osv.osv):
)
""")
hr_timesheet_report()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml b/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml
index 96151786676..11915fb64c9 100644
--- a/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml
+++ b/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml
@@ -41,11 +41,12 @@
-
-
+
@@ -90,7 +91,7 @@
hr.timesheet.report
form
tree,graph
- {'search_default_month':1,'search_default_group_user_id':1,'group_by_no_leaf':1,'group_by':[]}
+ {'search_default_year':1,'search_default_month':1,'search_default_group_user_id':1,'group_by_no_leaf':1,'group_by':[]}
This report performs analysis on timesheets created by your human resources in the system. It allows you to have a full overview of entries done by your employees. You can group them by specific selection criteria thanks to the search tool.
-
+
timesheet.report
form
tree,graph
- {'search_default_month':1,'search_default_User_id':1,'group_by_no_leaf':1,'group_by':[]}
+ {'search_default_year':1,'search_default_month':1,'search_default_User_id':1,'group_by_no_leaf':1,'group_by':[]}
Ideas
-
diff --git a/addons/idea/security/ir.model.access.csv b/addons/idea/security/ir.model.access.csv
index b76cc9bd58a..989530277f6 100644
--- a/addons/idea/security/ir.model.access.csv
+++ b/addons/idea/security/ir.model.access.csv
@@ -1,8 +1,7 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_idea_category_user","idea.category user","model_idea_category","base.group_tool_user",1,1,1,1
-"access_idea_idea_user","idea.idea user","model_idea_idea","base.group_tool_user",1,1,1,1
-"access_idea_vote_user","idea.vote user","model_idea_vote","base.group_tool_user",1,1,1,1
-"access_idea_vote_manager","idea.vote manager","model_idea_vote","base.group_tool_manager",1,1,1,1
-"access_idea_vote_stat_user","idea.vote.stat user","model_idea_vote_stat","base.group_tool_user",1,1,1,1
-"access_idea_comment_user","idea.comment user","model_idea_comment","base.group_tool_user",1,1,1,1
-"access_report_vote_manager","report.vote manager","model_report_vote","base.group_tool_manager",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_idea_category_user,idea.category user,model_idea_category,base.group_tool_user,1,1,1,1
+access_idea_idea_user,idea.idea user,model_idea_idea,base.group_tool_user,1,1,1,1
+access_idea_vote_user,idea.vote user,model_idea_vote,base.group_tool_user,1,1,1,1
+access_idea_vote_stat_user,idea.vote.stat user,model_idea_vote_stat,base.group_tool_user,1,1,1,1
+access_idea_comment_user,idea.comment user,model_idea_comment,base.group_tool_user,1,1,1,1
+access_report_vote_manager,report.vote manager,model_report_vote,base.group_tool_manager,1,1,1,1
diff --git a/addons/import_base/__init__.py b/addons/import_base/__init__.py
index 0a5d7fb20b7..52366e5128a 100644
--- a/addons/import_base/__init__.py
+++ b/addons/import_base/__init__.py
@@ -20,4 +20,6 @@
##############################################################################
import import_framework
-import mapper
\ No newline at end of file
+import mapper
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/import_base/__openerp__.py b/addons/import_base/__openerp__.py
index 6d4f4374dfe..742e16dfe80 100644
--- a/addons/import_base/__openerp__.py
+++ b/addons/import_base/__openerp__.py
@@ -20,9 +20,9 @@
##############################################################################
{
- 'name': 'Base framework for module that need to import complex data',
+ 'name': 'Framework for complex import',
'version': '0.9',
- 'category': 'Hidden',
+ 'category': 'Hidden/Dependency',
'description': """
This module provide a class import_framework to help importing
complex data from other software
@@ -37,3 +37,5 @@
'installable': True,
'active': False,
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/import_base/import_framework.py b/addons/import_base/import_framework.py
index 1f627d2ad58..ecc5f54e461 100644
--- a/addons/import_base/import_framework.py
+++ b/addons/import_base/import_framework.py
@@ -498,3 +498,5 @@ class import_framework(Thread):
def intialize_test(self):
pass
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/import_base/mapper.py b/addons/import_base/mapper.py
index 0827509ffab..d68447ad3dd 100644
--- a/addons/import_base/mapper.py
+++ b/addons/import_base/mapper.py
@@ -167,3 +167,5 @@ class call(mapper):
else:
args.append(arg)
return self.fun(external_values, *args)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/import_google/__openerp__.py b/addons/import_google/__openerp__.py
index a0a15756ec3..fe469c94504 100644
--- a/addons/import_google/__openerp__.py
+++ b/addons/import_google/__openerp__.py
@@ -42,6 +42,5 @@
],
'installable': True,
'active': False,
- 'certificate': '',
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/import_google/security/ir.model.access.csv b/addons/import_google/security/ir.model.access.csv
index 50b689efa69..cb0a8946d46 100644
--- a/addons/import_google/security/ir.model.access.csv
+++ b/addons/import_google/security/ir.model.access.csv
@@ -1,5 +1,4 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_res_users_partner_manager","google.res.partner.manager","base.model_ir_model_data","base.group_partner_manager",1,1,1,0
-"access_ir_model_data_partner_manager","ir.model.data.partner.manager","base.model_res_users","base.group_partner_manager",1,1,0,0
-"access_google_import_message_partner_manager","google.import.message.partner.manager","model_google_import_message","base.group_partner_manager",1,1,0,0
-
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_res_users_partner_manager,google.res.partner.manager,base.model_ir_model_data,base.group_partner_manager,1,1,1,0
+access_ir_model_data_partner_manager,ir.model.data.partner.manager,base.model_res_users,base.group_partner_manager,1,1,0,0
+access_google_import_message_partner_manager,google.import.message.partner.manager,model_google_import_message,base.group_partner_manager,1,1,0,0
diff --git a/addons/import_google/wizard/google_import_message.py b/addons/import_google/wizard/google_import_message.py
index 5e2b2b6f4b1..bba58cd2250 100644
--- a/addons/import_google/wizard/google_import_message.py
+++ b/addons/import_google/wizard/google_import_message.py
@@ -40,3 +40,5 @@ class google_import_message(osv.osv):
return res
google_import_message()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/import_google/wizard/import_google.py b/addons/import_google/wizard/import_google.py
index 87155c806c6..936a6d17649 100644
--- a/addons/import_google/wizard/import_google.py
+++ b/addons/import_google/wizard/import_google.py
@@ -353,3 +353,5 @@ class google_import(import_framework):
}
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/import_sugarcrm/__init__.py b/addons/import_sugarcrm/__init__.py
index 250589105b0..8fdd9aec302 100644
--- a/addons/import_sugarcrm/__init__.py
+++ b/addons/import_sugarcrm/__init__.py
@@ -23,3 +23,5 @@ import import_sugarcrm
import sugar
import wizard
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/import_sugarcrm/__openerp__.py b/addons/import_sugarcrm/__openerp__.py
index 927a4b542ed..093331a1bbe 100644
--- a/addons/import_sugarcrm/__openerp__.py
+++ b/addons/import_sugarcrm/__openerp__.py
@@ -20,7 +20,7 @@
##############################################################################
{
- 'name': 'Import Data from SugarCRM',
+ 'name': 'SugarCRM Import',
'version': '1.0',
'category': 'Customer Relationship Management',
'description': """This Module Import SugarCRM "Leads", "Opportunities", "Users", "Accounts",
@@ -28,10 +28,12 @@
'author': 'OpenERP SA',
'website': 'http://www.openerp.com',
'depends': ['import_base','crm', 'document'],
- 'init_xml': [],
- 'update_xml': ["wizard/import_message_view.xml",
- "import_sugarcrm_view.xml"],
- 'demo_xml': [],
+ 'data': [
+ "wizard/import_message_view.xml",
+ "import_sugarcrm_view.xml",
+ "security/ir.model.access.csv",
+ ],
+ 'demo': [],
'test': [],
'installable': True,
'active': False,
diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py
index d5f487c5377..b3908be0050 100644
--- a/addons/import_sugarcrm/import_sugarcrm.py
+++ b/addons/import_sugarcrm/import_sugarcrm.py
@@ -1147,3 +1147,5 @@ class import_sugarcrm(osv.osv):
}
import_sugarcrm()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/import_sugarcrm/import_sugarcrm_view.xml b/addons/import_sugarcrm/import_sugarcrm_view.xml
index 1f12a8fde57..3c1f9df60fb 100644
--- a/addons/import_sugarcrm/import_sugarcrm_view.xml
+++ b/addons/import_sugarcrm/import_sugarcrm_view.xml
@@ -1,105 +1,104 @@
-
+
-
- import.sugarcrm.form
- import.sugarcrm
- form
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ import.sugarcrm.form
+ import.sugarcrm
+ form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
- Import SugarCRM
- import.sugarcrm
- form
- tree,form
-
- new
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+ Import SugarCRM
+ import.sugarcrm
+ form
+ tree,form
+
+ new
+
+
+
-
+
-
diff --git a/addons/import_sugarcrm/security/ir.model.access.csv b/addons/import_sugarcrm/security/ir.model.access.csv
new file mode 100644
index 00000000000..5aadbf32950
--- /dev/null
+++ b/addons/import_sugarcrm/security/ir.model.access.csv
@@ -0,0 +1,3 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_import_sugarcrm_system,import.sugarcrm system,model_import_sugarcrm,base.group_system,1,1,1,1
+access_import_message_system,import.message system,model_import_message,base.group_system,1,1,1,1
diff --git a/addons/import_sugarcrm/sugar.py b/addons/import_sugarcrm/sugar.py
index 4ce5e0048ea..35103a41173 100644
--- a/addons/import_sugarcrm/sugar.py
+++ b/addons/import_sugarcrm/sugar.py
@@ -176,3 +176,5 @@ def search(portType, sessionid, module_name, offset, max_results, query=None, or
ans_list.append(ans_dir)
#end for
return ans_list
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/import_sugarcrm/sugarsoap_services.py b/addons/import_sugarcrm/sugarsoap_services.py
index a80102e5081..b42eb4041c1 100644
--- a/addons/import_sugarcrm/sugarsoap_services.py
+++ b/addons/import_sugarcrm/sugarsoap_services.py
@@ -1418,3 +1418,5 @@ class get_attendee_listResponse:
self._return = None
return
get_attendee_listResponse.typecode.pyclass = get_attendee_listResponse
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/import_sugarcrm/sugarsoap_services_types.py b/addons/import_sugarcrm/sugarsoap_services_types.py
index acd22bbb97f..182e9ce4c37 100644
--- a/addons/import_sugarcrm/sugarsoap_services_types.py
+++ b/addons/import_sugarcrm/sugarsoap_services_types.py
@@ -644,3 +644,5 @@ class ns0:
self.pyclass = Holder
# end class ns0 (tns: http://www.sugarcrm.com/sugarcrm)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/import_sugarcrm/wizard/__init__.py b/addons/import_sugarcrm/wizard/__init__.py
index 6910c3981bd..08b611401b1 100644
--- a/addons/import_sugarcrm/wizard/__init__.py
+++ b/addons/import_sugarcrm/wizard/__init__.py
@@ -20,3 +20,5 @@
##############################################################################
import import_message
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/import_sugarcrm/wizard/import_message.py b/addons/import_sugarcrm/wizard/import_message.py
index 7c9f1703282..1d2e765580b 100644
--- a/addons/import_sugarcrm/wizard/import_message.py
+++ b/addons/import_sugarcrm/wizard/import_message.py
@@ -27,3 +27,5 @@ class import_message(osv.osv):
_description = __doc__
import_message()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/knowledge/__openerp__.py b/addons/knowledge/__openerp__.py
index 2ca58e9861f..e37419ffcaf 100644
--- a/addons/knowledge/__openerp__.py
+++ b/addons/knowledge/__openerp__.py
@@ -21,11 +21,11 @@
{
- "name" : "Knowledge Management System",
+ "name" : "Document Management System",
"version" : "1.0",
"depends" : ["base","base_setup"],
"author" : "OpenERP SA",
- "category": 'Hidden',
+ 'category': 'Hidden/Dependency',
'complexity': "easy",
"description": """
Installer for knowledge-based Hidden.
diff --git a/addons/knowledge/security/ir.model.access.csv b/addons/knowledge/security/ir.model.access.csv
index 7a057fcfcbe..34255019afe 100644
--- a/addons/knowledge/security/ir.model.access.csv
+++ b/addons/knowledge/security/ir.model.access.csv
@@ -1,4 +1,3 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_ir_attachment_sale_manager","ir_attachment manager","base.model_ir_attachment","base.group_sale_manager",1,1,1,1
-"access_ir_attachment_partner_manager","ir_attachment_partner manager","base.model_ir_attachment","base.group_partner_manager",1,1,1,1
-
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_ir_attachment_sale_manager,ir_attachment manager,base.model_ir_attachment,base.group_sale_manager,1,1,1,1
+access_ir_attachment_partner_manager,ir_attachment_partner manager,base.model_ir_attachment,base.group_partner_manager,1,1,1,1
diff --git a/addons/l10n_at/__init__.py b/addons/l10n_at/__init__.py
index b3516a699d9..a295fe1bd73 100644
--- a/addons/l10n_at/__init__.py
+++ b/addons/l10n_at/__init__.py
@@ -19,4 +19,6 @@
#
##############################################################################
-import account_wizard
\ No newline at end of file
+import account_wizard
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_at/__openerp__.py b/addons/l10n_at/__openerp__.py
index d28598c1ed2..4cc109f814a 100644
--- a/addons/l10n_at/__openerp__.py
+++ b/addons/l10n_at/__openerp__.py
@@ -20,11 +20,11 @@
##############################################################################
{
- "name" : "Austria - Chart of Accounts",
+ "name" : "Austria - Accounting",
"version" : "1.0",
"author" : "conexus.at",
- "website" : "http://www.conexus.at",
- "category" : "Localization/Account Charts",
+ "website" : "http://www.conexus.at",
+ "category" : "Localization",
"depends" : ["account_chart", 'base_vat'],
"description": "This module provides the standard Accounting Chart for Austria which is based on the Template from BMF.gv.at. Please keep in mind that you should review and adapt it with your Accountant, before using it in a live Environment.",
"demo_xml" : [],
@@ -33,3 +33,5 @@
"installable": True
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_at/account_wizard.py b/addons/l10n_at/account_wizard.py
index cf63b2c5dc3..15b0735b9ca 100644
--- a/addons/l10n_at/account_wizard.py
+++ b/addons/l10n_at/account_wizard.py
@@ -32,3 +32,5 @@ class AccountWizard_cd(osv.osv_memory):
AccountWizard_cd()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_be/__openerp__.py b/addons/l10n_be/__openerp__.py
index 26c9837a8bf..e4bdeccbd75 100644
--- a/addons/l10n_be/__openerp__.py
+++ b/addons/l10n_be/__openerp__.py
@@ -18,9 +18,9 @@
# along with this program. If not, see .
#
##############################################################################
-{ 'name': 'Belgium - Plan Comptable Minimum Normalise',
+{ 'name': 'Belgium - Accounting',
'version': '1.1',
- 'category': 'Localization/Account Charts',
+ 'category': 'Localization',
'description': """
This is the base module to manage the accounting chart for Belgium in OpenERP.
==============================================================================
@@ -42,27 +42,27 @@ Wizards provided by this module:
""",
'author': 'OpenERP SA',
'depends': [
- 'account',
- 'base_vat',
- 'base_iban',
- 'account_chart',
- 'account_coda',
- ],
+ 'account',
+ 'base_vat',
+ 'base_iban',
+ 'account_chart',
+ 'account_coda',
+ ],
'init_xml': [],
'update_xml': [
- 'account_pcmn_belgium.xml',
- 'account_tax_code_template.xml',
- 'account_chart_template.xml',
- 'account_tax_template.xml',
- 'l10n_be_wizard.xml',
- 'wizard/l10n_be_account_vat_declaration_view.xml',
- 'wizard/l10n_be_vat_intra_view.xml',
- 'wizard/l10n_be_partner_vat_listing.xml',
- 'l10n_be_sequence.xml',
- 'fiscal_templates.xml',
- 'account_fiscal_position_tax_template.xml',
- 'security/ir.model.access.csv'
- ],
+ 'account_pcmn_belgium.xml',
+ 'account_tax_code_template.xml',
+ 'account_chart_template.xml',
+ 'account_tax_template.xml',
+ 'wizard/l10n_be_account_vat_declaration_view.xml',
+ 'wizard/l10n_be_vat_intra_view.xml',
+ 'wizard/l10n_be_partner_vat_listing.xml',
+ 'l10n_be_sequence.xml',
+ 'fiscal_templates.xml',
+ 'account_fiscal_position_tax_template.xml',
+ 'security/ir.model.access.csv',
+ 'l10n_be_wizard.yml'
+ ],
'demo_xml': [],
'installable': True,
'certificate': '0031977724637',
diff --git a/addons/l10n_be/l10n_be_wizard.xml b/addons/l10n_be/l10n_be_wizard.xml
deleted file mode 100644
index 194e2881d1b..00000000000
--- a/addons/l10n_be/l10n_be_wizard.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
- automatic
-
-
-
-
diff --git a/addons/l10n_be/l10n_be_wizard.yml b/addons/l10n_be/l10n_be_wizard.yml
new file mode 100644
index 00000000000..5acc10c629f
--- /dev/null
+++ b/addons/l10n_be/l10n_be_wizard.yml
@@ -0,0 +1,19 @@
+-
+ !record {model: ir.actions.todo, id: config_call_account_template}:
+ action_id: account.action_wizard_multi_chart
+ category_id: account.category_accounting_configuration
+ type: automatic
+-
+ !python {model: ir.actions.todo}: |
+ install_todo = self.browse(cr, uid, ref('l10n_be.config_call_account_template'))
+ if install_todo.state == 'open':
+ wiz = self.pool.get('wizard.multi.charts.accounts')
+ values = {
+ 'chart_template_id': ref('l10n_be.l10nbe_chart_template')
+ }
+ values.update(
+ wiz.onchange_chart_template_id(cr, uid, False, ref('l10n_be.l10nbe_chart_template')).get('value', {})
+ )
+ wiz_id = wiz.create(cr, uid, values)
+ wiz.execute(cr, uid, [wiz_id])
+ install_todo.write({'state':'done'})
diff --git a/addons/l10n_be/security/ir.model.access.csv b/addons/l10n_be/security/ir.model.access.csv
index 0343f29f43a..4a08a4aa60d 100644
--- a/addons/l10n_be/security/ir.model.access.csv
+++ b/addons/l10n_be/security/ir.model.access.csv
@@ -1 +1 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
diff --git a/addons/l10n_be/wizard/l10n_be_account_vat_declaration.py b/addons/l10n_be/wizard/l10n_be_account_vat_declaration.py
index 77d8515d78b..138f6f668f8 100644
--- a/addons/l10n_be/wizard/l10n_be_account_vat_declaration.py
+++ b/addons/l10n_be/wizard/l10n_be_account_vat_declaration.py
@@ -70,9 +70,10 @@ class l10n_be_vat_declaration(osv.osv_memory):
obj_company = data_tax.tax_code_id.company_id
else:
obj_company = obj_user.browse(cr, uid, uid, context=context).company_id
- vat_no = obj_company.partner_id.vat.replace(' ','').upper()
+ vat_no = obj_company.partner_id.vat
if not vat_no:
raise osv.except_osv(_('Data Insufficient'), _('No VAT Number Associated with Main Company!'))
+ vat_no = vat_no.replace(' ','').upper()
tax_code_ids = obj_tax_code.search(cr, uid, [], context=context)
ctx = context.copy()
diff --git a/addons/l10n_be_hr_payroll/__openerp__.py b/addons/l10n_be_hr_payroll/__openerp__.py
index d667cdfa126..488345869b2 100644
--- a/addons/l10n_be_hr_payroll/__openerp__.py
+++ b/addons/l10n_be_hr_payroll/__openerp__.py
@@ -19,8 +19,8 @@
#
##############################################################################
{
- 'name': 'Belgian Payroll Rules',
- 'category': 'Localization/Payroll',
+ 'name': 'Belgium - Payroll',
+ 'category': 'Localization',
'author': 'OpenERP SA',
'depends': ['hr_payroll'],
'version': '1.0',
diff --git a/addons/l10n_be_hr_payroll/l10n_be_hr_payroll_data.xml b/addons/l10n_be_hr_payroll/l10n_be_hr_payroll_data.xml
index 799c544a0c8..5acb2729abb 100644
--- a/addons/l10n_be_hr_payroll/l10n_be_hr_payroll_data.xml
+++ b/addons/l10n_be_hr_payroll/l10n_be_hr_payroll_data.xml
@@ -165,7 +165,7 @@
car
fix
15
- none
+ none
@@ -266,7 +266,7 @@
165
python
result = bool(contract.insurance_employee_deduction)
- result = -contract.insurance_employee_deduction
+ result = -contract.insurance_employee_deduction
diff --git a/addons/l10n_be_invoice_bba/__init__.py b/addons/l10n_be_invoice_bba/__init__.py
index 176d1b9a904..48cd4bc0347 100644
--- a/addons/l10n_be_invoice_bba/__init__.py
+++ b/addons/l10n_be_invoice_bba/__init__.py
@@ -22,3 +22,5 @@
import partner
import invoice
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_be_invoice_bba/__openerp__.py b/addons/l10n_be_invoice_bba/__openerp__.py
index e4b209317d0..2fde058b4be 100644
--- a/addons/l10n_be_invoice_bba/__openerp__.py
+++ b/addons/l10n_be_invoice_bba/__openerp__.py
@@ -21,11 +21,11 @@
##############################################################################
{
- 'name': 'Add support for Belgian structured communication to Invoices',
+ 'name': 'Belgium - Structured Communication',
'version': '1.2',
'license': 'AGPL-3',
'author': 'Noviat',
- 'category' : 'Localization/Accounting',
+ 'category' : 'Localization',
'description': """
Belgian localisation for in- and outgoing invoices (prereq to account_coda):
@@ -53,3 +53,5 @@ A 'random' Structured Communication will generated if no algorithm is specified
],
'active': False,
'installable': True,}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_be_invoice_bba/invoice.py b/addons/l10n_be_invoice_bba/invoice.py
index 947ccb6f71c..997036c0cec 100644
--- a/addons/l10n_be_invoice_bba/invoice.py
+++ b/addons/l10n_be_invoice_bba/invoice.py
@@ -215,3 +215,5 @@ class account_invoice(osv.osv):
]
account_invoice()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_be_invoice_bba/partner.py b/addons/l10n_be_invoice_bba/partner.py
index 194ae39ed86..04a51c3a6ab 100644
--- a/addons/l10n_be_invoice_bba/partner.py
+++ b/addons/l10n_be_invoice_bba/partner.py
@@ -50,3 +50,5 @@ class res_partner(osv.osv):
'out_inv_comm_type': 'none',
}
res_partner()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_br/__openerp__.py b/addons/l10n_br/__openerp__.py
index 86ff4cd4e83..8b0c34f6b78 100644
--- a/addons/l10n_br/__openerp__.py
+++ b/addons/l10n_br/__openerp__.py
@@ -19,8 +19,8 @@
#################################################################################
{
- 'name': 'Brazilian Localization',
- 'category': 'Localization/Account Charts',
+ 'name': 'Brazilian - Accounting',
+ 'category': 'Localization',
'description': """
Base module for the Brazilian localization
==========================================
diff --git a/addons/l10n_br/account.py b/addons/l10n_br/account.py
index 965ff500829..6e38aaa690f 100644
--- a/addons/l10n_br/account.py
+++ b/addons/l10n_br/account.py
@@ -124,15 +124,6 @@ class account_tax(osv.osv):
account_tax()
-class account_journal(osv.osv):
- _inherit = "account.journal"
-
- _columns = {
- 'internal_sequence': fields.many2one('ir.sequence', 'Internal Sequence'),
- }
-
-account_journal()
-
class wizard_multi_charts_accounts(osv.osv_memory):
_inherit = 'wizard.multi.charts.accounts'
@@ -174,4 +165,6 @@ class wizard_multi_charts_accounts(osv.osv_memory):
if tax.tax_code_id:
obj_acc_tax.write(cr, uid, tax.id, {'domain': tax.tax_code_id.domain,'tax_discount': tax.tax_code_id.tax_discount})
-wizard_multi_charts_accounts()
\ No newline at end of file
+wizard_multi_charts_accounts()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_br/account_view.xml b/addons/l10n_br/account_view.xml
index da2ab84d4ab..0b038fddd82 100644
--- a/addons/l10n_br/account_view.xml
+++ b/addons/l10n_br/account_view.xml
@@ -96,18 +96,6 @@
-
- l10n_br.journal.form.inherit
- account.journal
- form
-
-
-
-
-
-
-
-
diff --git a/addons/l10n_br/data/account_tax_template.xml b/addons/l10n_br/data/account_tax_template.xml
index 58f860e0d90..fcdcb4d30e6 100644
--- a/addons/l10n_br/data/account_tax_template.xml
+++ b/addons/l10n_br/data/account_tax_template.xml
@@ -5,7 +5,6 @@
IPI
IPI
- vat
0.00
@@ -21,7 +20,6 @@
IPI 2%
IPI 2%
- vat
0.02
@@ -37,7 +35,6 @@
IPI 3%
IPI 3%
- vat
0.03
@@ -53,7 +50,6 @@
IPI 4%
IPI 4%
- vat
0.04
@@ -69,7 +65,6 @@
IPI 5%
IPI 5%
- vat
0.05
@@ -85,7 +80,6 @@
IPI 7%
IPI 7%
- vat
0.07
@@ -101,7 +95,6 @@
IPI 8%
IPI 8%
- vat
0.08
@@ -117,7 +110,6 @@
IPI 10%
IPI 10%
- vat
0.10
@@ -133,7 +125,6 @@
IPI 12%
IPI 12%
- vat
0.12
@@ -149,7 +140,6 @@
IPI 13%
IPI 13%
- vat
0.13
@@ -165,7 +155,6 @@
IPI 15%
IPI 15%
- vat
0.15
@@ -181,7 +170,6 @@
IPI 16%
IPI 16%
- vat
0.16
@@ -197,7 +185,6 @@
IPI 18%
IPI 18%
- vat
0.18
@@ -213,7 +200,6 @@
IPI 20%
IPI 20%
- vat
0.20
@@ -229,7 +215,6 @@
IPI 22%
IPI 22%
- vat
0.22
@@ -245,7 +230,6 @@
IPI 25%
IPI 25%
- vat
0.25
@@ -261,7 +245,6 @@
IPI 27%
IPI 27%
- vat
0.27
@@ -277,7 +260,6 @@
IPI 30%
IPI 30%
- vat
0.30
@@ -293,7 +275,6 @@
IPI 35%
IPI 35%
- vat
0.35
@@ -309,7 +290,6 @@
IPI 40%
IPI 40%
- vat
0.40
@@ -325,7 +305,6 @@
IPI 42%
IPI 42%
- vat
0.42
@@ -341,7 +320,6 @@
IPI 45%
IPI 45%
- vat
0.45
@@ -357,7 +335,6 @@
IPI 50%
IPI 50%
- vat
0.50
@@ -373,7 +350,6 @@
IPI 60%
IPI 60%
- vat
0.60
@@ -389,7 +365,6 @@
IPI 330%
IPI 330%
- vat
3.30
@@ -405,7 +380,6 @@
ICMS Interno
ICMS Interno
- vat
0.00
@@ -421,7 +395,6 @@
ICMS Externo
ICMS Externo
- vat
0.00
@@ -437,7 +410,6 @@
ICMS Subist
ICMS Subist
- vat
0.00
@@ -451,7 +423,6 @@
ICMS Externo 7%
ICMS Externo 7%
- vat
0.07
@@ -467,7 +438,6 @@
ICMS Externo 12%
ICMS Externo 12%
- vat
0.12
@@ -483,7 +453,6 @@
ICMS Interno 19%
ICMS Interno 19%
- vat
0.19
@@ -499,7 +468,6 @@
ICMS Interno 26%
ICMS Interno 26%
- vat
0.26
@@ -515,7 +483,6 @@
PIS
PIS
- vat
0.00
@@ -531,7 +498,6 @@
PIS 0,65%
PIS 0,65%
- vat
0.0065
@@ -547,7 +513,6 @@
COFINS
COFINS
- vat
0.00
@@ -563,7 +528,6 @@
COFINS 3%
COFINS 3%
- vat
0.03
@@ -579,7 +543,6 @@
IRPJ
IRPJ
- vat
0.00
@@ -593,7 +556,6 @@
IR
IR
- vat
0.00
@@ -607,7 +569,6 @@
ISS
ISS
- vat
0.00
@@ -621,7 +582,6 @@
ISS 1%
ISS 1%
- vat
0.01
@@ -635,7 +595,6 @@
ISS 2%
ISS 2%
- vat
0.02
@@ -649,7 +608,6 @@
ISS 3%
ISS 3%
- vat
0.03
@@ -663,7 +621,6 @@
ISS 4%
ISS 4%
- vat
0.04
@@ -677,7 +634,6 @@
ISS 5%
ISS 5%
- vat
0.05
@@ -691,7 +647,6 @@
CSLL
CSLL
- vat
0.00
@@ -703,4 +658,4 @@
-
\ No newline at end of file
+
diff --git a/addons/l10n_br/data/l10n_br_account_chart_template.xml b/addons/l10n_br/data/l10n_br_account_chart_template.xml
index 9dbcb4d558f..89ccee11edc 100644
--- a/addons/l10n_br/data/l10n_br_account_chart_template.xml
+++ b/addons/l10n_br/data/l10n_br_account_chart_template.xml
@@ -19,7 +19,7 @@
This is the same wizard that runs from Financial Management/Configuration/Financial Accounting/Financial Accounts/Generate Chart of Accounts from a Chart Template.
open
- onskip
+ once
diff --git a/addons/l10n_br/i18n/oc.po b/addons/l10n_br/i18n/oc.po
new file mode 100644
index 00000000000..371c4f5adeb
--- /dev/null
+++ b/addons/l10n_br/i18n/oc.po
@@ -0,0 +1,36 @@
+# Occitan (post 1500) translation for openobject-addons
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2011-01-07 06:40+0000\n"
+"PO-Revision-Date: 2011-11-20 09:22+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Occitan (post 1500) \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
+"X-Generator: Launchpad (build 14299)\n"
+
+#. module: l10n_br
+#: model:ir.actions.todo,note:l10n_br.config_call_account_template_brazilian_localization
+msgid ""
+"Generate Chart of Accounts from a Chart Template. You will be asked to pass "
+"the name of the company, the chart template to follow, the no. of digits to "
+"generate the code for your accounts and Bank account, currency to create "
+"Journals. Thus,the pure copy of chart Template is generated.\n"
+" This is the same wizard that runs from Financial "
+"Management/Configuration/Financial Accounting/Financial Accounts/Generate "
+"Chart of Accounts from a Chart Template."
+msgstr ""
+
+#. module: l10n_br
+#: model:ir.module.module,description:l10n_br.module_meta_information
+#: model:ir.module.module,shortdesc:l10n_br.module_meta_information
+msgid "Brazilian Localization"
+msgstr "Localizacion brasilièra"
diff --git a/addons/l10n_br/security/ir.model.access.csv b/addons/l10n_br/security/ir.model.access.csv
index 2a1ecd6910f..9381bd449b3 100644
--- a/addons/l10n_br/security/ir.model.access.csv
+++ b/addons/l10n_br/security/ir.model.access.csv
@@ -1,3 +1,3 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"l10n_br_account_cst","l10n_br_account.cst","model_l10n_br_account_cst","account.group_account_invoice",1,1,1,1
-"l10n_br_account_cst_template","l10n_br_account.cst.template","model_l10n_br_account_cst_template","account.group_account_invoice",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+l10n_br_account_cst,l10n_br_account.cst,model_l10n_br_account_cst,account.group_account_invoice,1,1,1,1
+l10n_br_account_cst_template,l10n_br_account.cst.template,model_l10n_br_account_cst_template,account.group_account_invoice,1,1,1,1
diff --git a/addons/l10n_ca/__openerp__.py b/addons/l10n_ca/__openerp__.py
index fbfadbf9755..430bc31c7c3 100644
--- a/addons/l10n_ca/__openerp__.py
+++ b/addons/l10n_ca/__openerp__.py
@@ -19,11 +19,11 @@
#
##############################################################################
{
- "name" : "Canada - English and French - Canadian Chart of Accounts",
+ "name" : "Canada - Accounting",
"version" : "1.0",
"author" : "Savoir-faire Linux",
"website" : "http://www.savoirfairelinux.com",
- "category" : "Localization/Account Charts",
+ "category" : "Localization",
"description": """
This is the module to manage the English and French - Canadian accounting chart in OpenERP.
===========================================================================================
diff --git a/addons/l10n_ch/__openerp__.py b/addons/l10n_ch/__openerp__.py
index 1c6bb5688d7..4e1988e6c75 100644
--- a/addons/l10n_ch/__openerp__.py
+++ b/addons/l10n_ch/__openerp__.py
@@ -20,7 +20,7 @@
##############################################################################
{
- "name" : "Switzerland - localization with 2011 taxes",
+ "name" : "Switzerland - Accounting",
"description" : """
Swiss localisation :
- DTA generation for a lot of payment types
@@ -63,7 +63,7 @@ TODO :
""",
"version" : "6.1",
"author" : "Camptocamp",
- "category" : "Finance",
+ 'category': 'Localization',
"website": "http://www.camptocamp.com",
"depends" : [
@@ -99,8 +99,9 @@ TODO :
'test' : [
'test/l10n_ch_report.yml',
'test/l10n_ch_dta.yml',
- 'test/l10n_ch_v11.yml',
- 'test/l10n_ch_v11_part.yml',
+ #TODO: uncomment the 2 following tests once they are fixed
+ #'test/l10n_ch_v11.yml',
+ #'test/l10n_ch_v11_part.yml',
],
"active": False,
"installable": True,
diff --git a/addons/l10n_ch/account_wizard.py b/addons/l10n_ch/account_wizard.py
index f9b2600adca..7b80e3697ee 100644
--- a/addons/l10n_ch/account_wizard.py
+++ b/addons/l10n_ch/account_wizard.py
@@ -42,3 +42,5 @@ class WizardMultiChartsAccounts(osv.osv_memory):
WizardMultiChartsAccounts()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_ch/bank.py b/addons/l10n_ch/bank.py
index 6b9294bea13..fd69dec625f 100644
--- a/addons/l10n_ch/bank.py
+++ b/addons/l10n_ch/bank.py
@@ -77,3 +77,5 @@ class ResPartnerBank(osv.osv):
'The BVR adherent number must be unique !')]
ResPartnerBank()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_ch/bank_view.xml b/addons/l10n_ch/bank_view.xml
index f8c66c16000..e23be1bb6ac 100644
--- a/addons/l10n_ch/bank_view.xml
+++ b/addons/l10n_ch/bank_view.xml
@@ -6,7 +6,6 @@
res.bank.form
res.bank
form
-
@@ -23,7 +22,6 @@
res.bank.tree
res.bank
tree
-
@@ -40,7 +38,6 @@
res.partner_bank.form.hide.f1
res.partner
form
-
@@ -51,7 +48,6 @@
res.partner_bank.form.hide.f2
res.partner
form
-
@@ -63,7 +59,6 @@
res.partner_bank.form.hide.f2
res.partner
form
-
@@ -94,7 +89,6 @@
res.partner_bank.form.hide.acc_number.frominvoice
res.partner.bank
form
-
@@ -106,7 +100,6 @@
res.partner_bank.form.hide.bank.frominvoice
res.partner.bank
form
-
@@ -118,7 +111,6 @@
res.partner_bank.form.hide.frominvoice
res.partner.bank
form
-
@@ -138,7 +130,7 @@
-
+
diff --git a/addons/l10n_ch/report/__init__.py b/addons/l10n_ch/report/__init__.py
index 04cc14f1d80..e8703f10d03 100644
--- a/addons/l10n_ch/report/__init__.py
+++ b/addons/l10n_ch/report/__init__.py
@@ -29,4 +29,6 @@
#
##############################################################################
-import report_webkit_html
\ No newline at end of file
+import report_webkit_html
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_ch/report/report_webkit_html.py b/addons/l10n_ch/report/report_webkit_html.py
index b551845322f..8b179e7ae58 100644
--- a/addons/l10n_ch/report/report_webkit_html.py
+++ b/addons/l10n_ch/report/report_webkit_html.py
@@ -322,3 +322,5 @@ BVRWebKitParser('report.invoice_web_bvr',
'account.invoice',
'addons/l10n_ch/report/report_webkit_html.mako',
parser=l10n_ch_report_webkit_html)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_ch/security/ir.model.access.csv b/addons/l10n_ch/security/ir.model.access.csv
index 0343f29f43a..4a08a4aa60d 100644
--- a/addons/l10n_ch/security/ir.model.access.csv
+++ b/addons/l10n_ch/security/ir.model.access.csv
@@ -1 +1 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
diff --git a/addons/l10n_ch/sterchi_chart/account.xml b/addons/l10n_ch/sterchi_chart/account.xml
index f642b800493..8fdd29fe8a8 100644
--- a/addons/l10n_ch/sterchi_chart/account.xml
+++ b/addons/l10n_ch/sterchi_chart/account.xml
@@ -177,14 +177,12 @@
Bilan : Debiteurs
receivable
- True
unreconciled
none
Bilan : Fournisseurs
payable
- True
unreconciled
none
@@ -359,11 +357,12 @@
other
- Compte en devise A
+ Compte en devise EUR
1024
+
other
diff --git a/addons/l10n_ch/test/l10n_ch_dta.yml b/addons/l10n_ch/test/l10n_ch_dta.yml
index 3f1dbacfd86..5dc41adedd8 100644
--- a/addons/l10n_ch/test/l10n_ch_dta.yml
+++ b/addons/l10n_ch/test/l10n_ch_dta.yml
@@ -6,7 +6,7 @@
# Creating 1 invoice #
###########################
-
- !record {model: account.invoice, id: dta_account_invoice}:
+ !record {model: account.invoice, id: dta_account_invoice, view: False}:
company_id: base.main_company
journal_id: account.bank_journal
currency_id: base.EUR
@@ -25,7 +25,7 @@
-
I add an invoice line
-
- !record {model: account.invoice.line, id: dta_invoice_line}:
+ !record {model: account.invoice.line, id: dta_invoice_line, view: False}:
account_id: account.a_expense
name: '[PC1] Basic PC'
price_unit: 700.0
diff --git a/addons/l10n_ch/test/l10n_ch_report.yml b/addons/l10n_ch/test/l10n_ch_report.yml
index e5b570fe58f..f120b14f33b 100644
--- a/addons/l10n_ch/test/l10n_ch_report.yml
+++ b/addons/l10n_ch/test/l10n_ch_report.yml
@@ -35,7 +35,7 @@
-
In order to test the PDF BVR webkit reports defined on an invoice, we will create a Invoice Record
-
- !record {model: account.invoice, id: l10n_ch_invoice}:
+ !record {model: account.invoice, id: l10n_ch_invoice, view: False}:
currency_id: base.CHF
company_id: base.main_company
address_invoice_id: res_partner_address_2
@@ -49,7 +49,7 @@
-
In order to test the BVR report, I will assign a bank to the invoice
-
- !record {model: account.invoice, id: l10n_ch_invoice}:
+ !record {model: account.invoice, id: l10n_ch_invoice, view: False}:
partner_bank_id: main_partner_bank
-
In order to test the PDF reports defined on a l10n_ch, we will print BVR Report
@@ -57,4 +57,4 @@
!python {model: account.invoice}: |
from tools.test_reports import try_report
company = self.pool.get('res.users').browse(cr, uid, uid).company_id
- company.lib_path and try_report(cr, uid, 'report.invoice_web_bvr', [ref('l10n_ch_invoice')]) or 'Webkit lib not set'
\ No newline at end of file
+ company.lib_path and try_report(cr, uid, 'report.invoice_web_bvr', [ref('l10n_ch_invoice')]) or 'Webkit lib not set'
diff --git a/addons/l10n_ch/test/l10n_ch_v11.yml b/addons/l10n_ch/test/l10n_ch_v11.yml
index 35e9870fe69..e30012dd6b8 100644
--- a/addons/l10n_ch/test/l10n_ch_v11.yml
+++ b/addons/l10n_ch/test/l10n_ch_v11.yml
@@ -4,7 +4,7 @@
-
I create an invoice ref 1234567
-
- !record {model: account.invoice, id: v11_test_invoice}:
+ !record {model: account.invoice, id: v11_test_invoice, view: False}:
name: V11 YAML invoice
number: 1234567
company_id: base.main_company
@@ -26,7 +26,7 @@
-
I create an invoice line
-
- !record {model: account.invoice.line, id: v11_test_invoice_line}:
+ !record {model: account.invoice.line, id: v11_test_invoice_line, view: False}:
account_id: account.a_expense
name: '[PC1] Basic PC'
price_unit: 888.00
@@ -51,7 +51,7 @@
-
I create a bank statement
-
- !record {model: account.bank.statement, id: v11_test_bank_statement}:
+ !record {model: account.bank.statement, id: v11_test_bank_statement, view: False}:
#account_id:
#balance_end:
#balance_end_cash:
diff --git a/addons/l10n_ch/test/l10n_ch_v11_part.yml b/addons/l10n_ch/test/l10n_ch_v11_part.yml
index ea0b88eff79..af726ae97ea 100644
--- a/addons/l10n_ch/test/l10n_ch_v11_part.yml
+++ b/addons/l10n_ch/test/l10n_ch_v11_part.yml
@@ -5,7 +5,7 @@
-
I create an invoice ref 2000999 of EUR 250.00
-
- !record {model: account.invoice, id: v11_part_test_invoice}:
+ !record {model: account.invoice, id: v11_part_test_invoice, view: False}:
name: V11 YAML invoice
number: 2000999
company_id: base.main_company
@@ -27,7 +27,7 @@
-
I create an invoice line
-
- !record {model: account.invoice.line, id: v11_part_test_invoice_line}:
+ !record {model: account.invoice.line, id: v11_part_test_invoice_line, view: False}:
account_id: account.a_expense
name: '[PC1] Basic PC'
price_unit: 250.00
@@ -55,7 +55,7 @@
# Creating 1st bank statement #
#########################################
-
- !record {model: account.bank.statement, id: v11_part_test_bank_statement_1}:
+ !record {model: account.bank.statement, id: v11_part_test_bank_statement_1, view: False}:
#account_id:
#balance_end:
#balance_end_cash:
@@ -176,7 +176,7 @@
# Creating 2nd bank statement #
#########################################
-
- !record {model: account.bank.statement, id: v11_part_test_bank_statement_2}:
+ !record {model: account.bank.statement, id: v11_part_test_bank_statement_2, view: False}:
#account_id:
#balance_end:
#balance_end_cash:
diff --git a/addons/l10n_ch/wizard/bvr_import.py b/addons/l10n_ch/wizard/bvr_import.py
index 31c1e9ab96f..e98053513cd 100644
--- a/addons/l10n_ch/wizard/bvr_import.py
+++ b/addons/l10n_ch/wizard/bvr_import.py
@@ -168,7 +168,7 @@ def _import(self, cursor, user, data, context=None):
# line2reconcile = line.id
account_id = line.account_id.id
break
- result = voucher_obj.onchange_partner_id(cursor, user, [], partner_id, journal_id=statement.journal_id.id, price=abs(record['amount']), currency_id= statement.currency.id, ttype='receipt', date=statement.date ,context=context)
+ result = voucher_obj.onchange_partner_id(cursor, user, [], partner_id, journal_id=statement.journal_id.id, amount=abs(record['amount']), currency_id= statement.currency.id, ttype='receipt', date=statement.date ,context=context)
voucher_res = { 'type': 'receipt' ,
'name': values['name'],
diff --git a/addons/l10n_ch/wizard/create_dta_view.xml b/addons/l10n_ch/wizard/create_dta_view.xml
index 53d0cdc42d8..11cd2095e28 100644
--- a/addons/l10n_ch/wizard/create_dta_view.xml
+++ b/addons/l10n_ch/wizard/create_dta_view.xml
@@ -32,7 +32,6 @@
-
Create DTA
client_action_multi
@@ -40,4 +39,4 @@
payment.order
-
\ No newline at end of file
+
diff --git a/addons/l10n_ch/wizard/unicode2ascii.py b/addons/l10n_ch/wizard/unicode2ascii.py
index 7d95a4ab714..1cec519420c 100644
--- a/addons/l10n_ch/wizard/unicode2ascii.py
+++ b/addons/l10n_ch/wizard/unicode2ascii.py
@@ -590,3 +590,5 @@ if __name__ == '__main__':
if argz: parser.error('Only stdin -> stdout conversion suported')
uc_filter(sys.stdin, sys.stdout, bs=optz.bs, in_enc=optz.src_enc, out_enc=optz.dst_enc)
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_cn/__openerp__.py b/addons/l10n_cn/__openerp__.py
index 6a063505275..1057eae7807 100644
--- a/addons/l10n_cn/__openerp__.py
+++ b/addons/l10n_cn/__openerp__.py
@@ -18,9 +18,9 @@
#
##############################################################################
{
- "name" : "中国会计科目表",
+ "name" : "中国会计科目表 - Accounting",
"version" : "1.0",
- "category": "Localization/Account Charts",
+ "category": "Localization",
"author" : "openerp-china.org",
"maintainer":"openerp-china.org",
"website":"http://openerp-china.org",
diff --git a/addons/l10n_cr/__init__.py b/addons/l10n_cr/__init__.py
index c4c6ee3e380..88b86329a8d 100644
--- a/addons/l10n_cr/__init__.py
+++ b/addons/l10n_cr/__init__.py
@@ -32,3 +32,5 @@
#
##############################################################################
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_cr/__openerp__.py b/addons/l10n_cr/__openerp__.py
index 5fc4d80d7f7..6eb78017547 100644
--- a/addons/l10n_cr/__openerp__.py
+++ b/addons/l10n_cr/__openerp__.py
@@ -33,12 +33,12 @@
##############################################################################
{
- 'name': 'Costa Rica - Chart of Accounts',
+ 'name': 'Costa Rica - Accounting',
'version': '0.1',
'url': 'http://launchpad.net/openerp-costa-rica',
'author': 'ClearCorp S.A.',
'website': 'http://clearcorp.co.cr',
- 'category': 'Localization/Account Charts',
+ 'category': 'Localization',
'description': """
Chart of accounts for Costa Rica.
=================================
diff --git a/addons/l10n_cr/data/account_tax_template.xml b/addons/l10n_cr/data/account_tax_template.xml
index 7626b25b5ad..42b5ca03a13 100644
--- a/addons/l10n_cr/data/account_tax_template.xml
+++ b/addons/l10n_cr/data/account_tax_template.xml
@@ -11,7 +11,6 @@
10
13
percent
-
all
true
@@ -34,7 +33,6 @@
10
13
percent
-
all
true
diff --git a/addons/l10n_de/__openerp__.py b/addons/l10n_de/__openerp__.py
index 8cbdaa3b6ee..45bcc7dd210 100644
--- a/addons/l10n_de/__openerp__.py
+++ b/addons/l10n_de/__openerp__.py
@@ -121,11 +121,11 @@
{
- "name" : "Deutschland - SKR03 and SKR04",
+ "name" : "Deutschland - Accounting",
"version" : "1.0",
"author" : "openbig.org",
"website" : "http://www.openbig.org",
- "category" : "Localization/Account Charts",
+ "category" : "Localization",
"description": """
Dieses Modul beinhaltet einen deutschen Kontenrahmen basierend auf dem SKR03.
==============================================================================
@@ -152,3 +152,5 @@ German accounting chart and localization.
"certificate": "00517849017945584893",
'images': ['images/config_chart_l10n_de.jpeg','images/l10n_de_chart.jpeg'],
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_ec/__init__.py b/addons/l10n_ec/__init__.py
index e59e7efc423..d9537494d6e 100644
--- a/addons/l10n_ec/__init__.py
+++ b/addons/l10n_ec/__init__.py
@@ -18,3 +18,5 @@
#
##############################################################################
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_ec/__openerp__.py b/addons/l10n_ec/__openerp__.py
index 0e93a3ac57b..71f18c1e6f3 100644
--- a/addons/l10n_ec/__openerp__.py
+++ b/addons/l10n_ec/__openerp__.py
@@ -18,9 +18,9 @@
#
##############################################################################
{
- 'name': 'Ecuador - Accounting Chart',
+ 'name': 'Ecuador - Accounting',
'version': '1.1',
- 'category': 'Localization/Account Charts',
+ 'category': 'Localization',
'description': """
This is the base module to manage the accounting chart for Ecuador in OpenERP.
==============================================================================
@@ -47,3 +47,5 @@ Accounting chart and localization for Ecuador.
'certificate' : '001226484516187330589',
'images': ['images/config_chart_l10n_ec.jpeg','images/l10n_ec_chart.jpeg'],
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_es/__init__.py b/addons/l10n_es/__init__.py
index 297d923f6bb..bec854aac95 100644
--- a/addons/l10n_es/__init__.py
+++ b/addons/l10n_es/__init__.py
@@ -24,3 +24,5 @@
##############################################################################
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_es/__openerp__.py b/addons/l10n_es/__openerp__.py
index 3cdc521ad60..d68a465969e 100644
--- a/addons/l10n_es/__openerp__.py
+++ b/addons/l10n_es/__openerp__.py
@@ -22,11 +22,11 @@
##############################################################################
{
- "name" : "Spanish Charts of Accounts (PGCE 2008)",
+ "name" : "Spanish - Accounting (PGCE 2008)",
"version" : "3.0",
"author" : "Spanish Localization Team",
'website' : 'https://launchpad.net/openerp-spain',
- "category" : "Localization/Account Charts",
+ "category" : "Localization",
"description": """
Spanish Charts of Accounts (PGCE 2008).
=======================================
@@ -59,3 +59,5 @@ for yearly account reporting (balance, profit & losses).
"certificate" : "00408828172062583229",
'images': ['images/config_chart_l10n_es.jpeg','images/l10n_es_chart.jpeg'],
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_es/i18n/oc.po b/addons/l10n_es/i18n/oc.po
new file mode 100644
index 00000000000..3abe8d9ae4a
--- /dev/null
+++ b/addons/l10n_es/i18n/oc.po
@@ -0,0 +1,39 @@
+# Occitan (post 1500) translation for openobject-addons
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2011-01-11 11:15+0000\n"
+"PO-Revision-Date: 2011-11-20 09:22+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Occitan (post 1500) \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
+"X-Generator: Launchpad (build 14299)\n"
+
+#. module: l10n_es
+#: model:ir.module.module,shortdesc:l10n_es.module_meta_information
+msgid "Spanish Charts of Accounts (PGCE 2008)"
+msgstr "Plan comptable espanhòl (PGCE 2008)"
+
+#. module: l10n_es
+#: model:ir.module.module,description:l10n_es.module_meta_information
+msgid ""
+"Spanish Charts of Accounts (PGCE 2008)\n"
+"\n"
+"* Defines the following chart of account templates:\n"
+" * Spanish General Chart of Accounts 2008.\n"
+" * Spanish General Chart of Accounts 2008 for small and medium "
+"companies.\n"
+"* Defines templates for sale and purchase VAT.\n"
+"* Defines tax code templates.\n"
+"\n"
+"Note: You should install the l10n_ES_account_balance_report module\n"
+"for yearly account reporting (balance, profit & losses).\n"
+msgstr ""
diff --git a/addons/l10n_fr/__openerp__.py b/addons/l10n_fr/__openerp__.py
index 1bcb659c322..a7f5eea650d 100644
--- a/addons/l10n_fr/__openerp__.py
+++ b/addons/l10n_fr/__openerp__.py
@@ -26,18 +26,18 @@
#
##############################################################################
{
- "name" : "France - Plan Comptable Général",
+ "name" : "France - Accounting",
"version" : "1.0",
"author" : "OpenERP SA",
"website": "http://www.openerp.com",
- "category" : "Localization/Account Charts",
+ "category" : "Localization",
"description": """
This is the module to manage the accounting chart for France in OpenERP.
========================================================================
Credits: Sistheo Zeekom CrysaLEAD
""",
- "depends" : ['base', 'account', 'account_chart', 'base_vat'],
+ "depends" : ['base', 'account', 'account_chart', 'base_vat', 'l10n_fr_rib'],
"init_xml" : [],
"update_xml" : [
"fr_report_demo.xml",
diff --git a/addons/l10n_fr/security/ir.model.access.csv b/addons/l10n_fr/security/ir.model.access.csv
index 13405e7ce76..3642d709040 100644
--- a/addons/l10n_fr/security/ir.model.access.csv
+++ b/addons/l10n_fr/security/ir.model.access.csv
@@ -1,5 +1,3 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_l10n_fr_report_manager","l10n_fr.report account manager","model_l10n_fr_report","account.group_account_manager",1,1,1,1
-"access_l10n_fr_report_user","l10n_fr_report account user","model_l10n_fr_report","account.group_account_user",1,1,1,1
-"access_l10n_fr_line_manager","l10n_fr_line account manager","model_l10n_fr_line","account.group_account_manager",1,1,1,1
-"access_l10n_fr_line_user","l10n_fr.l10n_fr_line_account user","model_l10n_fr_line","account.group_account_user",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_l10n_fr_report_user,l10n_fr_report account user,model_l10n_fr_report,account.group_account_user,1,1,1,1
+access_l10n_fr_line_user,l10n_fr.l10n_fr_line_account user,model_l10n_fr_line,account.group_account_user,1,1,1,1
diff --git a/addons/l10n_fr/wizard/fr_report_bilan_view.xml b/addons/l10n_fr/wizard/fr_report_bilan_view.xml
index e8615935b8c..eb66de9f012 100644
--- a/addons/l10n_fr/wizard/fr_report_bilan_view.xml
+++ b/addons/l10n_fr/wizard/fr_report_bilan_view.xml
@@ -31,7 +31,6 @@
-
Bilan Report
client_print_multi
@@ -40,4 +39,4 @@
-
\ No newline at end of file
+
diff --git a/addons/l10n_fr/wizard/fr_report_compute_resultant_view.xml b/addons/l10n_fr/wizard/fr_report_compute_resultant_view.xml
index f50ec1ef308..5499e2fe1cf 100644
--- a/addons/l10n_fr/wizard/fr_report_compute_resultant_view.xml
+++ b/addons/l10n_fr/wizard/fr_report_compute_resultant_view.xml
@@ -30,7 +30,6 @@
-
Compte de resultat Report
client_print_multi
@@ -39,4 +38,4 @@
-
\ No newline at end of file
+
diff --git a/addons/l10n_fr_rib/__init__.py b/addons/l10n_fr_rib/__init__.py
new file mode 100644
index 00000000000..a061d3f40a2
--- /dev/null
+++ b/addons/l10n_fr_rib/__init__.py
@@ -0,0 +1,25 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2011 Numérigraphe SARL.
+#
+# 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 .
+#
+##############################################################################
+
+import bank
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+
diff --git a/addons/l10n_fr_rib/__openerp__.py b/addons/l10n_fr_rib/__openerp__.py
new file mode 100644
index 00000000000..072f8f5c1ac
--- /dev/null
+++ b/addons/l10n_fr_rib/__openerp__.py
@@ -0,0 +1,49 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2011 Numérigraphe SARL.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+{
+ 'name': 'French RIB Bank Details',
+ 'version': '1.0',
+ "category": 'Hidden/Dependency',
+ 'description': '''
+This module lets users enter the banking details of Partners in the RIB format (French standard for bank accounts details).
+RIB Bank Accounts can be entered in the "Accounting" tab of the Partner form by specifying the account type "RIB". The four standard RIB fields will then become mandatory:
+- Bank Code
+- Office Code
+- Account number
+- RIB key
+As a safety measure, OpenERP will check the RIB key whenever a RIB is saved, and will refuse to record the data if the key is incorrect. Please bear in mind that this can only happen when the user presses the "save" button, for example on the Partner Form.
+Since each bank account may relate to a Bank, users may enter the RIB Bank Code in the Bank form - it will the pre-fill the Bank Code on the RIB when they select the Bank.
+To make this easier, this module will also let users find Banks using their RIB code.
+
+The module base_iban can be a useful addition to this module, because French banks are now progressively adopting the international IBAN format instead of the RIB format.
+The RIB and IBAN codes for a single account can be entered by recording two Bank Accounts in OpenERP: the first with the type "RIB", the second with the type "IBAN".
+''',
+ 'author' : u'Numérigraphe SARL',
+ 'depends': ['base', 'account'],
+ 'init_xml': ['bank_data.xml', ],
+ 'update_xml': ['bank_view.xml', ],
+ 'installable': True,
+ 'certificate': '003407950790',
+ 'active': False,
+}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_fr_rib/bank.py b/addons/l10n_fr_rib/bank.py
new file mode 100644
index 00000000000..03f71f60dee
--- /dev/null
+++ b/addons/l10n_fr_rib/bank.py
@@ -0,0 +1,118 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2011 Numérigraphe SARL.
+#
+# 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 .
+#
+##############################################################################
+
+import netsvc
+from osv import fields, osv
+from tools.translate import _
+
+class res_partner_bank(osv.osv):
+ """Add fields and behavior for French RIB"""
+ _inherit = "res.partner.bank"
+
+ def _check_key(self, cr, uid, ids):
+ """Check the RIB key"""
+ for bank_acc in self.browse(cr, uid, ids):
+ # Ignore the accounts of type other than rib
+ if bank_acc.state !='rib':
+ continue
+ # Fail if the needed values are empty of too short
+ if (not bank_acc.bank_code
+ or len(bank_acc.bank_code) != 5
+ or not bank_acc.office or len(bank_acc.office) != 5
+ or not bank_acc.acc_number or len(bank_acc.acc_number) != 11
+ or not bank_acc.key or len(bank_acc.key) != 2):
+ return False
+ # Get the rib data (without the key)
+ rib = "%s%s%s" % (bank_acc.bank_code, bank_acc.office,
+ bank_acc.acc_number)
+ # Translate letters into numbers according to a specific table
+ # (notice how s -> 2)
+ table = dict((ord(a), b) for a, b in zip(
+ u'abcdefghijklmnopqrstuvwxyz', u'12345678912345678923456789'))
+ rib = rib.lower().translate(table)
+ # compute the key
+ key = 97 - (100 * int(rib)) % 97
+ if int(bank_acc.key) != key:
+ return False
+ return True
+
+ def onchange_bank_id(self, cr, uid, ids, bank_id, context=None):
+ """Change the bank code"""
+ result = super(res_partner_bank, self).onchange_bank_id(cr, uid, ids, bank_id,
+ context=context)
+ if bank_id:
+ value = result.setdefault('value', {})
+ bank = self.pool.get('res.bank').browse(cr, uid, bank_id,
+ context=context)
+ value['bank_code'] = bank.rib_code
+ return result
+
+ _columns = {
+ 'bank_code': fields.char('Bank Code', size=64, readonly=True,),
+ 'office': fields.char('Office Code', size=5, readonly=True,),
+ 'key': fields.char('Key', size=2, readonly=True,
+ help="The key is a number allowing to check the "
+ "correctness of the other codes."),
+ }
+
+ def _construct_constraint_msg(self, cr, uid, ids, context=None):
+ """Quote the data in the warning message"""
+ # Only process the first id
+ if type(ids) not in (int, long):
+ id = ids[0]
+ rib = self.browse(cr, uid, id, context=context)
+ if rib:
+ return (_("\nThe RIB key %s does not correspond to the other "
+ "codes: %s %s %s.") %
+ (rib.key,
+ rib.bank_code,
+ rib.office,
+ rib.acc_number) )
+
+ _constraints = [(_check_key,
+ _construct_constraint_msg,
+ ["key"])]
+
+res_partner_bank()
+
+class res_bank(osv.osv):
+ """Add the bank code to make it easier to enter RIB data"""
+ _inherit = 'res.bank'
+
+ def name_search(self, cr, user, name, args=None, operator='ilike',
+ context=None, limit=80):
+ """Search by bank code in addition to the standard search"""
+ # Get the standard results
+ results = super(res_bank, self).name_search(cr, user,
+ name, args=args ,operator=operator, context=context, limit=limit)
+ # Get additional results using the RIB code
+ ids = self.search(cr, user, [('rib_code', operator, name)],
+ limit=limit, context=context)
+ # Merge the results
+ results = list(set(results + self.name_get(cr, user, ids, context)))
+ return results
+
+ _columns = {
+ 'rib_code': fields.char('RIB Bank Code', size=64),
+ }
+res_bank()
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+
diff --git a/addons/l10n_fr_rib/bank_data.xml b/addons/l10n_fr_rib/bank_data.xml
new file mode 100644
index 00000000000..1dc9f4c88fd
--- /dev/null
+++ b/addons/l10n_fr_rib/bank_data.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+ RIB Bank Details
+ rib
+
+
+
+ bank_code
+
+
+
+
+
+ office
+
+
+
+
+
+ acc_number
+
+
+
+ 11
+
+
+ key
+
+
+
+
+
+ bank_bic
+
+
+
+
+
diff --git a/addons/l10n_fr_rib/bank_view.xml b/addons/l10n_fr_rib/bank_view.xml
new file mode 100644
index 00000000000..56eb8393aef
--- /dev/null
+++ b/addons/l10n_fr_rib/bank_view.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+ res.partner.form.rib1.inherit
+ res.partner
+
+ form
+
+
+
+
+
+
+
+
+
+
+ res.partner.form.rib2.inherit
+ res.partner
+
+ form
+
+
+
+
+
+
+
+
+
+ res.bank.form.rib.inherit
+ res.bank
+
+ form
+
+
+
+
+
+
+
+
diff --git a/addons/l10n_fr_rib/i18n/fr.po b/addons/l10n_fr_rib/i18n/fr.po
new file mode 100644
index 00000000000..4057dafb803
--- /dev/null
+++ b/addons/l10n_fr_rib/i18n/fr.po
@@ -0,0 +1,116 @@
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+# * l10n_fr_rib
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 6.1beta\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-21 12:37+0000\n"
+"PO-Revision-Date: 2011-11-21 12:37+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: l10n_fr_rib
+#: constraint:res.partner.bank:0
+msgid "\n"
+"Please define BIC/Swift code on bank for bank type IBAN Account to make valid payments"
+msgstr "\n"
+"Please define BIC/Swift code on bank for bank type IBAN Account to make valid payments"
+
+#. module: l10n_fr_rib
+#: model:ir.model,name:l10n_fr_rib.model_res_partner_bank
+msgid "Bank Accounts"
+msgstr "Comptes bancaires"
+
+#. module: l10n_fr_rib
+#: field:res.partner.bank,bank_code:0
+msgid "Bank Code"
+msgstr "Code banque"
+
+#. module: l10n_fr_rib
+#: model:res.partner.bank.type.field,name:l10n_fr_rib.rib_bic_field
+msgid "bank_bic"
+msgstr "bank_bic"
+
+#. module: l10n_fr_rib
+#: model:res.partner.bank.type.field,name:l10n_fr_rib.rib_office_field
+msgid "office"
+msgstr "Agence"
+
+#. module: l10n_fr_rib
+#: field:res.bank,rib_code:0
+msgid "RIB Bank Code"
+msgstr "Code banque RIB"
+
+#. module: l10n_fr_rib
+#: model:ir.module.module,description:l10n_fr_rib.module_meta_information
+msgid "\n"
+"This module installs the base for RIB bank accounts (French standard for bank accounts). \n"
+"To make it easier to enter RIB data, it will also allow to search for banks by code."
+msgstr "\n"
+"Ce module installe la base pour les comptes bancaires RIB (norme française pour les n° de compte). \n"
+"Pour faciliter la saisie des RIBs, il permet aussi de chercher les banques par code."
+
+#. module: l10n_fr_rib
+#: field:res.partner.bank,office:0
+msgid "Office Code"
+msgstr "Code agence"
+
+#. module: l10n_fr_rib
+#: model:res.partner.bank.type,name:l10n_fr_rib.bank_rib
+msgid "RIB Bank Details"
+msgstr "Relevé d'identité bancaire (RIB)"
+
+#. module: l10n_fr_rib
+#: model:res.partner.bank.type.field,name:l10n_fr_rib.rib_bank_code_field
+msgid "bank_code"
+msgstr "bank_code"
+
+#. module: l10n_fr_rib
+#: code:addons/l10n_fr_rib/bank.py:109
+#, python-format
+msgid "\n"
+"The RIB key %s does not correspond to the other codes: %s %s %s."
+msgstr "\n"
+"La clé RIB %s ne correspond pas aux autres codes : %s %s %s."
+
+#. module: l10n_fr_rib
+#: model:res.partner.bank.type.field,name:l10n_fr_rib.rib_key_field
+msgid "key"
+msgstr "key"
+
+#. module: l10n_fr_rib
+#: model:ir.module.module,shortdesc:l10n_fr_rib.module_meta_information
+msgid "French RIB Bank Details"
+msgstr "Relevés d'identité bancaire français (RIB)"
+
+#. module: l10n_fr_rib
+#: help:res.partner.bank,key:0
+msgid "The key is a number allowing to check the correctness of the other codes."
+msgstr "La clé est un nombre permettant de vérifier que les autres codes sont corrects."
+
+#. module: l10n_fr_rib
+#: field:res.partner.bank,key:0
+msgid "Key"
+msgstr "Clé"
+
+#. module: l10n_fr_rib
+#: model:res.partner.bank.type,format_layout:l10n_fr_rib.bank_rib
+msgid "%(bank_name)s: %(acc_number)s"
+msgstr "%(bank_name)s: %(acc_number)s"
+
+#. module: l10n_fr_rib
+#: model:ir.model,name:l10n_fr_rib.model_res_bank
+msgid "Bank"
+msgstr "Banque"
+
+#. module: l10n_fr_rib
+#: model:res.partner.bank.type.field,name:l10n_fr_rib.bank_acc_number_field
+msgid "acc_number"
+msgstr "acc_number"
+
diff --git a/addons/l10n_fr_rib/i18n/l10n_fr_rib.pot b/addons/l10n_fr_rib/i18n/l10n_fr_rib.pot
new file mode 100644
index 00000000000..5db922fe20f
--- /dev/null
+++ b/addons/l10n_fr_rib/i18n/l10n_fr_rib.pot
@@ -0,0 +1,112 @@
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+# * l10n_fr_rib
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 6.1beta\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-21 12:36+0000\n"
+"PO-Revision-Date: 2011-11-21 12:36+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: l10n_fr_rib
+#: constraint:res.partner.bank:0
+msgid "\n"
+"Please define BIC/Swift code on bank for bank type IBAN Account to make valid payments"
+msgstr ""
+
+#. module: l10n_fr_rib
+#: model:ir.model,name:l10n_fr_rib.model_res_partner_bank
+msgid "Bank Accounts"
+msgstr ""
+
+#. module: l10n_fr_rib
+#: field:res.partner.bank,bank_code:0
+msgid "Bank Code"
+msgstr ""
+
+#. module: l10n_fr_rib
+#: model:res.partner.bank.type.field,name:l10n_fr_rib.rib_bic_field
+msgid "bank_bic"
+msgstr ""
+
+#. module: l10n_fr_rib
+#: model:res.partner.bank.type.field,name:l10n_fr_rib.rib_office_field
+msgid "office"
+msgstr ""
+
+#. module: l10n_fr_rib
+#: field:res.bank,rib_code:0
+msgid "RIB Bank Code"
+msgstr ""
+
+#. module: l10n_fr_rib
+#: model:ir.module.module,description:l10n_fr_rib.module_meta_information
+msgid "\n"
+"This module installs the base for RIB bank accounts (French standard for bank accounts). \n"
+"To make it easier to enter RIB data, it will also allow to search for banks by code."
+msgstr ""
+
+#. module: l10n_fr_rib
+#: field:res.partner.bank,office:0
+msgid "Office Code"
+msgstr ""
+
+#. module: l10n_fr_rib
+#: model:res.partner.bank.type,name:l10n_fr_rib.bank_rib
+msgid "RIB Bank Details"
+msgstr ""
+
+#. module: l10n_fr_rib
+#: model:res.partner.bank.type.field,name:l10n_fr_rib.rib_bank_code_field
+msgid "bank_code"
+msgstr ""
+
+#. module: l10n_fr_rib
+#: code:addons/l10n_fr_rib/bank.py:109
+#, python-format
+msgid "\n"
+"The RIB key %s does not correspond to the other codes: %s %s %s."
+msgstr ""
+
+#. module: l10n_fr_rib
+#: model:res.partner.bank.type.field,name:l10n_fr_rib.rib_key_field
+msgid "key"
+msgstr ""
+
+#. module: l10n_fr_rib
+#: model:ir.module.module,shortdesc:l10n_fr_rib.module_meta_information
+msgid "French RIB Bank Details"
+msgstr ""
+
+#. module: l10n_fr_rib
+#: help:res.partner.bank,key:0
+msgid "The key is a number allowing to check the correctness of the other codes."
+msgstr ""
+
+#. module: l10n_fr_rib
+#: field:res.partner.bank,key:0
+msgid "Key"
+msgstr ""
+
+#. module: l10n_fr_rib
+#: model:res.partner.bank.type,format_layout:l10n_fr_rib.bank_rib
+msgid "%(bank_name)s: %(acc_number)s"
+msgstr ""
+
+#. module: l10n_fr_rib
+#: model:ir.model,name:l10n_fr_rib.model_res_bank
+msgid "Bank"
+msgstr ""
+
+#. module: l10n_fr_rib
+#: model:res.partner.bank.type.field,name:l10n_fr_rib.bank_acc_number_field
+msgid "acc_number"
+msgstr ""
+
diff --git a/addons/l10n_gr/__openerp__.py b/addons/l10n_gr/__openerp__.py
index 72b1d2c7cc4..4ab134e18b9 100644
--- a/addons/l10n_gr/__openerp__.py
+++ b/addons/l10n_gr/__openerp__.py
@@ -20,11 +20,11 @@
#
##############################################################################
{
- "name" : "Greece - Normal Plan",
+ "name" : "Greece - Accounting",
"version" : "0.2",
"author" : "P. Christeas, OpenERP SA.",
"website": "http://openerp.hellug.gr/",
- "category" : "Localization/Account Charts",
+ "category" : "Localization",
"description": """
This is the base module to manage the accounting chart for Greece.
==================================================================
diff --git a/addons/l10n_gt/__openerp__.py b/addons/l10n_gt/__openerp__.py
index d80c1fa80a7..c4f9ff0f0a4 100644
--- a/addons/l10n_gt/__openerp__.py
+++ b/addons/l10n_gt/__openerp__.py
@@ -33,9 +33,9 @@
#
{
- 'name': 'Guatemala - Plan contable general',
+ 'name': 'Guatemala - Accounting',
'version': '3.0',
- 'category': 'Localization/Account Charts',
+ 'category': 'Localization',
'description': """
This is the base module to manage the accounting chart for Guatemala.
=====================================================================
diff --git a/addons/l10n_gt/i18n/oc.po b/addons/l10n_gt/i18n/oc.po
new file mode 100644
index 00000000000..e077ec6c3c0
--- /dev/null
+++ b/addons/l10n_gt/i18n/oc.po
@@ -0,0 +1,39 @@
+# Occitan (post 1500) translation for openobject-addons
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2011-01-11 11:15+0000\n"
+"PO-Revision-Date: 2011-11-20 09:23+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Occitan (post 1500) \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
+"X-Generator: Launchpad (build 14299)\n"
+
+#. module: l10n_gt
+#: model:ir.module.module,shortdesc:l10n_gt.module_meta_information
+msgid "Guatemala - Plan contable general"
+msgstr "Guatemala - Plan comptable general"
+
+#. module: l10n_gt
+#: model:ir.actions.todo,note:l10n_gt.config_call_account_template_gt_minimal
+msgid ""
+"Generar la nomenclatura contable a partir de un modelo. Deberá seleccionar "
+"una compañía, el modelo a utilizar, el número de digitos a usar en la "
+"nomenclatura, la moneda para crear los diarios."
+msgstr ""
+
+#. module: l10n_gt
+#: model:ir.module.module,description:l10n_gt.module_meta_information
+msgid ""
+"Agrega una nomenclatura contable para Guatemala. También icluye impuestos y "
+"la moneda del Quetzal. -- Adds accounting chart for Guatemala. It also "
+"includes taxes and the Quetzal currency"
+msgstr ""
diff --git a/addons/l10n_gt/l10n_gt_base.xml b/addons/l10n_gt/l10n_gt_base.xml
index c52e7e94532..5238d7b4f23 100644
--- a/addons/l10n_gt/l10n_gt_base.xml
+++ b/addons/l10n_gt/l10n_gt_base.xml
@@ -16,7 +16,6 @@
GTQ
- GTQ
Q
0.01
4
diff --git a/addons/l10n_hn/__openerp__.py b/addons/l10n_hn/__openerp__.py
index 31d9344cb65..157d396a6ae 100644
--- a/addons/l10n_hn/__openerp__.py
+++ b/addons/l10n_hn/__openerp__.py
@@ -33,9 +33,9 @@
#
{
- 'name': 'Honduras - Plan contable general',
+ 'name': 'Honduras - Accounting',
'version': '0.1',
- 'category': 'Localization/Account Charts',
+ 'category': 'Localization',
'description': """Agrega una nomenclatura contable para Honduras. También incluye impuestos y la moneda Lempira. -- Adds accounting chart for Honduras. It also includes taxes and the Lempira currency""",
'author': 'Salvatore Josue Trimarchi Pinto',
'website': 'http://trimarchi.co.cc',
@@ -49,6 +49,5 @@
],
'demo_xml': [],
'installable': True,
- 'certificate': '',
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_in/__openerp__.py b/addons/l10n_in/__openerp__.py
index 9aaec061319..6578eb2242a 100644
--- a/addons/l10n_in/__openerp__.py
+++ b/addons/l10n_in/__openerp__.py
@@ -20,7 +20,7 @@
##############################################################################
{
- "name": "Indian Chart of Account",
+ "name": "India - Accounting",
"version": "1.0",
"description": """
Indian Accounting : Chart of Account.
@@ -29,7 +29,7 @@ Indian Accounting : Chart of Account.
Indian accounting chart and localization.
""",
"author": ['OpenERP SA', 'Axelor'],
- "category": "Localization/Account Charts",
+ "category": "Localization",
"depends": [
"account",
"account_chart"
diff --git a/addons/l10n_in/i18n/oc.po b/addons/l10n_in/i18n/oc.po
new file mode 100644
index 00000000000..f52b722a33a
--- /dev/null
+++ b/addons/l10n_in/i18n/oc.po
@@ -0,0 +1,46 @@
+# Occitan (post 1500) translation for openobject-addons
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2011-01-11 11:15+0000\n"
+"PO-Revision-Date: 2011-11-20 09:23+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Occitan (post 1500) \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
+"X-Generator: Launchpad (build 14299)\n"
+
+#. module: l10n_in
+#: model:ir.module.module,description:l10n_in.module_meta_information
+msgid ""
+"\n"
+" Indian Accounting : chart of Account\n"
+" "
+msgstr ""
+"\n"
+" Comptabilitat indiana : plan de comptes\n"
+" "
+
+#. module: l10n_in
+#: model:ir.module.module,shortdesc:l10n_in.module_meta_information
+msgid "Indian Chart of Account"
+msgstr "Plan comptable indian"
+
+#. module: l10n_in
+#: model:ir.actions.todo,note:l10n_in.config_call_account_template_in_minimal
+msgid ""
+"Generate Chart of Accounts from a Chart Template. You will be asked to pass "
+"the name of the company, the chart template to follow, the no. of digits to "
+"generate the code for your accounts and Bank account, currency to create "
+"Journals. Thus,the pure copy of chart Template is generated.\n"
+"\tThis is the same wizard that runs from Financial "
+"Management/Configuration/Financial Accounting/Financial Accounts/Generate "
+"Chart of Accounts from a Chart Template."
+msgstr ""
diff --git a/addons/l10n_it/__init__.py b/addons/l10n_it/__init__.py
index 026004bfa0f..491d2cc7b66 100644
--- a/addons/l10n_it/__init__.py
+++ b/addons/l10n_it/__init__.py
@@ -1,13 +1,15 @@
-# -*- encoding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2010
-# Italian OpenERP Community ()
+# OpenERP Italian Community ()
# Servabit srl
# Agile Business Group sagl
# Domsense srl
-# Albatos srl
+# Albatos srl
+#
+# Copyright (C) 2011
+# Associazione OpenERP Italia ()
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@@ -23,6 +25,3 @@
# along with this program. If not, see .
#
##############################################################################
-
-import libroIVA
-import report
diff --git a/addons/l10n_it/__openerp__.py b/addons/l10n_it/__openerp__.py
index d6138608aa2..5376896cf06 100644
--- a/addons/l10n_it/__openerp__.py
+++ b/addons/l10n_it/__openerp__.py
@@ -3,12 +3,15 @@
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2010
-# Italian OpenERP Community ()
+# OpenERP Italian Community ()
# Servabit srl
# Agile Business Group sagl
# Domsense srl
# Albatos srl
#
+# Copyright (C) 2011
+# Associazione OpenERP Italia ()
+#
# 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
@@ -25,7 +28,7 @@
##############################################################################
{
- "name" : "Italy - Generic Chart of Accounts",
+ "name" : "Italy - Accounting",
"version" : "0.1",
"depends" : ['base_vat','account_chart','base_iban'],
"author" : "OpenERP Italian Community",
@@ -36,12 +39,9 @@ Piano dei conti italiano di un'impresa generica.
Italian accounting chart and localization.
""",
"license": "AGPL-3",
- "category" : "Localization/Account Charts",
+ "category" : "Localization",
'website': 'http://www.openerp-italia.org/',
'init_xml': [
- 'report.xml',
- 'libroIVA_view.xml',
- 'libroIVA_menu.xml',
],
'update_xml': [
'data/account.account.type.csv',
@@ -51,7 +51,6 @@ Italian accounting chart and localization.
'data/account.tax.template.csv',
'data/account.fiscal.position.template.csv',
'l10n_chart_it_generic.xml',
- 'security/ir.model.access.csv',
],
'demo_xml': [
],
diff --git a/addons/l10n_it/data/account.account.template.csv b/addons/l10n_it/data/account.account.template.csv
index 388d037ad4e..a1db05a3da9 100644
--- a/addons/l10n_it/data/account.account.template.csv
+++ b/addons/l10n_it/data/account.account.template.csv
@@ -1,234 +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_view","other",TRUE
-1106,1106,"software ",11,"account_type_view","other",TRUE
-1108,1108,"avviamento ",11,"account_type_view","other",TRUE
-1111,1111,"fondo ammortamento costi di impianto ",11,"account_type_view","other",TRUE
-1116,1116,"fondo ammortamento software ",11,"account_type_view","other",TRUE
-1118,1118,"fondo ammortamento avviamento ",11,"account_type_view","other",TRUE
-12,12,"IMMOBILIZZAZIONI MATERIALI ",1,"account_type_view","view",TRUE
-1201,1201,"fabbricati ",12,"account_type_view","other",TRUE
-1202,1202,"impianti e macchinari ",12,"account_type_view","other",TRUE
-1204,1204,"attrezzature commerciali ",12,"account_type_view","other",TRUE
-1205,1205,"macchine d'ufficio ",12,"account_type_view","other",TRUE
-1206,1206,"arredamento ",12,"account_type_view","other",TRUE
-1207,1207,"automezzi ",12,"account_type_view","other",TRUE
-1208,1208,"imballaggi durevoli ",12,"account_type_view","other",TRUE
-1211,1211,"fondo ammortamento fabbricati ",12,"account_type_view","other",TRUE
-1212,1212,"fondo ammortamento impianti e macchinari ",12,"account_type_view","other",TRUE
-1214,1214,"fondo ammortamento attrezzature commerciali ",12,"account_type_view","other",TRUE
-1215,1215,"fondo ammortamento macchine d'ufficio ",12,"account_type_view","other",TRUE
-1216,1216,"fondo ammortamento arredamento ",12,"account_type_view","other",TRUE
-1217,1217,"fondo ammortamento automezzi ",12,"account_type_view","other",TRUE
-1218,1218,"fondo ammortamento imballaggi durevoli ",12,"account_type_view","other",TRUE
-1220,1220,"fornitori immobilizzazioni c/acconti ",12,"account_type_view","other",TRUE
-13,13,"IMMOBILIZZAZIONI FINANZIARIE ",1,"account_type_view","view",TRUE
-1301,1301,"mutui attivi ",13,"account_type_view","other",TRUE
-14,14,"RIMANENZE ",1,"account_type_view","view",TRUE
-1401,1401,"materie di consumo ",14,"account_type_view","other",TRUE
-1404,1404,"merci ",14,"account_type_view","other",TRUE
-1410,1410,"fornitori c/acconti ",14,"account_type_view","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_receivable","other",TRUE
-1602,1602,"IVA c/acconto ",16,"account_type_receivable","other",TRUE
-1605,1605,"crediti per IVA ",16,"account_type_receivable","other",TRUE
-1607,1607,"imposte c/acconto ",16,"account_type_receivable","other",TRUE
-1608,1608,"crediti per imposte ",16,"account_type_receivable","other",TRUE
-1609,1609,"crediti per ritenute subite ",16,"account_type_receivable","other",TRUE
-1610,1610,"crediti per cauzioni ",16,"account_type_receivable","other",TRUE
-1620,1620,"personale c/acconti ",16,"account_type_receivable","other",TRUE
-1630,1630,"crediti v/istituti previdenziali ",16,"account_type_receivable","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_view","other",TRUE
-1902,1902,"risconti attivi ",19,"account_type_view","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_view","other",TRUE
-2102,2102,"utile d'esercizio ",20,"account_type_receivable","receivable",TRUE
-2103,2103,"perdita d'esercizio ",20,"account_type_payable","payable",TRUE
-2104,2104,"prelevamenti extra gestione ",20,"account_type_view","other",TRUE
-2105,2105,"titolare c/ritenute subite ",20,"account_type_view","other",TRUE
-22,22,"FONDI PER RISCHI E ONERI ",2,"account_type_view","view",TRUE
-2201,2201,"fondo per imposte ",22,"account_type_view","other",TRUE
-2204,2204,"fondo responsabilità civile ",22,"account_type_view","other",TRUE
-2205,2205,"fondo spese future ",22,"account_type_view","other",TRUE
-2211,2211,"fondo manutenzioni programmate ",22,"account_type_view","other",TRUE
-23,23,"TRATTAMENTO FINE RAPPORTO DI LAVORO ",2,"account_type_view","view",TRUE
-2301,2301,"debiti per TFRL ",23,"account_type_view","other",TRUE
-24,24,"DEBITI FINANZIARI ",2,"account_type_view","view",TRUE
-2410,2410,"mutui passivi ",24,"account_type_payable","other",TRUE
-2411,2411,"banche c/sovvenzioni ",24,"account_type_payable","other",TRUE
-2420,2420,"banche c/c passivi ",24,"account_type_payable","other",TRUE
-2421,2421,"banche c/RIBA all'incasso ",24,"account_type_payable","other",TRUE
-2422,2422,"banche c/cambiali all'incasso ",24,"account_type_payable","other",TRUE
-2423,2423,"banche c/anticipi su fatture ",24,"account_type_payable","other",TRUE
-2440,2440,"debiti v/altri finanziatori ",24,"account_type_payable","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_payable","other",TRUE
-2520,2520,"fatture da ricevere ",25,"account_type_payable","other",TRUE
-2521,2521,"debiti da liquidare ",25,"account_type_payable","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_payable","other",TRUE
-2602,2602,"debiti per ritenute da versare ",26,"account_type_payable","other",TRUE
-2605,2605,"erario c/IVA ",26,"account_type_payable","other",TRUE
-2606,2606,"debiti per imposte ",26,"account_type_payable","other",TRUE
-2619,2619,"debiti per cauzioni ",26,"account_type_payable","other",TRUE
-2620,2620,"personale c/retribuzioni ",26,"account_type_payable","other",TRUE
-2621,2621,"personale c/liquidazioni ",26,"account_type_payable","other",TRUE
-2622,2622,"clienti c/cessione ",26,"account_type_payable","other",TRUE
-2630,2630,"debiti v/istituti previdenziali ",26,"account_type_payable","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_view","other",TRUE
-2702,2702,"risconti passivi ",27,"account_type_view","other",TRUE
-28,28,"CONTI TRANSITORI E DIVERSI ",2,"account_type_view","view",TRUE
-2801,2801,"bilancio di apertura ",28,"account_type_view","other",TRUE
-2802,2802,"bilancio di chiusura ",28,"account_type_view","other",TRUE
-2810,2810,"IVA c/liquidazioni ",28,"account_type_view","other",TRUE
-2811,2811,"istituti previdenziali ",28,"account_type_view","other",TRUE
-2820,2820,"banca ... c/c ",28,"account_type_view","other",TRUE
-2821,2821,"banca ... c/c ",28,"account_type_view","other",TRUE
-2822,2822,"banca ... c/c ",28,"account_type_view","other",TRUE
-29,29,"CONTI DEI SISTEMI SUPPLEMENTARI ",2,"account_type_view","view",TRUE
-2901,2901,"beni di terzi ",29,"account_type_view","other",TRUE
-2902,2902,"depositanti beni ",29,"account_type_view","other",TRUE
-2911,2911,"merci da ricevere ",29,"account_type_view","other",TRUE
-2912,2912,"fornitori c/impegni ",29,"account_type_view","other",TRUE
-2913,2913,"impegni per beni in leasing ",29,"account_type_view","other",TRUE
-2914,2914,"creditori c/leasing ",29,"account_type_view","other",TRUE
-2916,2916,"clienti c/impegni ",29,"account_type_view","other",TRUE
-2917,2917,"merci da consegnare ",29,"account_type_view","other",TRUE
-2921,2921,"rischi per effetti scontati ",29,"account_type_view","other",TRUE
-2922,2922,"banche c/effetti scontati ",29,"account_type_view","other",TRUE
-2926,2926,"rischi per fideiussioni ",29,"account_type_view","other",TRUE
-2927,2927,"creditori per fideiussioni ",29,"account_type_view","other",TRUE
-2931,2931,"rischi per avalli ",29,"account_type_view","other",TRUE
-2932,2932,"creditori per avalli ",29,"account_type_view","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_view","other",TRUE
-4506,4506,"ammortamento software ",45,"account_type_view","other",TRUE
-4508,4508,"ammortamento avviamento ",45,"account_type_view","other",TRUE
-46,46,"AMMORTAMENTI IMMOBILIZZAZIONI MATERIALI ",4,"account_type_view","view",TRUE
-4601,4601,"ammortamento fabbricati ",46,"account_type_view","other",TRUE
-4602,4602,"ammortamento impianti e macchinari ",46,"account_type_view","other",TRUE
-4604,4604,"ammortamento attrezzature commerciali ",46,"account_type_view","other",TRUE
-4605,4605,"ammortamento macchine d'ufficio ",46,"account_type_view","other",TRUE
-4606,4606,"ammortamento arredamento ",46,"account_type_view","other",TRUE
-4607,4607,"ammortamento automezzi ",46,"account_type_view","other",TRUE
-4608,4608,"ammortamento imballaggi durevoli ",46,"account_type_view","other",TRUE
-47,47,"SVALUTAZIONI ",4,"account_type_view","view",TRUE
-4701,4701,"svalutazioni immobilizzazioni immateriali ",47,"account_type_view","other",TRUE
-4702,4702,"svalutazioni immobilizzazioni materiali ",47,"account_type_view","other",TRUE
-4706,4706,"svalutazione crediti ",47,"account_type_view","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_view","other",TRUE
-482,482,"ALTRI ACCANTONAMENTI ",48,"account_type_view","view",TRUE
-4821,4821,"accantonamento per spese future ",482,"account_type_view","other",TRUE
-4823,4823,"accantonamento per manutenzioni programmate ",482,"account_type_view","other",TRUE
-49,49,"ONERI DIVERSI ",4,"account_type_view","view",TRUE
-4901,4901,"oneri fiscali diversi ",49,"account_type_view","other",TRUE
-4903,4903,"oneri vari ",49,"account_type_view","other",TRUE
-4905,4905,"perdite su crediti ",49,"account_type_view","other",TRUE
-4910,4910,"arrotondamenti passivi ",49,"account_type_view","other",TRUE
-4920,4920,"minusvalenze ordinarie diverse ",49,"account_type_view","other",TRUE
-4930,4930,"sopravvenienze passive ordinarie diverse ",49,"account_type_view","other",TRUE
-4940,4940,"insussistenze passive ordinarie diverse ",49,"account_type_view","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_view","other",TRUE
-5115,5115,"interessi attivi bancari ",51,"account_type_view","other",TRUE
-5116,5116,"interessi attivi postali ",51,"account_type_view","other",TRUE
-5140,5140,"proventi finanziari diversi ",51,"account_type_view","other",TRUE
-52,52,"ONERI FINANZIARI ",5,"account_type_view","view",TRUE
-5201,5201,"interessi passivi v/fornitori ",52,"account_type_view","other",TRUE
-5202,5202,"interessi passivi bancari ",52,"account_type_view","other",TRUE
-5203,5203,"sconti passivi bancari ",52,"account_type_view","other",TRUE
-5210,5210,"interessi passivi su mutui ",52,"account_type_view","other",TRUE
-5240,5240,"oneri finanziari diversi ",52,"account_type_view","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_view","other",TRUE
-7102,7102,"sopravvenienze attive straordinarie ",71,"account_type_view","other",TRUE
-7103,7103,"insussistenze attive straordinarie ",71,"account_type_view","other",TRUE
-72,72,"ONERI STRAORDINARI ",7,"account_type_view","view",TRUE
-7201,7201,"minusvalenze straordinarie ",72,"account_type_view","other",TRUE
-7202,7202,"sopravvenienze passive straordinarie ",72,"account_type_view","other",TRUE
-7203,7203,"insussistenze passive straordinarie ",72,"account_type_view","other",TRUE
-7204,7204,"imposte esercizi precedenti ",72,"account_type_view","other",TRUE
-81,81,"IMPOSTE DELL'ESERCIZIO ",7,"account_type_view","view",TRUE
-8101,8101,"imposte dell'esercizio ",81,"account_type_view","other",TRUE
-91,91,"CONTI DI RISULTATO ",7,"account_type_view","view",TRUE
-9101,9101,"conto di risultato economico ",91,"account_type_view","other",TRUE
+"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","other","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"
diff --git a/addons/l10n_it/data/account.account.type.csv b/addons/l10n_it/data/account.account.type.csv
index 273ff71eb05..36eeebbbe89 100644
--- a/addons/l10n_it/data/account.account.type.csv
+++ b/addons/l10n_it/data/account.account.type.csv
@@ -1,11 +1,11 @@
"id","code","name","close_method","report_type"
-"account_type_receivable","receivable","Debiti","unreconciled","liability"
-"account_type_payable","payable","Crediti","unreconciled","asset"
+"account_type_receivable","receivable","Crediti","unreconciled","asset"
+"account_type_payable","payable","Debiti","unreconciled","liability"
"account_type_view","view","Gerarchia","none",
"account_type_income","income","Entrate","none","income"
"account_type_expense","expense","Uscite","none","expense"
-"account_type_tax","tax","Tasse","none",
+"account_type_tax","tax","Tasse","balance",
"account_type_cash","cash","Liquidità","balance","asset"
-"account_type_asset","asset","Beni","none","asset"
+"account_type_asset","asset","Beni","balance","asset"
"account_type_bank","bank","Banca","balance","asset"
-"account_type_equity","equity","Capitale","none","asset"
+"account_type_p_l","p_l","Conto Economico","none",
diff --git a/addons/l10n_it/data/account.tax.code.template.csv b/addons/l10n_it/data/account.tax.code.template.csv
index 288f169f4ab..40f0545aff9 100644
--- a/addons/l10n_it/data/account.tax.code.template.csv
+++ b/addons/l10n_it/data/account.tax.code.template.csv
@@ -26,6 +26,8 @@
"IVC4Idet50","template_impcode_pagata_4det50","IVA a credito 4% detraibile 50% (imponibile)","template_impcode_pagata"
"IVC20","template_ivacode_pagata_20","IVA a credito 20%","template_ivacode_pagata"
"IVC20I","template_impcode_pagata_20","IVA a credito 20% (imponibile)","template_impcode_pagata"
+"IVC21","template_ivacode_pagata_21","IVA a credito 21%","template_ivacode_pagata"
+"IVC21I","template_impcode_pagata_21","IVA a credito 21% (imponibile)","template_impcode_pagata"
"IVC4","template_ivacode_pagata_4","IVA a credito 4%","template_ivacode_pagata"
"IVC4I","template_impcode_pagata_4","IVA a credito 4% (imponibile)","template_impcode_pagata"
"IVC12","template_ivacode_pagata_12","IVA a credito 12%","template_ivacode_pagata"
@@ -40,9 +42,21 @@
"IVD10I","template_impcode_riscossa_10","IVA a debito 10% (imponibile)","template_impcode_riscossa"
"IVD20","template_ivacode_riscossa_20","IVA a debito 20%","template_ivacode_riscossa"
"IVD20I","template_impcode_riscossa_20","IVA a debito 20% (imponibile)","template_impcode_riscossa"
+"IVD21","template_ivacode_riscossa_21","IVA a debito 21%","template_ivacode_riscossa"
+"IVD21I","template_impcode_riscossa_21","IVA a debito 21% (imponibile)","template_impcode_riscossa"
"IVD4","template_ivacode_riscossa_4","IVA a debito 4%","template_ivacode_riscossa"
"IVD4I","template_impcode_riscossa_4","IVA a debito 4% (imponibile)","template_impcode_riscossa"
"IVD12","template_ivacode_riscossa_12","IVA a debito 12%","template_ivacode_riscossa"
"IVD12I","template_impcode_riscossa_12","IVA a debito 12% (imponibile)","template_impcode_riscossa"
"IVD2","template_ivacode_riscossa_2","IVA a debito 2%","template_ivacode_riscossa"
"IVD2I","template_impcode_riscossa_2","IVA a debito 2% (imponibile)","template_impcode_riscossa"
+"IVC21ind","template_ivacode_pagata_21ind","IVA a credito 21% indetraibile","template_ivacode_pagata"
+"IVC21Iind","template_impcode_pagata_21ind","IVA a credito 21% indetraibile (imponibile)","template_impcode_pagata"
+"IVC21det10","template_ivacode_pagata_21det10","IVA a credito 21% detraibile 10%","template_ivacode_pagata"
+"IVC21Idet10","template_impcode_pagata_21det10","IVA a credito 21% detraibile 10% (imponibile)","template_impcode_pagata"
+"IVC21det15","template_ivacode_pagata_21det15","IVA a credito 21% detraibile 15%","template_ivacode_pagata"
+"IVC21Idet15","template_impcode_pagata_21det15","IVA a credito 21% detraibile 15% (imponibile)","template_impcode_pagata"
+"IVC21det40","template_ivacode_pagata_21det40","IVA a credito 21% detraibile 40%","template_ivacode_pagata"
+"IVC21Idet40","template_impcode_pagata_21det40","IVA a credito 21% detraibile 40% (imponibile)","template_impcode_pagata"
+"IVC21det50","template_ivacode_pagata_21det50","IVA a credito 21% detraibile 50%","template_ivacode_pagata"
+"IVC21Idet50","template_impcode_pagata_21det50","IVA a credito 21% detraibile 50% (imponibile)","template_impcode_pagata"
diff --git a/addons/l10n_it/data/account.tax.template.csv b/addons/l10n_it/data/account.tax.template.csv
index cf9caeeb0d4..641f495dd72 100644
--- a/addons/l10n_it/data/account.tax.template.csv
+++ b/addons/l10n_it/data/account.tax.template.csv
@@ -1,40 +1,64 @@
-"id","description","chart_template_id:id","name","amount","parent_id:id","child_depend","type","account_collected_id:id","account_paid_id:id","type_tax_use","base_code_id:id","tax_code_id:id","ref_base_code_id:id","ref_tax_code_id:id"
-"20a","20a","l10n_it_chart_template_generic","Iva al 20% (debito)","0.2",,"False","percent","2601","2601","sale","template_impcode_riscossa_20","template_ivacode_riscossa_20","template_impcode_riscossa_20","template_ivacode_riscossa_20"
-"20b","20b","l10n_it_chart_template_generic","Iva al 20% (credito)","0.2",,"False","percent","1601","1601","purchase","template_impcode_pagata_20","template_ivacode_pagata_20","template_impcode_pagata_20","template_ivacode_pagata_20"
-"10a","10a","l10n_it_chart_template_generic","Iva al 10% (debito)","0.1",,"False","percent","2601","2601","sale","template_impcode_riscossa_10","template_ivacode_riscossa_10","template_impcode_riscossa_10","template_ivacode_riscossa_10"
-"10b","10b","l10n_it_chart_template_generic","Iva al 10% (credito)","0.1",,"False","percent","1601","1601","purchase","template_impcode_pagata_10","template_ivacode_pagata_10","template_impcode_pagata_10","template_ivacode_pagata_10"
-"10AO","10AO","l10n_it_chart_template_generic","Iva al 10% indetraibile","1",,"True","percent",,,"purchase",,,,
-"10AOa","10AOa","l10n_it_chart_template_generic","Iva al 10% indetraibile (1)","0","10AO","False","percent","1601","1601","purchase","template_impcode_pagata_10ind","template_ivacode_pagata_10ind","template_impcode_pagata_10ind","template_ivacode_pagata_10ind"
-"10AOb","10AOb","l10n_it_chart_template_generic","Iva al 10% indetraibile (2)","0.1","10AO","False","percent",,,"purchase",,,,
-"12a","12a","l10n_it_chart_template_generic","Iva 12% (debito)","0.12",,"False","percent","2601","2601","sale","template_impcode_riscossa_12","template_ivacode_riscossa_12","template_impcode_riscossa_12","template_ivacode_riscossa_12"
-"12b","12b","l10n_it_chart_template_generic","Iva 12% (credito)","0.12",,"False","percent","1601","1601","purchase","template_impcode_pagata_12","template_ivacode_pagata_12","template_impcode_pagata_12","template_ivacode_pagata_12"
-"2010","2010","l10n_it_chart_template_generic","Iva al 20% detraibile 10%","1",,"True","percent",,,"purchase",,,,
-"2010a","2010a","l10n_it_chart_template_generic","Iva al 20% detraibile 10% (1)","0.02","2010","False","percent","1601","1601","purchase","template_impcode_pagata_20det10","template_ivacode_pagata_20det10","template_impcode_pagata_20det10","template_ivacode_pagata_20det10"
-"2010b","2010b","l10n_it_chart_template_generic","Iva al 20% detraibile 10% (2)","0.18","2010","False","percent",,,"purchase",,,,
-"2015","2015","l10n_it_chart_template_generic","Iva al 20% detraibile 15%","1",,"True","percent",,,"purchase",,,,
-"2015a","2015a","l10n_it_chart_template_generic","Iva al 20% detraibile 15% (1)","0.03","2015","False","percent","1601","1601","purchase","template_impcode_pagata_20det15","template_ivacode_pagata_20det15","template_impcode_pagata_20det15","template_ivacode_pagata_20det15"
-"2015b","2015b","l10n_it_chart_template_generic","Iva al 20% detraibile 15% (2)","0.17","2015","False","percent",,,"purchase",,,,
-"2040","2040","l10n_it_chart_template_generic","Iva al 20% detraibile 40%","1",,"True","percent",,,"purchase",,,,
-"2040a","2040a","l10n_it_chart_template_generic","Iva al 20% detraibile 40% (1)","0.08","2040","False","percent","1601","1601","purchase","template_impcode_pagata_20det40","template_ivacode_pagata_20det40","template_impcode_pagata_20det40","template_ivacode_pagata_20det40"
-"2040b","2040b","l10n_it_chart_template_generic","Iva al 20% detraibile 40% (2)","0.12","2040","False","percent",,,"purchase",,,,
-"20AO","20AO","l10n_it_chart_template_generic","Iva al 20% indetraibile","1",,"True","percent",,,"purchase",,,,
-"20AOa","20AOa","l10n_it_chart_template_generic","Iva al 20% indetraibile (1)","0","20AO","False","percent","1601","1601","purchase","template_impcode_pagata_20ind","template_ivacode_pagata_20ind","template_impcode_pagata_20ind","template_ivacode_pagata_20ind"
-"20AOb","20AOb","l10n_it_chart_template_generic","Iva al 20% indetraibile (2)","0.2","20AO","False","percent",,,"purchase",,,,
-"20I5","20I5","l10n_it_chart_template_generic","IVA al 20% detraibile al 50%","1",,"True","percent",,,"purchase",,,,
-"20I5a","20I5a","l10n_it_chart_template_generic","IVA al 20% detraibile al 50% (1)","0.1","20I5","False","percent","1601","1601","purchase","template_impcode_pagata_20det50","template_ivacode_pagata_20det50","template_impcode_pagata_20det50","template_ivacode_pagata_20det50"
-"20I5b","20I5b","l10n_it_chart_template_generic","IVA al 20% detraibile al 50% (2)","0.1","20I5","False","percent",,,"purchase",,,,
-"22a","22a","l10n_it_chart_template_generic","Iva 2% (debito)","0.02",,"False","percent","2601","2601","sale","template_impcode_riscossa_2","template_ivacode_riscossa_2","template_impcode_riscossa_2","template_ivacode_riscossa_2"
-"22b","22b","l10n_it_chart_template_generic","Iva 2% (credito)","0.02",,"False","percent","1601","1601","purchase","template_impcode_pagata_2","template_ivacode_pagata_2","template_impcode_pagata_2","template_ivacode_pagata_2"
-"4a","4a","l10n_it_chart_template_generic","Iva 4% (debito)","0.04",,"False","percent","2601","2601","sale","template_impcode_riscossa_4","template_ivacode_riscossa_4","template_impcode_riscossa_4","template_ivacode_riscossa_4"
-"4b","4b","l10n_it_chart_template_generic","Iva 4% (credito)","0.04",,"False","percent","1601","1601","purchase","template_impcode_pagata_4","template_ivacode_pagata_4","template_impcode_pagata_4","template_ivacode_pagata_4"
-"4AO","4AO","l10n_it_chart_template_generic","Iva al 4% indetraibile","1",,"True","percent",,,"purchase",,,,
-"4AOa","4AOa","l10n_it_chart_template_generic","Iva al 4% indetraibile (1)","0","4AO","False","percent","1601","1601","purchase","template_impcode_pagata_4ind","template_ivacode_pagata_4ind","template_impcode_pagata_4ind","template_ivacode_pagata_4ind"
-"4AOb","4AOb","l10n_it_chart_template_generic","Iva al 4% indetraibile (2)","0.04","4AO","False","percent",,,"purchase",,,,
-"10I5","10I5","l10n_it_chart_template_generic","IVA al 10% detraibile al 50%","1",,"True","percent",,,"purchase",,,,
-"10I5a","10I5a","l10n_it_chart_template_generic","IVA al 10% detraibile al 50% (1)","0.05","10I5","False","percent","1601","1601","purchase","template_impcode_pagata_10det50","template_ivacode_pagata_10det50","template_impcode_pagata_10det50","template_ivacode_pagata_10det50"
-"10I5b","10I5b","l10n_it_chart_template_generic","IVA al 10% detraibile al 50% (2)","0.05","10I5","False","percent",,,"purchase",,,,
-"4I5","4I5","l10n_it_chart_template_generic","IVA al 4% detraibile al 50%","1",,"True","percent",,,"purchase",,,,
-"4I5a","4I5a","l10n_it_chart_template_generic","IVA al 4% detraibile al 50% (1)","0.02","4I5","False","percent","1601","1601","purchase","template_impcode_pagata_4det50","template_ivacode_pagata_4det50","template_impcode_pagata_4det50","template_ivacode_pagata_4det50"
-"4I5b","4I5b","l10n_it_chart_template_generic","IVA al 4% detraibile al 50% (2)","0.02","4I5","False","percent",,,"purchase",,,,
-"00a","00a","l10n_it_chart_template_generic","Esente IVA (debito)","0",,"False","percent","2601","2601","sale","template_impcode_riscossa_0","template_ivacode_riscossa_0","template_impcode_riscossa_0","template_ivacode_riscossa_0"
-"00b","00b","l10n_it_chart_template_generic","Esente IVA (credito)","0",,"False","percent","1601","1601","purchase","template_impcode_pagata_0","template_ivacode_pagata_0","template_impcode_pagata_0","template_ivacode_pagata_0"
+id,description,chart_template_id:id,name,sequence,amount,parent_id:id,child_depend,type,account_collected_id:id,account_paid_id:id,type_tax_use,base_code_id:id,tax_code_id:id,ref_base_code_id:id,ref_tax_code_id:id,ref_base_sign,ref_tax_sign,price_include,base_sign,tax_sign
+21a,21a,l10n_it_chart_template_generic,Iva al 21% (debito),,0.21,,False,percent,2601,2601,sale,template_impcode_riscossa_21,template_ivacode_riscossa_21,template_impcode_riscossa_21,template_ivacode_riscossa_21,-1,-1,False,,
+21b,21b,l10n_it_chart_template_generic,Iva al 21% (credito),,0.21,,False,percent,1601,1601,purchase,template_impcode_pagata_21,template_ivacode_pagata_21,template_impcode_pagata_21,template_ivacode_pagata_21,,,False,-1,-1
+20a,20a,l10n_it_chart_template_generic,Iva al 20% (debito),,0.2,,False,percent,2601,2601,sale,template_impcode_riscossa_20,template_ivacode_riscossa_20,template_impcode_riscossa_20,template_ivacode_riscossa_20,-1,-1,False,,
+20b,20b,l10n_it_chart_template_generic,Iva al 20% (credito),,0.2,,False,percent,1601,1601,purchase,template_impcode_pagata_20,template_ivacode_pagata_20,template_impcode_pagata_20,template_ivacode_pagata_20,,,False,-1,-1
+10a,10a,l10n_it_chart_template_generic,Iva al 10% (debito),,0.1,,False,percent,2601,2601,sale,template_impcode_riscossa_10,template_ivacode_riscossa_10,template_impcode_riscossa_10,template_ivacode_riscossa_10,-1,-1,False,,
+10b,10b,l10n_it_chart_template_generic,Iva al 10% (credito),,0.1,,False,percent,1601,1601,purchase,template_impcode_pagata_10,template_ivacode_pagata_10,template_impcode_pagata_10,template_ivacode_pagata_10,,,False,-1,-1
+10AO,10AO,l10n_it_chart_template_generic,Iva al 10% indetraibile,,0.1,,True,percent,,,purchase,template_impcode_pagata_10ind,,template_impcode_pagata_10ind,,,,False,-1,-1
+10AOa,10AOa,l10n_it_chart_template_generic,Iva al 10% indetraibile (D),2,0,10AO,False,balance,1601,1601,purchase,,template_ivacode_pagata_10ind,,template_ivacode_pagata_10ind,,,False,,
+10AOb,10AOb,l10n_it_chart_template_generic,Iva al 10% indetraibile (I),1,1,10AO,False,percent,,,purchase,,,,,,,False,,
+12a,12a,l10n_it_chart_template_generic,Iva 12% (debito),,0.12,,False,percent,2601,2601,sale,template_impcode_riscossa_12,template_ivacode_riscossa_12,template_impcode_riscossa_12,template_ivacode_riscossa_12,-1,-1,False,,
+12b,12b,l10n_it_chart_template_generic,Iva 12% (credito),,0.12,,False,percent,1601,1601,purchase,template_impcode_pagata_12,template_ivacode_pagata_12,template_impcode_pagata_12,template_ivacode_pagata_12,,,False,-1,-1
+2010,2010,l10n_it_chart_template_generic,Iva al 20% detraibile 10%,,0.2,,True,percent,,,purchase,template_impcode_pagata_20det10,,template_impcode_pagata_20det10,,,,False,-1,-1
+2010a,2010a,l10n_it_chart_template_generic,Iva al 20% detraibile 10% (D),2,0,2010,False,balance,1601,1601,purchase,,template_ivacode_pagata_20det10,,template_ivacode_pagata_20det10,,,False,,
+2010b,2010b,l10n_it_chart_template_generic,Iva al 20% detraibile 10% (I),1,0.9,2010,False,percent,,,purchase,,,,,,,False,,
+2015,2015,l10n_it_chart_template_generic,Iva al 20% detraibile 15%,,0.2,,True,percent,,,purchase,template_impcode_pagata_20det15,,template_impcode_pagata_20det15,,,,False,-1,-1
+2015a,2015a,l10n_it_chart_template_generic,Iva al 20% detraibile 15% (D),2,0,2015,False,balance,1601,1601,purchase,,template_ivacode_pagata_20det15,,template_ivacode_pagata_20det15,,,False,,
+2015b,2015b,l10n_it_chart_template_generic,Iva al 20% detraibile 15% (I),1,0.85,2015,False,percent,,,purchase,,,,,,,False,,
+2040,2040,l10n_it_chart_template_generic,Iva al 20% detraibile 40%,,0.2,,True,percent,,,purchase,template_impcode_pagata_20det40,,template_impcode_pagata_20det40,,,,False,-1,-1
+2040a,2040a,l10n_it_chart_template_generic,Iva al 20% detraibile 40% (D),2,0,2040,False,balance,1601,1601,purchase,,template_ivacode_pagata_20det40,,template_ivacode_pagata_20det40,,,False,,
+2040b,2040b,l10n_it_chart_template_generic,Iva al 20% detraibile 40% (I),1,0.6,2040,False,percent,,,purchase,,,,,,,False,,
+20AO,20AO,l10n_it_chart_template_generic,Iva al 20% indetraibile,,0.2,,True,percent,,,purchase,template_impcode_pagata_20ind,,template_impcode_pagata_20ind,,,,False,-1,-1
+20AOa,20AOa,l10n_it_chart_template_generic,Iva al 20% indetraibile (D),2,0,20AO,False,balance,1601,1601,purchase,,template_ivacode_pagata_20ind,,template_ivacode_pagata_20ind,,,False,,
+20AOb,20AOb,l10n_it_chart_template_generic,Iva al 20% indetraibile (I),1,1,20AO,False,percent,,,purchase,,,,,,,False,,
+20I5,20I5,l10n_it_chart_template_generic,IVA al 20% detraibile al 50%,,0.2,,True,percent,,,purchase,template_impcode_pagata_20det50,,template_impcode_pagata_20det50,,,,False,-1,-1
+20I5b,20I5b,l10n_it_chart_template_generic,IVA al 20% detraibile al 50% (I),1,0.5,20I5,False,percent,,,purchase,,,,,,,False,,
+20I5a,20I5a,l10n_it_chart_template_generic,IVA al 20% detraibile al 50% (D),2,0,20I5,False,balance,1601,1601,purchase,,template_ivacode_pagata_20det50,,template_ivacode_pagata_20det50,,,False,,
+22a,22a,l10n_it_chart_template_generic,Iva 2% (debito),,0.02,,False,percent,2601,2601,sale,template_impcode_riscossa_2,template_ivacode_riscossa_2,template_impcode_riscossa_2,template_ivacode_riscossa_2,-1,-1,False,,
+22b,22b,l10n_it_chart_template_generic,Iva 2% (credito),,0.02,,False,percent,1601,1601,purchase,template_impcode_pagata_2,template_ivacode_pagata_2,template_impcode_pagata_2,template_ivacode_pagata_2,,,False,-1,-1
+4a,4a,l10n_it_chart_template_generic,Iva 4% (debito),,0.04,,False,percent,2601,2601,sale,template_impcode_riscossa_4,template_ivacode_riscossa_4,template_impcode_riscossa_4,template_ivacode_riscossa_4,-1,-1,False,,
+4b,4b,l10n_it_chart_template_generic,Iva 4% (credito),,0.04,,False,percent,1601,1601,purchase,template_impcode_pagata_4,template_ivacode_pagata_4,template_impcode_pagata_4,template_ivacode_pagata_4,,,False,-1,-1
+4AO,4AO,l10n_it_chart_template_generic,Iva al 4% indetraibile,,0.04,,True,percent,,,purchase,template_impcode_pagata_4ind,,template_impcode_pagata_4ind,,,,False,-1,-1
+4AOa,4AOa,l10n_it_chart_template_generic,Iva al 4% indetraibile (D),2,0,4AO,False,balance,1601,1601,purchase,,template_ivacode_pagata_4ind,,template_ivacode_pagata_4ind,,,False,,
+4AOb,4AOb,l10n_it_chart_template_generic,Iva al 4% indetraibile (I),1,1,4AO,False,percent,,,purchase,,,,,,,False,,
+10I5,10I5,l10n_it_chart_template_generic,IVA al 10% detraibile al 50%,,0.1,,True,percent,,,purchase,template_impcode_pagata_10det50,,template_impcode_pagata_10det50,,,,False,-1,-1
+10I5a,10I5a,l10n_it_chart_template_generic,IVA al 10% detraibile al 50% (D),2,0,10I5,False,balance,1601,1601,purchase,,template_ivacode_pagata_10det50,,template_ivacode_pagata_10det50,,,False,,
+10I5b,10I5b,l10n_it_chart_template_generic,IVA al 10% detraibile al 50% (I),1,0.5,10I5,False,percent,,,purchase,,,,,,,False,,
+4I5,4I5,l10n_it_chart_template_generic,IVA al 4% detraibile al 50%,,0.04,,True,percent,,,purchase,template_impcode_pagata_4det50,,template_impcode_pagata_4det50,,,,False,-1,-1
+4I5a,4I5a,l10n_it_chart_template_generic,IVA al 4% detraibile al 50% (D),2,0,4I5,False,balance,1601,1601,purchase,,template_ivacode_pagata_4det50,,template_ivacode_pagata_4det50,,,False,,
+4I5b,4I5b,l10n_it_chart_template_generic,IVA al 4% detraibile al 50% (I),1,0.5,4I5,False,percent,,,purchase,,,,,,,False,,
+00a,00a,l10n_it_chart_template_generic,Esente IVA (debito),,0,,False,percent,2601,2601,sale,template_impcode_riscossa_0,template_ivacode_riscossa_0,template_impcode_riscossa_0,template_ivacode_riscossa_0,-1,-1,False,,
+00b,00b,l10n_it_chart_template_generic,Esente IVA (credito),,0,,False,percent,1601,1601,purchase,template_impcode_pagata_0,template_ivacode_pagata_0,template_impcode_pagata_0,template_ivacode_pagata_0,,,False,-1,-1
+21a INC,21a INC,l10n_it_chart_template_generic,Iva al 21% (debito) INC,,0.21,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_21,l10n_it.template_ivacode_riscossa_21,l10n_it.template_impcode_riscossa_21,l10n_it.template_ivacode_riscossa_21,-1,-1,True,,
+20a INC,20a INC,l10n_it_chart_template_generic,Iva al 20% (debito) INC,,0.2,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_20,l10n_it.template_ivacode_riscossa_20,l10n_it.template_impcode_riscossa_20,l10n_it.template_ivacode_riscossa_20,-1,-1,True,,
+10a INC,10a INC,l10n_it_chart_template_generic,Iva al 10% (debito) INC,,0.1,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_10,l10n_it.template_ivacode_riscossa_10,l10n_it.template_impcode_riscossa_10,l10n_it.template_ivacode_riscossa_10,-1,-1,True,,
+12a INC,12a INC,l10n_it_chart_template_generic,Iva 12% (debito) INC,,0.12,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_12,l10n_it.template_ivacode_riscossa_12,l10n_it.template_impcode_riscossa_12,l10n_it.template_ivacode_riscossa_12,-1,-1,True,,
+22a INC,22a INC,l10n_it_chart_template_generic,Iva 2% (debito) INC,,0.02,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_2,l10n_it.template_ivacode_riscossa_2,l10n_it.template_impcode_riscossa_2,l10n_it.template_ivacode_riscossa_2,-1,-1,True,,
+4a INC,4a INC,l10n_it_chart_template_generic,Iva 4% (debito) INC,,0.04,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_4,l10n_it.template_ivacode_riscossa_4,l10n_it.template_impcode_riscossa_4,l10n_it.template_ivacode_riscossa_4,-1,-1,True,,
+00a INC,00a INC,l10n_it_chart_template_generic,Esente IVA (debito) INC,,0,,False,percent,l10n_it.2601,l10n_it.2601,sale,l10n_it.template_impcode_riscossa_0,l10n_it.template_ivacode_riscossa_0,l10n_it.template_impcode_riscossa_0,l10n_it.template_ivacode_riscossa_0,-1,-1,True,,
+2110,2110,l10n_it_chart_template_generic,Iva al 21% detraibile 10%,,0.21,,True,percent,,,purchase,template_impcode_pagata_21det10,,template_impcode_pagata_21det10,,,,False,-1,-1
+2110a,2110a,l10n_it_chart_template_generic,Iva al 21% detraibile 10% (D),2,0,2110,False,balance,1601,1601,purchase,,template_ivacode_pagata_21det10,,template_ivacode_pagata_21det10,,,False,,
+2110b,2110b,l10n_it_chart_template_generic,Iva al 21% detraibile 10% (I),1,0.9,2110,False,percent,,,purchase,,,,,,,False,,
+2115,2115,l10n_it_chart_template_generic,Iva al 21% detraibile 15%,,0.21,,True,percent,,,purchase,template_impcode_pagata_21det15,,template_impcode_pagata_21det15,,,,False,-1,-1
+2115a,2115a,l10n_it_chart_template_generic,Iva al 21% detraibile 15% (D),2,0,2115,False,balance,1601,1601,purchase,,template_ivacode_pagata_21det15,,template_ivacode_pagata_21det15,,,False,,
+2115b,2115b,l10n_it_chart_template_generic,Iva al 21% detraibile 15% (I),1,0.85,2115,False,percent,,,purchase,,,,,,,False,,
+2140,2140,l10n_it_chart_template_generic,Iva al 21% detraibile 40%,,0.21,,True,percent,,,purchase,template_impcode_pagata_21det40,,template_impcode_pagata_21det40,,,,False,-1,-1
+2140a,2140a,l10n_it_chart_template_generic,Iva al 21% detraibile 40% (D),2,0,2140,False,balance,1601,1601,purchase,,template_ivacode_pagata_21det40,,template_ivacode_pagata_21det40,,,False,,
+2140b,2140b,l10n_it_chart_template_generic,Iva al 21% detraibile 40% (I),1,0.6,2140,False,percent,,,purchase,,,,,,,False,,
+21AO,21AO,l10n_it_chart_template_generic,Iva al 21% indetraibile,,0.21,,True,percent,,,purchase,template_impcode_pagata_21ind,,template_impcode_pagata_21ind,,,,False,-1,-1
+21AOa,21AOa,l10n_it_chart_template_generic,Iva al 21% indetraibile (D),2,0,21AO,False,balance,1601,1601,purchase,,template_ivacode_pagata_21ind,,template_ivacode_pagata_21ind,,,False,,
+21AOb,21AOb,l10n_it_chart_template_generic,Iva al 21% indetraibile (I),1,1,21AO,False,percent,,,purchase,,,,,,,False,,
+21I5,21I5,l10n_it_chart_template_generic,IVA al 21% detraibile al 50%,,0.21,,True,percent,,,purchase,template_impcode_pagata_21det50,,template_impcode_pagata_21det50,,,,False,-1,-1
+21I5b,21I5b,l10n_it_chart_template_generic,IVA al 21% detraibile al 50% (I),1,0.5,21I5,False,percent,,,purchase,,,,,,,False,,
+21I5a,21I5a,l10n_it_chart_template_generic,IVA al 21% detraibile al 50% (D),2,0,21I5,False,balance,1601,1601,purchase,,template_ivacode_pagata_21det50,,template_ivacode_pagata_21det50,,,False,,
diff --git a/addons/l10n_it/i18n/ca.po b/addons/l10n_it/i18n/ca.po
index 67dff86ef1b..13ba50a2b99 100644
--- a/addons/l10n_it/i18n/ca.po
+++ b/addons/l10n_it/i18n/ca.po
@@ -7,20 +7,31 @@ msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
-"POT-Creation-Date: 2011-01-07 06:04+0000\n"
+"POT-Creation-Date: 2011-08-11 20:06+0000\n"
"PO-Revision-Date: 2011-02-15 15:37+0000\n"
"Last-Translator: FULL NAME \n"
"Language-Team: Catalan \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 05:57+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-11-25 05:22+0000\n"
+"X-Generator: Launchpad (build 14376)\n"
#. module: l10n_it
-#: model:ir.actions.report.xml,name:l10n_it.account_ita_libroIVA_debit
-msgid "Registro acquisti"
-msgstr "Resgistre de compres"
+#: model:ir.module.module,description:l10n_it.module_meta_information
+msgid ""
+"\n"
+" Piano dei conti italiano di un'impresa generica\n"
+" "
+msgstr ""
+"\n"
+" Pla comptable italià d'una empresa genèrica\n"
+" "
+
+#. module: l10n_it
+#: model:ir.module.module,shortdesc:l10n_it.module_meta_information
+msgid "Italy - Generic Chart of Accounts"
+msgstr "Itàlia - Pla general comptable"
#. module: l10n_it
#: model:ir.actions.todo,note:l10n_it.config_call_account_template_generic
@@ -43,132 +54,63 @@ msgstr ""
"pla comptable des d'una plantilla de pla comptable."
#. module: l10n_it
-#: view:account.report_libroiva:0
-msgid "Anno Fiscale"
-msgstr "Exercici fiscal"
-
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.it
-msgid "Italia"
-msgstr "Itàlia"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "REGISTRO IVA"
-msgstr "REGISTRE D'IVA"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Protocollo"
-msgstr "Protocol"
-
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.extra
-msgid "Regime Extra comunitario"
-msgstr "Règim extra comunitari"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-msgid "VENDITE"
-msgstr "VENDES"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Aliquota"
-msgstr "Taxa"
-
-#. module: l10n_it
-#: field:account.report_libroiva,company_id:0
-msgid "Company"
-msgstr "Companyia"
-
-#. module: l10n_it
-#: field:account.report_libroiva,name:0
-msgid "Fiscal year"
-msgstr "Exercici fiscal"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Numero"
-msgstr "Número"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Fornitore"
-msgstr "Proveïdor"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "ACQUISTI"
-msgstr "COMPRA"
-
-#. module: l10n_it
-#: model:ir.module.module,description:l10n_it.module_meta_information
-msgid ""
-"\n"
-" Piano dei conti italiano di un'impresa generica\n"
-" "
+#: model:ir.model,name:l10n_it.model_account_tax
+msgid "account.tax"
msgstr ""
-"\n"
-" Pla comptable italià d'una empresa genèrica\n"
-" "
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-msgid "Cliente"
-msgstr "Client"
+#~ msgid "VENDITE"
+#~ msgstr "VENDES"
-#. module: l10n_it
-#: model:ir.actions.report.xml,name:l10n_it.account_ita_libroIVA_credit
-msgid "Registro vendite"
-msgstr "Registre de vendes"
+#~ msgid "Aliquota"
+#~ msgstr "Taxa"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Periodo"
-msgstr "Període"
+#~ msgid "Registro acquisti"
+#~ msgstr "Resgistre de compres"
-#. module: l10n_it
-#: view:account.report_libroiva:0
-#: model:ir.actions.act_window,name:l10n_it.l10n_chart_it_report_libroIVA_action
-#: model:ir.ui.menu,name:l10n_it.menu_report_l10n_chart_it_libroIVA
-msgid "Registri IVA"
-msgstr "Registre d'IVA"
+#~ msgid "Protocollo"
+#~ msgstr "Protocol"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Imposta"
-msgstr "Impost"
+#~ msgid "REGISTRO IVA"
+#~ msgstr "REGISTRE D'IVA"
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.intra
-msgid "Regime Intra comunitario"
-msgstr "Règim intra comunitari"
+#~ msgid "Fornitore"
+#~ msgstr "Proveïdor"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Data fattura"
-msgstr "Data de la factura"
+#~ msgid "Numero"
+#~ msgstr "Número"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Imponibile"
-msgstr "Imponible"
+#~ msgid "Cliente"
+#~ msgstr "Client"
-#. module: l10n_it
-#: model:ir.module.module,shortdesc:l10n_it.module_meta_information
-msgid "Italy - Generic Chart of Accounts"
-msgstr "Itàlia - Pla general comptable"
+#~ msgid "Periodo"
+#~ msgstr "Període"
-#. module: l10n_it
-#: model:ir.model,name:l10n_it.model_account_report_libroiva
-msgid "SQL view for libro IVA"
-msgstr "Vista SQL pel llibre d'IVA"
+#~ msgid "Registro vendite"
+#~ msgstr "Registre de vendes"
+
+#~ msgid "Imposta"
+#~ msgstr "Impost"
+
+#~ msgid "Data fattura"
+#~ msgstr "Data de la factura"
+
+#~ msgid "Imponibile"
+#~ msgstr "Imponible"
+
+#~ msgid "SQL view for libro IVA"
+#~ msgstr "Vista SQL pel llibre d'IVA"
+
+#~ msgid "Company"
+#~ msgstr "Companyia"
+
+#~ msgid "Anno Fiscale"
+#~ msgstr "Exercici fiscal"
+
+#~ msgid "ACQUISTI"
+#~ msgstr "COMPRA"
+
+#~ msgid "Fiscal year"
+#~ msgstr "Exercici fiscal"
+
+#~ msgid "Registri IVA"
+#~ msgstr "Registre d'IVA"
diff --git a/addons/l10n_it/i18n/es.po b/addons/l10n_it/i18n/es.po
index aac5be72b68..ec8abd28572 100644
--- a/addons/l10n_it/i18n/es.po
+++ b/addons/l10n_it/i18n/es.po
@@ -7,20 +7,31 @@ msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
-"POT-Creation-Date: 2011-01-07 06:04+0000\n"
+"POT-Creation-Date: 2011-08-11 20:06+0000\n"
"PO-Revision-Date: 2011-02-15 15:37+0000\n"
"Last-Translator: FULL NAME \n"
"Language-Team: Spanish \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 05:57+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-11-25 05:22+0000\n"
+"X-Generator: Launchpad (build 14376)\n"
#. module: l10n_it
-#: model:ir.actions.report.xml,name:l10n_it.account_ita_libroIVA_debit
-msgid "Registro acquisti"
-msgstr "Registro de compras"
+#: model:ir.module.module,description:l10n_it.module_meta_information
+msgid ""
+"\n"
+" Piano dei conti italiano di un'impresa generica\n"
+" "
+msgstr ""
+"\n"
+" Plan contable italiano de una empresa genérica\n"
+" "
+
+#. module: l10n_it
+#: model:ir.module.module,shortdesc:l10n_it.module_meta_information
+msgid "Italy - Generic Chart of Accounts"
+msgstr "Italia - Plan General Contable"
#. module: l10n_it
#: model:ir.actions.todo,note:l10n_it.config_call_account_template_generic
@@ -43,132 +54,63 @@ msgstr ""
"Financiera/Generar Plan Contable a partir de una Plantilla de Plan."
#. module: l10n_it
-#: view:account.report_libroiva:0
-msgid "Anno Fiscale"
-msgstr "Año Fiscal"
-
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.it
-msgid "Italia"
-msgstr "Italia"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "REGISTRO IVA"
-msgstr "REGISTRO IVA"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Protocollo"
-msgstr "Protocolo"
-
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.extra
-msgid "Regime Extra comunitario"
-msgstr "Régimen Extra comunitario"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-msgid "VENDITE"
-msgstr "VENTAS"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Aliquota"
-msgstr "Tasa"
-
-#. module: l10n_it
-#: field:account.report_libroiva,company_id:0
-msgid "Company"
-msgstr "Compañía"
-
-#. module: l10n_it
-#: field:account.report_libroiva,name:0
-msgid "Fiscal year"
-msgstr "Ejercicio fiscal"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Numero"
-msgstr "Número"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Fornitore"
-msgstr "Proveedor"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "ACQUISTI"
-msgstr "COMPRA"
-
-#. module: l10n_it
-#: model:ir.module.module,description:l10n_it.module_meta_information
-msgid ""
-"\n"
-" Piano dei conti italiano di un'impresa generica\n"
-" "
+#: model:ir.model,name:l10n_it.model_account_tax
+msgid "account.tax"
msgstr ""
-"\n"
-" Plan contable italiano de una empresa genérica\n"
-" "
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-msgid "Cliente"
-msgstr "Cliente"
+#~ msgid "Company"
+#~ msgstr "Compañía"
-#. module: l10n_it
-#: model:ir.actions.report.xml,name:l10n_it.account_ita_libroIVA_credit
-msgid "Registro vendite"
-msgstr "Registro de ventas"
+#~ msgid "Aliquota"
+#~ msgstr "Tasa"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Periodo"
-msgstr "Período"
+#~ msgid "VENDITE"
+#~ msgstr "VENTAS"
-#. module: l10n_it
-#: view:account.report_libroiva:0
-#: model:ir.actions.act_window,name:l10n_it.l10n_chart_it_report_libroIVA_action
-#: model:ir.ui.menu,name:l10n_it.menu_report_l10n_chart_it_libroIVA
-msgid "Registri IVA"
-msgstr "Registro del IVA"
+#~ msgid "Anno Fiscale"
+#~ msgstr "Año Fiscal"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Imposta"
-msgstr "Impuesto"
+#~ msgid "Protocollo"
+#~ msgstr "Protocolo"
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.intra
-msgid "Regime Intra comunitario"
-msgstr "Régimen Intra Comunitario"
+#~ msgid "REGISTRO IVA"
+#~ msgstr "REGISTRO IVA"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Data fattura"
-msgstr "Fecha de la factura"
+#~ msgid "Fornitore"
+#~ msgstr "Proveedor"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Imponibile"
-msgstr "Imponible"
+#~ msgid "Numero"
+#~ msgstr "Número"
-#. module: l10n_it
-#: model:ir.module.module,shortdesc:l10n_it.module_meta_information
-msgid "Italy - Generic Chart of Accounts"
-msgstr "Italia - Plan General Contable"
+#~ msgid "Cliente"
+#~ msgstr "Cliente"
-#. module: l10n_it
-#: model:ir.model,name:l10n_it.model_account_report_libroiva
-msgid "SQL view for libro IVA"
-msgstr "Vista SQL para el libro del IVA"
+#~ msgid "Periodo"
+#~ msgstr "Período"
+
+#~ msgid "Registro vendite"
+#~ msgstr "Registro de ventas"
+
+#~ msgid "Imposta"
+#~ msgstr "Impuesto"
+
+#~ msgid "Registri IVA"
+#~ msgstr "Registro del IVA"
+
+#~ msgid "Data fattura"
+#~ msgstr "Fecha de la factura"
+
+#~ msgid "Imponibile"
+#~ msgstr "Imponible"
+
+#~ msgid "SQL view for libro IVA"
+#~ msgstr "Vista SQL para el libro del IVA"
+
+#~ msgid "Registro acquisti"
+#~ msgstr "Registro de compras"
+
+#~ msgid "ACQUISTI"
+#~ msgstr "COMPRA"
+
+#~ msgid "Fiscal year"
+#~ msgstr "Ejercicio fiscal"
diff --git a/addons/l10n_it/i18n/es_PY.po b/addons/l10n_it/i18n/es_PY.po
index ad857a18836..d05f707c30c 100644
--- a/addons/l10n_it/i18n/es_PY.po
+++ b/addons/l10n_it/i18n/es_PY.po
@@ -7,20 +7,31 @@ msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
-"POT-Creation-Date: 2011-01-07 06:04+0000\n"
+"POT-Creation-Date: 2011-08-11 20:06+0000\n"
"PO-Revision-Date: 2011-03-21 16:24+0000\n"
"Last-Translator: FULL NAME \n"
"Language-Team: Spanish (Paraguay) \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 05:57+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-11-25 05:22+0000\n"
+"X-Generator: Launchpad (build 14376)\n"
#. module: l10n_it
-#: model:ir.actions.report.xml,name:l10n_it.account_ita_libroIVA_debit
-msgid "Registro acquisti"
-msgstr "Registro de compras"
+#: model:ir.module.module,description:l10n_it.module_meta_information
+msgid ""
+"\n"
+" Piano dei conti italiano di un'impresa generica\n"
+" "
+msgstr ""
+"\n"
+" Plan contable italiano de una empresa genérica\n"
+" "
+
+#. module: l10n_it
+#: model:ir.module.module,shortdesc:l10n_it.module_meta_information
+msgid "Italy - Generic Chart of Accounts"
+msgstr "Italia - Plan General Contable"
#. module: l10n_it
#: model:ir.actions.todo,note:l10n_it.config_call_account_template_generic
@@ -43,132 +54,63 @@ msgstr ""
"plan contable a partir de una plantilla de plan contable."
#. module: l10n_it
-#: view:account.report_libroiva:0
-msgid "Anno Fiscale"
-msgstr "Año Fiscal"
-
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.it
-msgid "Italia"
-msgstr "Italia"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "REGISTRO IVA"
-msgstr "REGISTRO IVA"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Protocollo"
-msgstr "Protocolo"
-
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.extra
-msgid "Regime Extra comunitario"
-msgstr "Régimen Extra comunitario"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-msgid "VENDITE"
-msgstr "VENTAS"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Aliquota"
-msgstr "Tasa"
-
-#. module: l10n_it
-#: field:account.report_libroiva,company_id:0
-msgid "Company"
-msgstr "Compañía"
-
-#. module: l10n_it
-#: field:account.report_libroiva,name:0
-msgid "Fiscal year"
-msgstr "Ejercicio fiscal"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Numero"
-msgstr "Número"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Fornitore"
-msgstr "Proveedor"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "ACQUISTI"
-msgstr "COMPRA"
-
-#. module: l10n_it
-#: model:ir.module.module,description:l10n_it.module_meta_information
-msgid ""
-"\n"
-" Piano dei conti italiano di un'impresa generica\n"
-" "
+#: model:ir.model,name:l10n_it.model_account_tax
+msgid "account.tax"
msgstr ""
-"\n"
-" Plan contable italiano de una empresa genérica\n"
-" "
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-msgid "Cliente"
-msgstr "Cliente"
+#~ msgid "Aliquota"
+#~ msgstr "Tasa"
-#. module: l10n_it
-#: model:ir.actions.report.xml,name:l10n_it.account_ita_libroIVA_credit
-msgid "Registro vendite"
-msgstr "Registro de ventas"
+#~ msgid "Company"
+#~ msgstr "Compañía"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Periodo"
-msgstr "Período"
+#~ msgid "VENDITE"
+#~ msgstr "VENTAS"
-#. module: l10n_it
-#: view:account.report_libroiva:0
-#: model:ir.actions.act_window,name:l10n_it.l10n_chart_it_report_libroIVA_action
-#: model:ir.ui.menu,name:l10n_it.menu_report_l10n_chart_it_libroIVA
-msgid "Registri IVA"
-msgstr "Registro del IVA"
+#~ msgid "Anno Fiscale"
+#~ msgstr "Año Fiscal"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Imposta"
-msgstr "Impuesto"
+#~ msgid "Registro acquisti"
+#~ msgstr "Registro de compras"
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.intra
-msgid "Regime Intra comunitario"
-msgstr "Régimen Intra Comunitario"
+#~ msgid "Protocollo"
+#~ msgstr "Protocolo"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Data fattura"
-msgstr "Fecha de la factura"
+#~ msgid "REGISTRO IVA"
+#~ msgstr "REGISTRO IVA"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Imponibile"
-msgstr "Imponible"
+#~ msgid "Fornitore"
+#~ msgstr "Proveedor"
-#. module: l10n_it
-#: model:ir.module.module,shortdesc:l10n_it.module_meta_information
-msgid "Italy - Generic Chart of Accounts"
-msgstr "Italia - Plan General Contable"
+#~ msgid "ACQUISTI"
+#~ msgstr "COMPRA"
-#. module: l10n_it
-#: model:ir.model,name:l10n_it.model_account_report_libroiva
-msgid "SQL view for libro IVA"
-msgstr "Vista SQL para el libro del IVA"
+#~ msgid "Fiscal year"
+#~ msgstr "Ejercicio fiscal"
+
+#~ msgid "Numero"
+#~ msgstr "Número"
+
+#~ msgid "Cliente"
+#~ msgstr "Cliente"
+
+#~ msgid "Periodo"
+#~ msgstr "Período"
+
+#~ msgid "Registro vendite"
+#~ msgstr "Registro de ventas"
+
+#~ msgid "Imposta"
+#~ msgstr "Impuesto"
+
+#~ msgid "Registri IVA"
+#~ msgstr "Registro del IVA"
+
+#~ msgid "Data fattura"
+#~ msgstr "Fecha de la factura"
+
+#~ msgid "SQL view for libro IVA"
+#~ msgstr "Vista SQL para el libro del IVA"
+
+#~ msgid "Imponibile"
+#~ msgstr "Imponible"
diff --git a/addons/l10n_it/i18n/fr.po b/addons/l10n_it/i18n/fr.po
index 251c958420f..1582f87c77c 100644
--- a/addons/l10n_it/i18n/fr.po
+++ b/addons/l10n_it/i18n/fr.po
@@ -7,19 +7,27 @@ msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
-"POT-Creation-Date: 2011-01-07 06:04+0000\n"
+"POT-Creation-Date: 2011-08-11 20:06+0000\n"
"PO-Revision-Date: 2011-05-22 17:04+0000\n"
"Last-Translator: lholivier \n"
"Language-Team: French \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 05:57+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-11-25 05:22+0000\n"
+"X-Generator: Launchpad (build 14376)\n"
#. module: l10n_it
-#: model:ir.actions.report.xml,name:l10n_it.account_ita_libroIVA_debit
-msgid "Registro acquisti"
+#: model:ir.module.module,description:l10n_it.module_meta_information
+msgid ""
+"\n"
+" Piano dei conti italiano di un'impresa generica\n"
+" "
+msgstr ""
+
+#. module: l10n_it
+#: model:ir.module.module,shortdesc:l10n_it.module_meta_information
+msgid "Italy - Generic Chart of Accounts"
msgstr ""
#. module: l10n_it
@@ -35,129 +43,12 @@ msgid ""
msgstr ""
#. module: l10n_it
-#: view:account.report_libroiva:0
-msgid "Anno Fiscale"
+#: model:ir.model,name:l10n_it.model_account_tax
+msgid "account.tax"
msgstr ""
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.it
-msgid "Italia"
-msgstr ""
+#~ msgid "Company"
+#~ msgstr "Société"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "REGISTRO IVA"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Protocollo"
-msgstr ""
-
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.extra
-msgid "Regime Extra comunitario"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-msgid "VENDITE"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Aliquota"
-msgstr ""
-
-#. module: l10n_it
-#: field:account.report_libroiva,company_id:0
-msgid "Company"
-msgstr "Société"
-
-#. module: l10n_it
-#: field:account.report_libroiva,name:0
-msgid "Fiscal year"
-msgstr "Exercice fiscal"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Numero"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Fornitore"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "ACQUISTI"
-msgstr ""
-
-#. module: l10n_it
-#: model:ir.module.module,description:l10n_it.module_meta_information
-msgid ""
-"\n"
-" Piano dei conti italiano di un'impresa generica\n"
-" "
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-msgid "Cliente"
-msgstr ""
-
-#. module: l10n_it
-#: model:ir.actions.report.xml,name:l10n_it.account_ita_libroIVA_credit
-msgid "Registro vendite"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Periodo"
-msgstr ""
-
-#. module: l10n_it
-#: view:account.report_libroiva:0
-#: model:ir.actions.act_window,name:l10n_it.l10n_chart_it_report_libroIVA_action
-#: model:ir.ui.menu,name:l10n_it.menu_report_l10n_chart_it_libroIVA
-msgid "Registri IVA"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Imposta"
-msgstr ""
-
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.intra
-msgid "Regime Intra comunitario"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Data fattura"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Imponibile"
-msgstr ""
-
-#. module: l10n_it
-#: model:ir.module.module,shortdesc:l10n_it.module_meta_information
-msgid "Italy - Generic Chart of Accounts"
-msgstr ""
-
-#. module: l10n_it
-#: model:ir.model,name:l10n_it.model_account_report_libroiva
-msgid "SQL view for libro IVA"
-msgstr ""
+#~ msgid "Fiscal year"
+#~ msgstr "Exercice fiscal"
diff --git a/addons/l10n_it/i18n/gl.po b/addons/l10n_it/i18n/gl.po
index eede14878ce..a8cf6c6609e 100644
--- a/addons/l10n_it/i18n/gl.po
+++ b/addons/l10n_it/i18n/gl.po
@@ -7,20 +7,31 @@ msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
-"POT-Creation-Date: 2011-01-07 06:04+0000\n"
+"POT-Creation-Date: 2011-08-11 20:06+0000\n"
"PO-Revision-Date: 2011-02-25 11:41+0000\n"
"Last-Translator: FULL NAME \n"
"Language-Team: Galician \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 05:57+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-11-25 05:22+0000\n"
+"X-Generator: Launchpad (build 14376)\n"
#. module: l10n_it
-#: model:ir.actions.report.xml,name:l10n_it.account_ita_libroIVA_debit
-msgid "Registro acquisti"
-msgstr "Rexistro de compras"
+#: model:ir.module.module,description:l10n_it.module_meta_information
+msgid ""
+"\n"
+" Piano dei conti italiano di un'impresa generica\n"
+" "
+msgstr ""
+"\n"
+" Plan contable Italiano\n"
+" "
+
+#. module: l10n_it
+#: model:ir.module.module,shortdesc:l10n_it.module_meta_information
+msgid "Italy - Generic Chart of Accounts"
+msgstr "Italia - Plan Xeral Contable"
#. module: l10n_it
#: model:ir.actions.todo,note:l10n_it.config_call_account_template_generic
@@ -42,132 +53,63 @@ msgstr ""
"financeira/Xerar Plan Contable a partir dun modelo de plan."
#. module: l10n_it
-#: view:account.report_libroiva:0
-msgid "Anno Fiscale"
-msgstr "Exercicio fiscal"
-
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.it
-msgid "Italia"
-msgstr "Italia"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "REGISTRO IVA"
-msgstr "REXISTRO IVE"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Protocollo"
-msgstr "Protocolo"
-
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.extra
-msgid "Regime Extra comunitario"
-msgstr "Rexime Extra comunitario"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-msgid "VENDITE"
-msgstr "VENDAS"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Aliquota"
-msgstr "Taxa"
-
-#. module: l10n_it
-#: field:account.report_libroiva,company_id:0
-msgid "Company"
-msgstr "Compañía"
-
-#. module: l10n_it
-#: field:account.report_libroiva,name:0
-msgid "Fiscal year"
-msgstr "Exercicio fiscal"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Numero"
-msgstr "Número"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Fornitore"
-msgstr "Provedor"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "ACQUISTI"
-msgstr "Mercar"
-
-#. module: l10n_it
-#: model:ir.module.module,description:l10n_it.module_meta_information
-msgid ""
-"\n"
-" Piano dei conti italiano di un'impresa generica\n"
-" "
+#: model:ir.model,name:l10n_it.model_account_tax
+msgid "account.tax"
msgstr ""
-"\n"
-" Plan contable Italiano\n"
-" "
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-msgid "Cliente"
-msgstr "Cliente"
+#~ msgid "REGISTRO IVA"
+#~ msgstr "REXISTRO IVE"
-#. module: l10n_it
-#: model:ir.actions.report.xml,name:l10n_it.account_ita_libroIVA_credit
-msgid "Registro vendite"
-msgstr "Rexistro de vendas"
+#~ msgid "Aliquota"
+#~ msgstr "Taxa"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Periodo"
-msgstr "Período"
+#~ msgid "Company"
+#~ msgstr "Compañía"
-#. module: l10n_it
-#: view:account.report_libroiva:0
-#: model:ir.actions.act_window,name:l10n_it.l10n_chart_it_report_libroIVA_action
-#: model:ir.ui.menu,name:l10n_it.menu_report_l10n_chart_it_libroIVA
-msgid "Registri IVA"
-msgstr "Rexistro do IVE"
+#~ msgid "VENDITE"
+#~ msgstr "VENDAS"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Imposta"
-msgstr "Imposto"
+#~ msgid "Anno Fiscale"
+#~ msgstr "Exercicio fiscal"
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.intra
-msgid "Regime Intra comunitario"
-msgstr "Rexime Intra Comunitario"
+#~ msgid "Registro acquisti"
+#~ msgstr "Rexistro de compras"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Data fattura"
-msgstr "Data da factura"
+#~ msgid "Protocollo"
+#~ msgstr "Protocolo"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Imponibile"
-msgstr "Impoñible"
+#~ msgid "Fornitore"
+#~ msgstr "Provedor"
-#. module: l10n_it
-#: model:ir.module.module,shortdesc:l10n_it.module_meta_information
-msgid "Italy - Generic Chart of Accounts"
-msgstr "Italia - Plan Xeral Contable"
+#~ msgid "ACQUISTI"
+#~ msgstr "Mercar"
-#. module: l10n_it
-#: model:ir.model,name:l10n_it.model_account_report_libroiva
-msgid "SQL view for libro IVA"
-msgstr "Vista SQL para o libro do IVE"
+#~ msgid "Fiscal year"
+#~ msgstr "Exercicio fiscal"
+
+#~ msgid "Numero"
+#~ msgstr "Número"
+
+#~ msgid "Periodo"
+#~ msgstr "Período"
+
+#~ msgid "Cliente"
+#~ msgstr "Cliente"
+
+#~ msgid "Registro vendite"
+#~ msgstr "Rexistro de vendas"
+
+#~ msgid "Imposta"
+#~ msgstr "Imposto"
+
+#~ msgid "Registri IVA"
+#~ msgstr "Rexistro do IVE"
+
+#~ msgid "Data fattura"
+#~ msgstr "Data da factura"
+
+#~ msgid "Imponibile"
+#~ msgstr "Impoñible"
+
+#~ msgid "SQL view for libro IVA"
+#~ msgstr "Vista SQL para o libro do IVE"
diff --git a/addons/l10n_it/i18n/it.po b/addons/l10n_it/i18n/it.po
index 6035a0b7306..b12fa0ca4d3 100644
--- a/addons/l10n_it/i18n/it.po
+++ b/addons/l10n_it/i18n/it.po
@@ -1,110 +1,20 @@
-# Italian translation for openobject-addons
-# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
-# This file is distributed under the same license as the openobject-addons package.
-# FIRST AUTHOR , 2011.
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+# * l10n_it
#
msgid ""
msgstr ""
-"Project-Id-Version: openobject-addons\n"
-"Report-Msgid-Bugs-To: FULL NAME \n"
-"POT-Creation-Date: 2011-01-07 06:04+0000\n"
-"PO-Revision-Date: 2011-02-15 15:37+0000\n"
-"Last-Translator: FULL NAME \n"
-"Language-Team: Italian \n"
+"Project-Id-Version: OpenERP Server 6.0.2\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2011-08-11 20:06+0000\n"
+"PO-Revision-Date: 2011-11-24 10:54+0000\n"
+"Last-Translator: Olivier Dony (OpenERP) \n"
+"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 05:57+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
-
-#. module: l10n_it
-#: model:ir.actions.report.xml,name:l10n_it.account_ita_libroIVA_debit
-msgid "Registro acquisti"
-msgstr "Registro acquisti"
-
-#. module: l10n_it
-#: model:ir.actions.todo,note:l10n_it.config_call_account_template_generic
-msgid ""
-"Generate Chart of Accounts from a Chart Template. You will be asked to pass "
-"the name of the company, the chart template to follow, the no. of digits to "
-"generate the code for your accounts and Bank account, currency to create "
-"Journals. Thus,the pure copy of chart Template is generated.\n"
-"\tThis is the same wizard that runs from Financial "
-"Management/Configuration/Financial Accounting/Financial Accounts/Generate "
-"Chart of Accounts from a Chart Template."
-msgstr ""
-"Genera il Piano dei Conti da un Modello. Vi verrà richiesto di passare il "
-"nome dell'azienda, il modello da seguire, il numero di decimali per generare "
-"il codice dei tuoi conti e, per il conto della Banca, la valuta per creare "
-"il Libro Giornale. Così una copia vergine del Piano dei Conti, derivatante "
-"dal modello, viene generata.\n"
-"\tQuesto è la stessa procedura automatica che viene lanciata da: Gestione "
-"Finanziaria / Configurazione / Contabilità / Conti finanziari / Genera il "
-"Piano dei conti da un modello."
-
-#. module: l10n_it
-#: view:account.report_libroiva:0
-msgid "Anno Fiscale"
-msgstr "Anno Fiscale"
-
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.it
-msgid "Italia"
-msgstr "Italia"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "REGISTRO IVA"
-msgstr "REGISTRO IVA"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Protocollo"
-msgstr "Protocollo"
-
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.extra
-msgid "Regime Extra comunitario"
-msgstr "Regime Extra comunitario"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-msgid "VENDITE"
-msgstr "VENDITE"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Aliquota"
-msgstr "Aliquota"
-
-#. module: l10n_it
-#: field:account.report_libroiva,company_id:0
-msgid "Company"
-msgstr "Azienda"
-
-#. module: l10n_it
-#: field:account.report_libroiva,name:0
-msgid "Fiscal year"
-msgstr "Anno fiscale"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Numero"
-msgstr "Numero"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Fornitore"
-msgstr "Fornitore"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "ACQUISTI"
-msgstr "ACQUISTI"
+"X-Launchpad-Export-Date: 2011-11-25 05:22+0000\n"
+"X-Generator: Launchpad (build 14376)\n"
#. module: l10n_it
#: model:ir.module.module,description:l10n_it.module_meta_information
@@ -117,58 +27,88 @@ msgstr ""
" Piano dei conti italiano di un'impresa generica\n"
" "
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-msgid "Cliente"
-msgstr "Cliente"
-
-#. module: l10n_it
-#: model:ir.actions.report.xml,name:l10n_it.account_ita_libroIVA_credit
-msgid "Registro vendite"
-msgstr "Registro vendite"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Periodo"
-msgstr "Periodo"
-
-#. module: l10n_it
-#: view:account.report_libroiva:0
-#: model:ir.actions.act_window,name:l10n_it.l10n_chart_it_report_libroIVA_action
-#: model:ir.ui.menu,name:l10n_it.menu_report_l10n_chart_it_libroIVA
-msgid "Registri IVA"
-msgstr "Registri IVA"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Imposta"
-msgstr "Imposta"
-
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.intra
-msgid "Regime Intra comunitario"
-msgstr "Regime Intra comunitario"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Data fattura"
-msgstr "Data fattura"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Imponibile"
-msgstr "Imponibile"
-
#. module: l10n_it
#: model:ir.module.module,shortdesc:l10n_it.module_meta_information
msgid "Italy - Generic Chart of Accounts"
msgstr "Italia - Piano dei conti generico"
#. module: l10n_it
-#: model:ir.model,name:l10n_it.model_account_report_libroiva
-msgid "SQL view for libro IVA"
-msgstr "Vista SQL per registro IVA"
+#: model:ir.actions.todo,note:l10n_it.config_call_account_template_generic
+msgid ""
+"Generate Chart of Accounts from a Chart Template. You will be asked to pass "
+"the name of the company, the chart template to follow, the no. of digits to "
+"generate the code for your accounts and Bank account, currency to create "
+"Journals. Thus,the pure copy of chart Template is generated.\n"
+"\tThis is the same wizard that runs from Financial "
+"Management/Configuration/Financial Accounting/Financial Accounts/Generate "
+"Chart of Accounts from a Chart Template."
+msgstr ""
+"Genera il piano dei conti da un template. Verrà chiesto di indicare il nome "
+"dell'azienda, il piano dei conti da seguire, il numero di cifre per generare "
+"il codice dei conti, la valuta per creare i sezionali. Quindi, una semplice "
+"copia del template verrà generata.\n"
+"\tQuesto è lo stesso wizard che viene eseguito da "
+"Contabilità/Configurazione/Contabilità Generale/Assetto finanziario della "
+"nuova azienda"
+
+#. module: l10n_it
+#: model:ir.model,name:l10n_it.model_account_tax
+msgid "account.tax"
+msgstr "account.tax"
+
+#~ msgid "Aliquota"
+#~ msgstr "Aliquota"
+
+#~ msgid "Company"
+#~ msgstr "Azienda"
+
+#~ msgid "VENDITE"
+#~ msgstr "VENDITE"
+
+#~ msgid "Anno Fiscale"
+#~ msgstr "Anno Fiscale"
+
+#~ msgid "Registro acquisti"
+#~ msgstr "Registro acquisti"
+
+#~ msgid "Protocollo"
+#~ msgstr "Protocollo"
+
+#~ msgid "REGISTRO IVA"
+#~ msgstr "REGISTRO IVA"
+
+#~ msgid "Fornitore"
+#~ msgstr "Fornitore"
+
+#~ msgid "ACQUISTI"
+#~ msgstr "ACQUISTI"
+
+#~ msgid "Fiscal year"
+#~ msgstr "Anno fiscale"
+
+#~ msgid "Numero"
+#~ msgstr "Numero"
+
+#~ msgid "Cliente"
+#~ msgstr "Cliente"
+
+#~ msgid "Periodo"
+#~ msgstr "Periodo"
+
+#~ msgid "Registro vendite"
+#~ msgstr "Registro vendite"
+
+#~ msgid "Imposta"
+#~ msgstr "Imposta"
+
+#~ msgid "Registri IVA"
+#~ msgstr "Registri IVA"
+
+#~ msgid "Data fattura"
+#~ msgstr "Data fattura"
+
+#~ msgid "Imponibile"
+#~ msgstr "Imponibile"
+
+#~ msgid "SQL view for libro IVA"
+#~ msgstr "Vista SQL per registro IVA"
diff --git a/addons/l10n_it/i18n/l10n_it.pot b/addons/l10n_it/i18n/l10n_it.pot
index 7f210e4cd75..1c46674bb28 100644
--- a/addons/l10n_it/i18n/l10n_it.pot
+++ b/addons/l10n_it/i18n/l10n_it.pot
@@ -4,10 +4,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 6.0.0-rc2\n"
+"Project-Id-Version: OpenERP Server 6.0.2\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2011-01-07 06:04:30+0000\n"
-"PO-Revision-Date: 2011-01-07 06:04:30+0000\n"
+"POT-Creation-Date: 2011-08-11 20:06+0000\n"
+"PO-Revision-Date: 2011-08-11 20:06+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@@ -15,81 +15,6 @@ msgstr ""
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
-#. module: l10n_it
-#: model:ir.actions.report.xml,name:l10n_it.account_ita_libroIVA_debit
-msgid "Registro acquisti"
-msgstr ""
-
-#. module: l10n_it
-#: model:ir.actions.todo,note:l10n_it.config_call_account_template_generic
-msgid "Generate Chart of Accounts from a Chart Template. You will be asked to pass the name of the company, the chart template to follow, the no. of digits to generate the code for your accounts and Bank account, currency to create Journals. Thus,the pure copy of chart Template is generated.\n"
-" This is the same wizard that runs from Financial Management/Configuration/Financial Accounting/Financial Accounts/Generate Chart of Accounts from a Chart Template."
-msgstr ""
-
-#. module: l10n_it
-#: view:account.report_libroiva:0
-msgid "Anno Fiscale"
-msgstr ""
-
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.it
-msgid "Italia"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "REGISTRO IVA"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Protocollo"
-msgstr ""
-
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.extra
-msgid "Regime Extra comunitario"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-msgid "VENDITE"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Aliquota"
-msgstr ""
-
-#. module: l10n_it
-#: field:account.report_libroiva,company_id:0
-msgid "Company"
-msgstr ""
-
-#. module: l10n_it
-#: field:account.report_libroiva,name:0
-msgid "Fiscal year"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Numero"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Fornitore"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "ACQUISTI"
-msgstr ""
-
#. module: l10n_it
#: model:ir.module.module,description:l10n_it.module_meta_information
msgid "\n"
@@ -97,59 +22,19 @@ msgid "\n"
" "
msgstr ""
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-msgid "Cliente"
-msgstr ""
-
-#. module: l10n_it
-#: model:ir.actions.report.xml,name:l10n_it.account_ita_libroIVA_credit
-msgid "Registro vendite"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Periodo"
-msgstr ""
-
-#. module: l10n_it
-#: view:account.report_libroiva:0
-#: model:ir.actions.act_window,name:l10n_it.l10n_chart_it_report_libroIVA_action
-#: model:ir.ui.menu,name:l10n_it.menu_report_l10n_chart_it_libroIVA
-msgid "Registri IVA"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Imposta"
-msgstr ""
-
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.intra
-msgid "Regime Intra comunitario"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Data fattura"
-msgstr ""
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Imponibile"
-msgstr ""
-
#. module: l10n_it
#: model:ir.module.module,shortdesc:l10n_it.module_meta_information
msgid "Italy - Generic Chart of Accounts"
msgstr ""
#. module: l10n_it
-#: model:ir.model,name:l10n_it.model_account_report_libroiva
-msgid "SQL view for libro IVA"
+#: model:ir.actions.todo,note:l10n_it.config_call_account_template_generic
+msgid "Generate Chart of Accounts from a Chart Template. You will be asked to pass the name of the company, the chart template to follow, the no. of digits to generate the code for your accounts and Bank account, currency to create Journals. Thus,the pure copy of chart Template is generated.\n"
+" This is the same wizard that runs from Financial Management/Configuration/Financial Accounting/Financial Accounts/Generate Chart of Accounts from a Chart Template."
+msgstr ""
+
+#. module: l10n_it
+#: model:ir.model,name:l10n_it.model_account_tax
+msgid "account.tax"
msgstr ""
diff --git a/addons/l10n_it/i18n/pt_BR.po b/addons/l10n_it/i18n/pt_BR.po
index 7cabe3a4653..df9315127ae 100644
--- a/addons/l10n_it/i18n/pt_BR.po
+++ b/addons/l10n_it/i18n/pt_BR.po
@@ -7,20 +7,31 @@ msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
-"POT-Creation-Date: 2011-01-07 06:04+0000\n"
+"POT-Creation-Date: 2011-08-11 20:06+0000\n"
"PO-Revision-Date: 2011-03-10 23:11+0000\n"
"Last-Translator: Emerson \n"
"Language-Team: Brazilian Portuguese \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 05:57+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-11-25 05:22+0000\n"
+"X-Generator: Launchpad (build 14376)\n"
#. module: l10n_it
-#: model:ir.actions.report.xml,name:l10n_it.account_ita_libroIVA_debit
-msgid "Registro acquisti"
-msgstr "Registro acquisti"
+#: model:ir.module.module,description:l10n_it.module_meta_information
+msgid ""
+"\n"
+" Piano dei conti italiano di un'impresa generica\n"
+" "
+msgstr ""
+"\n"
+" Piano dei conti italiano di un'impresa generica\n"
+" "
+
+#. module: l10n_it
+#: model:ir.module.module,shortdesc:l10n_it.module_meta_information
+msgid "Italy - Generic Chart of Accounts"
+msgstr "Italy - Generic Chart of Accounts"
#. module: l10n_it
#: model:ir.actions.todo,note:l10n_it.config_call_account_template_generic
@@ -42,132 +53,63 @@ msgstr ""
"Chart of Accounts from a Chart Template."
#. module: l10n_it
-#: view:account.report_libroiva:0
-msgid "Anno Fiscale"
-msgstr "Anno Fiscale"
-
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.it
-msgid "Italia"
-msgstr "Italia"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "REGISTRO IVA"
-msgstr "REGISTRO IVA"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Protocollo"
-msgstr "Protocollo"
-
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.extra
-msgid "Regime Extra comunitario"
-msgstr "Regime Extra comunitario"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-msgid "VENDITE"
-msgstr "VENDITE"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Aliquota"
-msgstr "Aliquota"
-
-#. module: l10n_it
-#: field:account.report_libroiva,company_id:0
-msgid "Company"
-msgstr "Company"
-
-#. module: l10n_it
-#: field:account.report_libroiva,name:0
-msgid "Fiscal year"
-msgstr "Fiscal year"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Numero"
-msgstr "Numero"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Fornitore"
-msgstr "Fornitore"
-
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "ACQUISTI"
-msgstr "ACQUISTI"
-
-#. module: l10n_it
-#: model:ir.module.module,description:l10n_it.module_meta_information
-msgid ""
-"\n"
-" Piano dei conti italiano di un'impresa generica\n"
-" "
+#: model:ir.model,name:l10n_it.model_account_tax
+msgid "account.tax"
msgstr ""
-"\n"
-" Piano dei conti italiano di un'impresa generica\n"
-" "
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-msgid "Cliente"
-msgstr "Cliente"
+#~ msgid "Aliquota"
+#~ msgstr "Aliquota"
-#. module: l10n_it
-#: model:ir.actions.report.xml,name:l10n_it.account_ita_libroIVA_credit
-msgid "Registro vendite"
-msgstr "Registro vendite"
+#~ msgid "VENDITE"
+#~ msgstr "VENDITE"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Periodo"
-msgstr "Periodo"
+#~ msgid "Company"
+#~ msgstr "Company"
-#. module: l10n_it
-#: view:account.report_libroiva:0
-#: model:ir.actions.act_window,name:l10n_it.l10n_chart_it_report_libroIVA_action
-#: model:ir.ui.menu,name:l10n_it.menu_report_l10n_chart_it_libroIVA
-msgid "Registri IVA"
-msgstr "Registri IVA"
+#~ msgid "Anno Fiscale"
+#~ msgstr "Anno Fiscale"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Imposta"
-msgstr "Imposta"
+#~ msgid "Registro acquisti"
+#~ msgstr "Registro acquisti"
-#. module: l10n_it
-#: model:account.fiscal.position.template,name:l10n_it.intra
-msgid "Regime Intra comunitario"
-msgstr "Regime Intra comunitario"
+#~ msgid "Protocollo"
+#~ msgstr "Protocollo"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Data fattura"
-msgstr "Data fattura"
+#~ msgid "REGISTRO IVA"
+#~ msgstr "REGISTRO IVA"
-#. module: l10n_it
-#: report:l10n_it.report.libroIVA_credito:0
-#: report:l10n_it.report.libroIVA_debito:0
-msgid "Imponibile"
-msgstr "Imponibile"
+#~ msgid "Fiscal year"
+#~ msgstr "Fiscal year"
-#. module: l10n_it
-#: model:ir.module.module,shortdesc:l10n_it.module_meta_information
-msgid "Italy - Generic Chart of Accounts"
-msgstr "Italy - Generic Chart of Accounts"
+#~ msgid "Fornitore"
+#~ msgstr "Fornitore"
-#. module: l10n_it
-#: model:ir.model,name:l10n_it.model_account_report_libroiva
-msgid "SQL view for libro IVA"
-msgstr "SQL view for libro IVA"
+#~ msgid "Numero"
+#~ msgstr "Numero"
+
+#~ msgid "Cliente"
+#~ msgstr "Cliente"
+
+#~ msgid "Imposta"
+#~ msgstr "Imposta"
+
+#~ msgid "Periodo"
+#~ msgstr "Periodo"
+
+#~ msgid "Registri IVA"
+#~ msgstr "Registri IVA"
+
+#~ msgid "ACQUISTI"
+#~ msgstr "ACQUISTI"
+
+#~ msgid "Data fattura"
+#~ msgstr "Data fattura"
+
+#~ msgid "Imponibile"
+#~ msgstr "Imponibile"
+
+#~ msgid "Registro vendite"
+#~ msgstr "Registro vendite"
+
+#~ msgid "SQL view for libro IVA"
+#~ msgstr "SQL view for libro IVA"
diff --git a/addons/l10n_it/libroIVA.py b/addons/l10n_it/libroIVA.py
deleted file mode 100644
index a78c81ffdb3..00000000000
--- a/addons/l10n_it/libroIVA.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# -*- encoding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2010
-# Italian OpenERP Community ()
-# Servabit srl
-# Agile Business Group sagl
-# Domsense srl
-#
-# 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 .
-#
-##############################################################################
-
-
-# ##################################################################################
-# Questa vista SQL viene usata solo per far scegliere l'anno di pianificazione all'utente
-# Viene infatti costruita una vista XML di tipo tree che contiene solo i diversi anni per i quali stata fatta almeno una pianificazione
-# ##################################################################################
-
-from osv import fields, osv
-
-class l10n_chart_it_report_libroIVA (osv.osv):
- _name = "account.report_libroiva"
- _description = "SQL view for libro IVA"
- _auto = False
- _rec_name = "name"
- #_order = "fiscal_year";
-
- _columns = {
- 'name': fields.char('Fiscal year',size=64),
- 'company_id': fields.many2one('res.company', 'Company'),
- }
-
- def init (self, cr) :
- cr.execute("""DROP VIEW IF EXISTS account_report_libroiva""")
- cr.execute("""
- CREATE VIEW account_report_libroiva AS (
- SELECT id, name, company_id FROM account_fiscalyear
- )""")
-l10n_chart_it_report_libroIVA()
-
-
diff --git a/addons/l10n_it/libroIVA_menu.xml b/addons/l10n_it/libroIVA_menu.xml
deleted file mode 100644
index 51e581ac11c..00000000000
--- a/addons/l10n_it/libroIVA_menu.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/addons/l10n_it/libroIVA_view.xml b/addons/l10n_it/libroIVA_view.xml
deleted file mode 100644
index bbc905e6da0..00000000000
--- a/addons/l10n_it/libroIVA_view.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
- l10n_chart_it_report_libroIVA_tree
- account.report_libroiva
- tree
-
-
-
-
-
-
-
-
-
-
- l10n_chart_it_report_libroIVA_form
- account.report_libroiva
- form
-
-
-
-
-
-
-
-
-
- Registri IVA
- account.report_libroiva
-
- form
- tree,form
-
-
-
-
-
diff --git a/addons/l10n_it/report.xml b/addons/l10n_it/report.xml
deleted file mode 100644
index e0ba4a33daf..00000000000
--- a/addons/l10n_it/report.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/addons/l10n_it/report/__init__.py b/addons/l10n_it/report/__init__.py
deleted file mode 100644
index be32155c675..00000000000
--- a/addons/l10n_it/report/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-import libroIVA_credito
-import libroIVA_debito
\ No newline at end of file
diff --git a/addons/l10n_it/report/libroIVA_credito.py b/addons/l10n_it/report/libroIVA_credito.py
deleted file mode 100644
index b48c81d2475..00000000000
--- a/addons/l10n_it/report/libroIVA_credito.py
+++ /dev/null
@@ -1,79 +0,0 @@
-import datetime
-import time
-from report import report_sxw
-from osv import osv
-import pooler
-
-
-class l10n_chart_it_report_libroIVA_credito(report_sxw.rml_parse):
-
- def __init__(self, cr, uid, name, context):
- super(l10n_chart_it_report_libroIVA_credito,self).__init__(cr,uid,name,context)
- self.localcontext.update({
- 'time' : time,
- 'get_company' : self.get_company,
- 'get_periods' : self.get_periods,
- 'get_lines' : self.get_lines,
- })
-
-
- def get_company(self,fiscal_year):
- #print 'COMP = ',fiscal_year
- return ""
-
- def get_periods(self,fiscal_year):
- #print 'Fiscal year id:',fiscal_year.id
- obj=pooler.get_pool(self.cr.dbname).get('account.fiscalyear')
- fy=obj.browse(self.cr,self.uid,fiscal_year.id)
- #print 'Periods = ',fy.period_ids
- res=[rec for rec in fy.period_ids]
- #return fy.periods => non funziona?!? bool object !?!?
- return res
-
- def get_invoices(self,period):
- #print 'PERIOD = ',period.name
- obj=pooler.get_pool(self.cr.dbname).get('account.invoice')
- # Selezione tutte le fatture emesse nel periodo
- self.cr.execute( """
- SELECT id FROM account_invoice
- WHERE (state='open' OR state='paid') AND
- period_id="""+str(period.id)+"""
- AND (type='out_invoice' OR type='out_refund')
- """)
- ids=self.cr.fetchall()
- #print 'IDS = ',
- if ids:
- ids=[id[0] for id in ids ]
- invoices=obj.browse(self.cr,self.uid,ids)
- #print 'INVOICES = ',invoices
- return invoices
-
- def get_lines(self,fiscal_year):
- res=[]
- obj_fy=pooler.get_pool(self.cr.dbname).get('account.fiscalyear')
- fy=obj_fy.browse(self.cr,self.uid,fiscal_year.id)
- for period in fy.period_ids:
- invoices=self.get_invoices(period)
- for invoice in invoices:
- d={'periodo': period.name}
- d['protocollo']=invoice.number
- #print 'PARTNER ',invoice.partner_id.name
- causale=invoice.partner_id.name
- #print 'CAUSALE = ',causale
- d['causale']=causale
- d['numero']=invoice.reference
- d['data_doc']=invoice.date_invoice
- for tax in invoice.tax_line:
- #print '\tTAX: ',tax
- d['aliquota']=tax.tax_code_id.name
- d['imponibile']=tax.base
- d['imposta']=tax.amount
- res.append(d)
- d={'periodo':'', 'protocollo':'', 'causale':'', 'numero':'', 'data_doc':'', }
- return res
-
-
-
-report_sxw.report_sxw('report.l10n_it.report.libroIVA_credito','account.report_libroiva',
- 'l10n_it/report/libroIVA_credito.rml',
- parser=l10n_chart_it_report_libroIVA_credito,header=False)
diff --git a/addons/l10n_it/report/libroIVA_credito.rml b/addons/l10n_it/report/libroIVA_credito.rml
deleted file mode 100644
index 2b282f760b4..00000000000
--- a/addons/l10n_it/report/libroIVA_credito.rml
+++ /dev/null
@@ -1,203 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- [[ repeatIn(objects, 'o') ]]
-
-
-
-
- [[ get_company(o) ]]
-
-
-
-
- REGISTRO IVA
-
-
- VENDITE
-
-
-
-
-
-
-
- [[ o.name ]]
-
-
-
-
-
-
- Periodo
-
-
- Protocollo
-
-
- Cliente
-
-
- Numero
-
-
- Data fattura
-
-
- Aliquota
-
-
- Imponibile
-
-
- Imposta
-
-
-
-
- [[ repeatIn(get_lines(o), 'line') ]]
- [[ line['periodo'] ]]
-
-
- [[ line['protocollo'] ]]
-
-
- [[ line['causale'] ]]
-
-
- [[ line['numero'] ]]
-
-
- [[ line['data_doc'] ]]
-
-
- [[ line['aliquota'] ]]
-
-
- [[ line['imponibile'] ]]
-
-
- [[ line['imposta'] ]]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/addons/l10n_it/report/libroIVA_debito.py b/addons/l10n_it/report/libroIVA_debito.py
deleted file mode 100644
index c7720ab69a1..00000000000
--- a/addons/l10n_it/report/libroIVA_debito.py
+++ /dev/null
@@ -1,80 +0,0 @@
-import datetime
-import time
-from report import report_sxw
-from osv import osv
-import pooler
-
-
-class l10n_chart_it_report_libroIVA_debito(report_sxw.rml_parse):
-
- def __init__(self, cr, uid, name, context):
- super(l10n_chart_it_report_libroIVA_debito,self).__init__(cr,uid,name,context)
- self.localcontext.update({
- 'time' : time,
- 'get_company' : self.get_company,
- 'get_periods' : self.get_periods,
- 'get_lines' : self.get_lines,
- })
-
-
- def get_company(self,fiscal_year):
- #print 'COMP = ',fiscal_year
- return ""
-
-
- def get_periods(self,fiscal_year):
- #print 'Fiscal year id:',fiscal_year.id
- obj=pooler.get_pool(self.cr.dbname).get('account.fiscalyear')
- fy=obj.browse(self.cr,self.uid,fiscal_year.id)
- #print 'Periods = ',fy.period_ids
- res=[rec for rec in fy.period_ids]
- #return fy.periods => non funziona?!? bool object !?!?
- return res
-
- def get_invoices(self,period):
- #print 'PERIOD = ',period.name
- obj=pooler.get_pool(self.cr.dbname).get('account.invoice')
- # Selezione tutte le fatture emesse nel periodo
- self.cr.execute( """
- SELECT id FROM account_invoice
- WHERE (state='open' OR state='paid') AND
- period_id="""+str(period.id)+"""
- AND (type='in_invoice' OR type='in_refund')
- """)
- ids=self.cr.fetchall()
- #print 'IDS = ',
- if ids:
- ids=[id[0] for id in ids ]
- invoices=obj.browse(self.cr,self.uid,ids)
- #print 'INVOICES = ',invoices
- return invoices
-
- def get_lines(self,fiscal_year):
- res=[]
- obj_fy=pooler.get_pool(self.cr.dbname).get('account.fiscalyear')
- fy=obj_fy.browse(self.cr,self.uid,fiscal_year.id)
- for period in fy.period_ids:
- invoices=self.get_invoices(period)
- for invoice in invoices:
- d={'periodo': period.name}
- d['protocollo']=invoice.number
- #print 'PARTNER ',invoice.partner_id.name
- causale=invoice.partner_id.name
- #print 'CAUSALE = ',causale
- d['causale']=causale
- d['numero']=invoice.reference
- d['data_doc']=invoice.date_invoice
- for tax in invoice.tax_line:
- #print '\tTAX: ',tax
- d['aliquota']=tax.tax_code_id.name
- d['imponibile']=tax.base
- d['imposta']=tax.amount
- res.append(d)
- d={'periodo':'', 'protocollo':'', 'causale':'', 'numero':'', 'data_doc':'', }
- return res
-
-
-
-report_sxw.report_sxw('report.l10n_it.report.libroIVA_debito','account.report_libroiva',
- 'l10n_it/report/libroIVA_debito.rml',
- parser=l10n_chart_it_report_libroIVA_debito,header=False)
diff --git a/addons/l10n_it/report/libroIVA_debito.rml b/addons/l10n_it/report/libroIVA_debito.rml
deleted file mode 100644
index ced847722af..00000000000
--- a/addons/l10n_it/report/libroIVA_debito.rml
+++ /dev/null
@@ -1,195 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- [[ repeatIn(objects, 'o') ]]
-
-
-
-
- [[ get_company(o) ]]
-
-
-
-
- REGISTRO IVA
-
-
- ACQUISTI
-
-
-
-
-
-
-
- [[ o.name ]]
-
-
-
-
-
-
- Periodo
-
-
- Protocollo
-
-
- Fornitore
-
-
- Numero
-
-
- Data fattura
-
-
- Aliquota
-
-
- Imponibile
-
-
- Imposta
-
-
-
-
- [[ repeatIn(get_lines(o), 'line') ]]
- [[ line['periodo'] ]]
-
-
- [[ line['protocollo'] ]]
-
-
- [[ line['causale'] ]]
-
-
- [[ line['numero'] ]]
-
-
- [[ line['data_doc'] ]]
-
-
- [[ line['aliquota'] ]]
-
-
- [[ line['imponibile'] ]]
-
-
- [[ line['imposta'] ]]
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/addons/l10n_it/report/normalized_oo2rml.xsl b/addons/l10n_it/report/normalized_oo2rml.xsl
deleted file mode 100644
index 14fcf598e54..00000000000
--- a/addons/l10n_it/report/normalized_oo2rml.xsl
+++ /dev/null
@@ -1,696 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- (
-
- ,
-
- )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ,
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- white
-
-
-
-
-
-
-
-
-
-
- .........
-
-
-
-
-
-
-
-
-
-
-
-
- 15
- 0
-
-
-
-
-
-
-
-
-
- 6
-
-
-
-
-
- ZapfDingbats
- l
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- .
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- yes
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- LEFT
-
-
- CENTER
-
-
- RIGHT
-
-
- JUSTIFY
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Courier-BoldOblique
-
-
- Courier-Bold
-
-
- Courier-Oblique
-
-
- Courier
-
-
-
-
-
-
- Helvetica-BoldOblique
-
-
- Helvetica-Bold
-
-
- Helvetica-Oblique
-
-
- Helvetica
-
-
-
-
-
-
- Times-BoldItalic
-
-
- Times-Bold
-
-
- Times-Italic
-
-
- Times-Roman
-
-
-
-
-
-
-
- Times-Roman
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/addons/l10n_it/security/ir.model.access.csv b/addons/l10n_it/security/ir.model.access.csv
deleted file mode 100644
index 8a8908511db..00000000000
--- a/addons/l10n_it/security/ir.model.access.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_l10n_it_report_manager","l10n_it.report account manager","model_account_report_libroiva","account.group_account_manager",1,1,1,1
-"access_l10n_it_report_user","l10n_it_report account user","model_account_report_libroiva","account.group_account_user",1,1,1,1
diff --git a/addons/l10n_lu/__openerp__.py b/addons/l10n_lu/__openerp__.py
index 7a4436e31c1..fdb9240c63c 100644
--- a/addons/l10n_lu/__openerp__.py
+++ b/addons/l10n_lu/__openerp__.py
@@ -21,9 +21,9 @@
{
- 'name': 'Luxembourg - Plan Comptable Minimum Normalise',
+ 'name': 'Luxembourg - Accounting',
'version': '1.0',
- 'category': 'Localization/Account Charts',
+ 'category': 'Localization',
'description': """
This is the base module to manage the accounting chart for Luxembourg.
======================================================================
diff --git a/addons/l10n_ma/__init__.py b/addons/l10n_ma/__init__.py
index 35aef5a2c44..070b09bdf33 100644
--- a/addons/l10n_ma/__init__.py
+++ b/addons/l10n_ma/__init__.py
@@ -21,3 +21,5 @@
import l10n_ma
import report
import wizard
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_ma/__openerp__.py b/addons/l10n_ma/__openerp__.py
index a9bd7ce557e..d1d2c5900c9 100644
--- a/addons/l10n_ma/__openerp__.py
+++ b/addons/l10n_ma/__openerp__.py
@@ -20,10 +20,10 @@
##############################################################################
{
- "name" : "Maroc - Plan Comptable Général",
+ "name" : "Maroc - Accounting",
"version" : "1.0",
"author" : "kazacube",
- "category" : "Localization/Account Charts",
+ "category" : "Localization",
"description": """
This is the base module to manage the accounting chart for Maroc.
=================================================================
diff --git a/addons/l10n_ma/security/ir.model.access.csv b/addons/l10n_ma/security/ir.model.access.csv
index da5da5f48a2..2c89d1d3692 100644
--- a/addons/l10n_ma/security/ir.model.access.csv
+++ b/addons/l10n_ma/security/ir.model.access.csv
@@ -1,5 +1,3 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_l10n_ma_report_manager","l10n_ma.report account manager","model_l10n_ma_report","account.group_account_manager",1,1,1,1
-"access_l10n_ma_report_user","l10n_ma_report account user","model_l10n_ma_report","account.group_account_user",1,1,1,1
-"access_l10n_ma_line_manager","l10n_ma_line account manager","model_l10n_ma_line","account.group_account_manager",1,1,1,1
-"access_l10n_ma_line_user","l10n_ma.l10n_ma_line_account user","model_l10n_ma_line","account.group_account_user",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_l10n_ma_report_user,l10n_ma_report account user,model_l10n_ma_report,account.group_account_user,1,1,1,1
+access_l10n_ma_line_user,l10n_ma.l10n_ma_line_account user,model_l10n_ma_line,account.group_account_user,1,1,1,1
diff --git a/addons/l10n_multilang/__init__.py b/addons/l10n_multilang/__init__.py
new file mode 100644
index 00000000000..446f3beb668
--- /dev/null
+++ b/addons/l10n_multilang/__init__.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# 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 .
+#
+##############################################################################
+
+import account
+import l10n_multilang
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_multilang/__openerp__.py b/addons/l10n_multilang/__openerp__.py
new file mode 100644
index 00000000000..f7c3b4db1d7
--- /dev/null
+++ b/addons/l10n_multilang/__openerp__.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# 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 .
+#
+##############################################################################
+
+{
+ "name" : "Multi Language Chart of Accounts",
+ "version" : "1.1",
+ "author" : "OpenERP SA",
+ "category": 'Hidden/Dependency',
+ "description": """
+ * Multi language support for Chart of Accounts, Taxes, Tax Codes , Journals, Accounting Templates,
+ Analytic Chart of Accounts and Analytic Journals.
+ * Setup wizard changes
+ - Copy translations for COA, Tax, Tax Code and Fiscal Position from templates to target objects.
+ """,
+ 'website': 'http://www.openerp.com',
+ 'init_xml': [],
+ "depends" : ['account_accountant'],
+ 'update_xml': [
+ ],
+ 'demo_xml': [
+ ],
+ 'installable': True,
+ 'active': False,
+}
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_multilang/account.py b/addons/l10n_multilang/account.py
new file mode 100644
index 00000000000..162abb0447f
--- /dev/null
+++ b/addons/l10n_multilang/account.py
@@ -0,0 +1,107 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# 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 .
+#
+##############################################################################
+
+
+from osv import fields, osv
+from tools.translate import _
+
+
+#in this file, we mostly add the tag translate=True on existing fields that we now want to be translated
+
+class account_account_template(osv.osv):
+ _inherit = 'account.account.template'
+ _columns = {
+ 'name': fields.char('Name', size=128, required=True, select=True, translate=True),
+ }
+account_account_template()
+
+class account_tax(osv.osv):
+ _inherit = 'account.tax'
+ _columns = {
+ 'name': fields.char('Tax Name', size=128, required=True, select=True, translate=True),
+ }
+account_tax()
+
+
+class account_tax_template(osv.osv):
+ _inherit = 'account.tax.template'
+ _columns = {
+ 'name': fields.char('Tax Name', size=128, required=True, select=True, translate=True),
+ }
+account_tax_template()
+
+
+class account_tax_code_template(osv.osv):
+ _inherit = 'account.tax.code.template'
+ _columns = {
+ 'name': fields.char('Tax Case Name', size=64, required=True, translate=True),
+ }
+account_tax_code_template()
+
+
+class account_chart_template(osv.osv):
+ _inherit = 'account.chart.template'
+ _columns={
+ 'name': fields.char('Name', size=64, required=True, translate=True),
+ 'spoken_languages': fields.char('Spoken Languages', size=64, help="State here the languages for which the translations of templates could be loaded at the time of installation of this localization module and copied in the final object when generating them from templates. You must provide the language codes separated by ';'"),
+ }
+ _order = 'name'
+account_chart_template()
+
+
+class account_fiscal_position(osv.osv):
+ _inherit = 'account.fiscal.position'
+ _columns = {
+ 'name': fields.char('Fiscal Position', size=64, required=True, translate=True),
+ }
+account_fiscal_position()
+
+
+class account_fiscal_position_template(osv.osv):
+ _inherit = 'account.fiscal.position.template'
+ _columns = {
+ 'name': fields.char('Fiscal Position Template', size=64, required=True, translate=True),
+ }
+account_fiscal_position_template()
+
+
+class account_journal(osv.osv):
+ _inherit = 'account.journal'
+ _columns = {
+ 'name': fields.char('Journal Name', size=64, required=True, translate=True),
+ }
+account_journal()
+
+
+class account_analytic_account(osv.osv):
+ _inherit = 'account.analytic.account'
+ _columns = {
+ 'name': fields.char('Account Name', size=128, required=True, translate=True),
+ }
+account_analytic_account()
+
+
+class account_analytic_journal(osv.osv):
+ _inherit = 'account.analytic.journal'
+ _columns = {
+ 'name': fields.char('Journal Name', size=64, required=True, translate=True),
+ }
+account_analytic_journal()
diff --git a/addons/l10n_multilang/l10n_multilang.py b/addons/l10n_multilang/l10n_multilang.py
new file mode 100644
index 00000000000..c4130f2761d
--- /dev/null
+++ b/addons/l10n_multilang/l10n_multilang.py
@@ -0,0 +1,156 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# 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 .
+#
+##############################################################################
+
+from osv import fields, osv
+import os
+from tools.translate import _
+import netsvc
+logger=netsvc.Logger()
+
+class wizard_multi_charts_accounts(osv.osv_memory):
+ """
+ Change wizard that a new account chart for a company.
+ * Add option to install languages during the setup
+ * Copy translations for COA, Tax, Tax Code and Fiscal Position from templates to target objects.
+ """
+ _inherit = 'wizard.multi.charts.accounts'
+
+ def process_translations(self, cr, uid, langs, in_obj, in_field, in_ids, out_obj, out_ids, force_write=False, context=None):
+ """
+ This method copies translations values of templates into new Accounts/Taxes/Journals for languages selected
+
+ :param cr: A database cursor
+ :param uid: ID of the user currently logged in
+ :param langs: List of languages to load for new records
+ :param in_field: Name of the translatable field of source templates
+ :param in_obj: Name of source object of templates.
+ :param in_ids: List of ids of source object
+ :param out_obj: Destination object for which translation is to be copied
+ :param out_ids: List of ids of destination object
+ :param force_write: boolean that depicts if we need to create a translation OR simply replace the actual value
+ with the translation in the uid's language by doing a write (in case it's TRUE)
+ :param context: usual context information. May contain the key 'lang', which is the language of the user running
+ the wizard, that will be used if force_write is True
+
+ :return: True
+ """
+ if context is None:
+ context = {}
+ src = {}
+ xlat_obj = self.pool.get('ir.translation')
+ #find the source from Account Template
+ for x in in_obj.browse(cr, uid, in_ids):
+ src.update({x.id: x.name})
+ for lang in langs:
+ #find the value from Translation
+ value = xlat_obj._get_ids(cr, uid, in_obj._name + ',' + in_field, 'model', lang, in_ids)
+ for j in range(len(in_ids)):
+ in_id = in_ids[j]
+ if value[in_id]:
+ if not force_write:
+ #copy Translation from Source to Destination object
+ xlat_obj.create(cr, uid, {
+ 'name': out_obj._name + ',' + in_field,
+ 'type': 'model',
+ 'res_id': out_ids[j],
+ 'lang': lang,
+ 'src': src[in_id],
+ 'value': value[in_id],
+ })
+ else:
+ #replace the value in the destination object only if it's the user lang
+ if context.get('lang') == lang:
+ self.pool.get(out_obj._name).write(cr, uid, out_ids[j], {in_field: value[in_id]})
+ else:
+ logger.notifyChannel('addons.'+self._name, netsvc.LOG_WARNING,
+ 'Language: %s. Translation from template: there is no translation available for %s!' %(lang, src[in_id]))#out_obj._name))
+ return True
+
+ def execute(self, cr, uid, ids, context=None):
+ res = super(wizard_multi_charts_accounts, self).execute(cr, uid, ids, context=context)
+
+ obj_multi = self.browse(cr, uid, ids[0], context=context)
+ company_id = obj_multi.company_id.id
+
+ # load languages
+ langs = []
+ res_lang_obj = self.pool.get('res.lang')
+ installed_lang_ids = res_lang_obj.search(cr, uid, [])
+ installed_langs = [x.code for x in res_lang_obj.browse(cr, uid, installed_lang_ids, context=context)]
+ if obj_multi.chart_template_id.spoken_languages:
+ for lang in obj_multi.chart_template_id.spoken_languages.split(';'):
+ if lang not in installed_langs:
+ # the language is not installed, so we don't need to load its translations
+ continue
+ else:
+ # the language was already installed, so the po files have been loaded at the installation time
+ # and now we need to copy the translations of templates to the right objects
+ langs.append(lang)
+ if langs:
+ # write account.account translations in the real COA
+ self._process_accounts_translations(cr, uid, obj_multi, company_id, langs, 'name', context=context)
+
+ # copy account.tax.code translations
+ self._process_tax_codes_translations(cr, uid, obj_multi, company_id, langs, 'name', context=context)
+
+ # copy account.tax translations
+ self._process_taxes_translations(cr, uid, obj_multi, company_id, langs, 'name', context=context)
+
+ # copy account.fiscal.position translations
+ self._process_fiscal_pos_translations(cr, uid, obj_multi, company_id, langs, 'name', context=context)
+
+ return res
+
+ def _process_accounts_translations(self, cr, uid, obj_multi, company_id, langs, field, context=None):
+ obj_acc_template = self.pool.get('account.account.template')
+ obj_acc = self.pool.get('account.account')
+ acc_template_root_id = obj_multi.chart_template_id.account_root_id.id
+ acc_root_id = obj_acc.search(cr, uid, [('company_id', '=', company_id), ('parent_id', '=', None)])[0]
+ in_ids = obj_acc_template.search(cr, uid, [('id', 'child_of', [acc_template_root_id])], order='id')[1:]
+ out_ids = obj_acc.search(cr, uid, [('id', 'child_of', [acc_root_id])], order='id')[1:]
+ return self.process_translations(cr, uid, langs, obj_acc_template, field, in_ids, obj_acc, out_ids, force_write=True, context=context)
+
+ def _process_tax_codes_translations(self, cr, uid, obj_multi, company_id, langs, field, context=None):
+ obj_tax_code_template = self.pool.get('account.tax.code.template')
+ obj_tax_code = self.pool.get('account.tax.code')
+ tax_code_template_root_id = obj_multi.chart_template_id.tax_code_root_id.id
+ tax_code_root_id = obj_tax_code.search(cr, uid, [('company_id', '=', company_id), ('parent_id', '=', None)])[0]
+ in_ids = obj_tax_code_template.search(cr, uid, [('id', 'child_of', [tax_code_template_root_id])], order='id')[1:]
+ out_ids = obj_tax_code.search(cr, uid, [('id', 'child_of', [tax_code_root_id])], order='id')[1:]
+ return self.process_translations(cr, uid, langs, obj_tax_code_template, field, in_ids, obj_tax_code, out_ids, force_write=False, context=context)
+
+ def _process_taxes_translations(self, cr, uid, obj_multi, company_id, langs, field, context=None):
+ obj_tax_template = self.pool.get('account.tax.template')
+ obj_tax = self.pool.get('account.tax')
+ in_ids = sorted([x.id for x in obj_multi.chart_template_id.tax_template_ids])
+ out_ids = obj_tax.search(cr, uid, [('company_id', '=', company_id)], order='id')
+ return self.process_translations(cr, uid, langs, obj_tax_template, field, in_ids, obj_tax, out_ids, force_write=False, context=context)
+
+ def _process_fiscal_pos_translations(self, cr, uid, obj_multi, company_id, langs, field, context=None):
+ obj_fiscal_position_template = self.pool.get('account.fiscal.position.template')
+ obj_fiscal_position = self.pool.get('account.fiscal.position')
+ in_ids = obj_fiscal_position_template.search(cr, uid, [('chart_template_id', '=', obj_multi.chart_template_id.id)], order='id')
+ out_ids = obj_fiscal_position.search(cr, uid, [('company_id', '=', company_id)], order='id')
+ return self.process_translations(cr, uid, langs, obj_fiscal_position_template, field, in_ids, obj_fiscal_position, out_ids, force_write=False, context=context)
+
+wizard_multi_charts_accounts()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_mx/__openerp__.py b/addons/l10n_mx/__openerp__.py
index d56d5f570b1..1e8c3bdc9c8 100644
--- a/addons/l10n_mx/__openerp__.py
+++ b/addons/l10n_mx/__openerp__.py
@@ -20,10 +20,10 @@
#
##############################################################################
{
- "name" : "Mexico - Chart of Account",
+ "name" : "Mexico - Accounting",
"version" : "1.0",
"author" : "RelTek Mexico",
- "category" : "Localization/Account Charts",
+ "category" : "Localization",
"description": """
This is the module to manage the accounting chart for Mexico in OpenERP.
========================================================================
diff --git a/addons/l10n_nl/__openerp__.py b/addons/l10n_nl/__openerp__.py
index 5635e16d6c3..951a8e45c68 100644
--- a/addons/l10n_nl/__openerp__.py
+++ b/addons/l10n_nl/__openerp__.py
@@ -86,9 +86,9 @@
# Changed naming of 7020 and 7030 to Kostprijs omzet xxxx
{
- "name" : "Netherlands - Grootboek en BTW rekeningen",
+ "name" : "Netherlands - Accounting",
"version" : "1.5",
- "category": "Localization/Account Charts",
+ "category": "Localization",
"description": """
This is the module to manage the accounting chart for Netherlands in OpenERP.
=============================================================================
diff --git a/addons/l10n_pl/__openerp__.py b/addons/l10n_pl/__openerp__.py
index 0ec97ab7cb6..f9acc28db9e 100644
--- a/addons/l10n_pl/__openerp__.py
+++ b/addons/l10n_pl/__openerp__.py
@@ -21,11 +21,11 @@
#
##############################################################################
{
- "name" : "Poland - Chart of Accounts",
+ "name" : "Poland - Accounting",
"version" : "1.0",
"author" : "Grzegorz Grzelak (Cirrus)",
"website": "http://www.cirrus.pl",
- "category" : "Localization/Account Charts",
+ "category" : "Localization",
"description": """
This is the module to manage the accounting chart and taxes for Poland in OpenERP.
==================================================================================
diff --git a/addons/l10n_ro/__openerp__.py b/addons/l10n_ro/__openerp__.py
index 647b4b35449..69886777879 100644
--- a/addons/l10n_ro/__openerp__.py
+++ b/addons/l10n_ro/__openerp__.py
@@ -20,11 +20,11 @@
#
##############################################################################
{
- "name" : "Romania - Chart of Accounts",
+ "name" : "Romania - Accounting",
"version" : "1.1",
"author" : "filsys",
"website": "http://www.filsystem.ro",
- "category" : "Localization/Account Charts",
+ "category" : "Localization",
"depends" : ["account_chart", 'base_vat'],
"description": """
This is the module to manage the accounting chart, VAT structure and Registration Number for Romania in OpenERP.
diff --git a/addons/l10n_ro/res_partner.py b/addons/l10n_ro/res_partner.py
index f5521844a49..009aa76b62f 100644
--- a/addons/l10n_ro/res_partner.py
+++ b/addons/l10n_ro/res_partner.py
@@ -30,3 +30,5 @@ class res_partner(osv.osv):
'nrc' : fields.char('NRC', size=16, help='Registration number at the Registry of Commerce'),
}
res_partner()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_syscohada/__openerp__.py b/addons/l10n_syscohada/__openerp__.py
index 0fa4631b1f1..197199092c9 100644
--- a/addons/l10n_syscohada/__openerp__.py
+++ b/addons/l10n_syscohada/__openerp__.py
@@ -20,10 +20,10 @@
##############################################################################
{
- "name" : "OHADA - The accounting chart ",
+ "name" : "OHADA - Accounting",
"version" : "1.0",
"author" : "Baamtu Senegal",
- "category" : "Localization/Account Charts",
+ "category" : "Localization",
"description": """This module implements the accounting chart for OHADA area.
It allows any company or association to manage its financial accounting.
Countries that use OHADA are the following:
diff --git a/addons/l10n_th/__init__.py b/addons/l10n_th/__init__.py
index 45de899ed49..a4a5d907c6b 100644
--- a/addons/l10n_th/__init__.py
+++ b/addons/l10n_th/__init__.py
@@ -18,3 +18,5 @@
# along with this program. If not, see .
#
##############################################################################
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_th/__openerp__.py b/addons/l10n_th/__openerp__.py
index 1b2c4771aee..ea29b7cde13 100644
--- a/addons/l10n_th/__openerp__.py
+++ b/addons/l10n_th/__openerp__.py
@@ -20,9 +20,9 @@
##############################################################################
{
- 'name': 'Thailand - Thai Chart of Accounts',
+ 'name': 'Thailand - Accounting',
'version': '1.0',
- 'category': 'Localization/Account Charts',
+ 'category': 'Localization',
'description': """
Chart of Accounts for Thailand.
===============================
@@ -38,3 +38,5 @@ Thai accounting chart and localization.
'certificate' : '00722263103978957725',
'images': ['images/config_chart_l10n_th.jpeg','images/l10n_th_chart.jpeg'],
}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_th/i18n/th.po b/addons/l10n_th/i18n/th.po
new file mode 100644
index 00000000000..d9b675d399b
--- /dev/null
+++ b/addons/l10n_th/i18n/th.po
@@ -0,0 +1,43 @@
+# Thai translation for openobject-addons
+# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR , 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2011-01-07 06:19+0000\n"
+"PO-Revision-Date: 2011-11-17 01:32+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Thai \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-11-18 05:13+0000\n"
+"X-Generator: Launchpad (build 14299)\n"
+
+#. module: l10n_th
+#: model:ir.actions.todo,note:l10n_th.config_call_account_template_th
+msgid ""
+"Generate Chart of Accounts from a Chart Template. You will be asked to pass "
+"the name of the company, the chart template to follow, the no. of digits to "
+"generate the code for your accounts and Bank account, currency to create "
+"Journals. Thus,the pure copy of chart Template is generated.\n"
+"This is the same wizard that runs from Financial "
+"Management/Configuration/Financial Accounting/Financial Accounts/Generate "
+"Chart of Accounts from a Chart Template."
+msgstr ""
+
+#. module: l10n_th
+#: model:ir.module.module,shortdesc:l10n_th.module_meta_information
+msgid "Thailand - Thai Chart of Accounts"
+msgstr ""
+
+#. module: l10n_th
+#: model:ir.module.module,description:l10n_th.module_meta_information
+msgid ""
+"\n"
+"Chart of accounts for Thailand.\n"
+" "
+msgstr ""
diff --git a/addons/l10n_uk/__openerp__.py b/addons/l10n_uk/__openerp__.py
index f6e253fffc2..1e205759a8b 100644
--- a/addons/l10n_uk/__openerp__.py
+++ b/addons/l10n_uk/__openerp__.py
@@ -20,9 +20,9 @@
{
- 'name': 'UK Chart of Accounts - latest (Smartode/CT600)',
+ 'name': 'UK - Accounting',
'version': '1.0',
- 'category': 'Localization/Account Charts',
+ 'category': 'Localization',
'description': """This is the latest UK OpenERP localisation necesary to run OpenERP accounting for UK SME's with:
- a CT600-ready chart of accounts
- VAT100-ready tax structure
diff --git a/addons/l10n_uk/l10n_uk_wizard.xml b/addons/l10n_uk/l10n_uk_wizard.xml
index b7da2ee5c6b..b4f96afc700 100644
--- a/addons/l10n_uk/l10n_uk_wizard.xml
+++ b/addons/l10n_uk/l10n_uk_wizard.xml
@@ -34,7 +34,7 @@
10
- onskip
+ once
open
diff --git a/addons/l10n_ve/__openerp__.py b/addons/l10n_ve/__openerp__.py
index 45ac68fc105..06c1ce9747e 100644
--- a/addons/l10n_ve/__openerp__.py
+++ b/addons/l10n_ve/__openerp__.py
@@ -23,10 +23,10 @@
#
##############################################################################
{
- "name" : "Venezuela -Chart of Account",
+ "name" : "Venezuela - Accounting",
"version" : "1.0",
"author" : ['OpenERP SA', "Netquatro"],
- "category" : "Localization/Account Charts",
+ "category" : "Localization",
"description":
'''
This is the module to manage the accounting chart for Venezuela in OpenERP.
diff --git a/addons/lunch/__openerp__.py b/addons/lunch/__openerp__.py
index 6d5cd576912..363b0b3a2c2 100644
--- a/addons/lunch/__openerp__.py
+++ b/addons/lunch/__openerp__.py
@@ -20,7 +20,7 @@
##############################################################################
{
- "name": "Lunch",
+ "name": "Lunch Orders",
"author": "OpenERP SA",
'complexity': "easy",
"Description": """
@@ -33,7 +33,7 @@
""",
"version": "0.1",
"depends": ["base_tools"],
- "category" : "Human Resources",
+ "category" : "Tools",
'description': """
The base module to manage lunch
diff --git a/addons/lunch/lunch_view.xml b/addons/lunch/lunch_view.xml
index 50932a03437..f695d994acd 100644
--- a/addons/lunch/lunch_view.xml
+++ b/addons/lunch/lunch_view.xml
@@ -371,9 +371,11 @@
-
+
+
report.lunch.amount
form
tree,form
+ {'search_default_year': 1,"search_default_month":1}
diff --git a/addons/lunch/report/report_lunch_order.py b/addons/lunch/report/report_lunch_order.py
index 05f730db740..7e2b8de9f49 100644
--- a/addons/lunch/report/report_lunch_order.py
+++ b/addons/lunch/report/report_lunch_order.py
@@ -64,3 +64,5 @@ class report_lunch_order(osv.osv):
)
""")
report_lunch_order()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/lunch/security/ir.model.access.csv b/addons/lunch/security/ir.model.access.csv
index 59670a8d1b1..72c06cceb2b 100644
--- a/addons/lunch/security/ir.model.access.csv
+++ b/addons/lunch/security/ir.model.access.csv
@@ -1,8 +1,8 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_lunch_order_user","lunch.order user","model_lunch_order","base.group_tool_user",1,1,1,1
-"access_lunch_cashmove_user","lunch.cashmove user","model_lunch_cashmove","base.group_tool_user",1,1,1,1
-"access_report_lunch_amount_manager","report.lunch.amount manager","model_report_lunch_amount","base.group_tool_manager",1,1,1,1
-"access_lunch_category_manager","lunch.category.user","model_lunch_category","base.group_tool_user",1,1,1,1
-"access_report_lunch_order_manager","report.lunch.order manager","model_report_lunch_order","base.group_tool_manager",1,1,1,1
-"access_lunch_product_user","lunch.product user","model_lunch_product","base.group_tool_user",1,1,1,1
-"access_lunch_cashbox_user","lunch.cashbox user","model_lunch_cashbox","base.group_tool_user",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_lunch_order_user,lunch.order user,model_lunch_order,base.group_tool_user,1,1,1,1
+access_lunch_cashmove_user,lunch.cashmove user,model_lunch_cashmove,base.group_tool_user,1,1,1,1
+access_report_lunch_amount_manager,report.lunch.amount manager,model_report_lunch_amount,base.group_tool_manager,1,1,1,1
+access_lunch_category_manager,lunch.category.user,model_lunch_category,base.group_tool_user,1,1,1,1
+access_report_lunch_order_manager,report.lunch.order manager,model_report_lunch_order,base.group_tool_manager,1,1,1,1
+access_lunch_product_user,lunch.product user,model_lunch_product,base.group_tool_user,1,1,1,1
+access_lunch_cashbox_user,lunch.cashbox user,model_lunch_cashbox,base.group_tool_user,1,1,1,1
diff --git a/addons/mail/__openerp__.py b/addons/mail/__openerp__.py
index 1cb97ce182e..8f4833c294f 100644
--- a/addons/mail/__openerp__.py
+++ b/addons/mail/__openerp__.py
@@ -20,9 +20,9 @@
##############################################################################
{
- 'name': 'Email Subsystem',
+ 'name': 'Emails Management',
'version': '1.0',
- 'category': 'Hidden',
+ 'category': 'Hidden/Dependency',
'complexity': "easy",
'description': """
A generic email subsystem with message storage and queuing
diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py
index 9c535966e17..fd00135816e 100644
--- a/addons/mail/mail_message.py
+++ b/addons/mail/mail_message.py
@@ -380,12 +380,16 @@ class mail_message(osv.osv):
if 'To' in fields:
msg['to'] = decode(msg_txt.get('To'))
+
if 'Delivered-To' in fields:
msg['to'] = decode(msg_txt.get('Delivered-To'))
if 'CC' in fields:
msg['cc'] = decode(msg_txt.get('CC'))
+ if 'Cc' in fields:
+ msg['cc'] = decode(msg_txt.get('Cc'))
+
if 'Reply-To' in fields:
msg['reply'] = decode(msg_txt.get('Reply-To'))
@@ -455,6 +459,7 @@ class mail_message(osv.osv):
msg['sub_type'] = msg['subtype'] or 'plain'
return msg
+
def send(self, cr, uid, ids, auto_commit=False, context=None):
"""Sends the selected emails immediately, ignoring their current
state (mails that have already been sent should not be passed
@@ -479,11 +484,22 @@ class mail_message(osv.osv):
attachments = []
for attach in message.attachment_ids:
attachments.append((attach.datas_fname, base64.b64decode(attach.datas)))
+
+ body = message.body_html if message.subtype == 'html' else message.body_text
+ body_alternative = None
+ subtype_alternative = None
+ if message.subtype == 'html' and message.body_text:
+ # we have a plain text alternative prepared, pass it to
+ # build_message instead of letting it build one
+ body_alternative = message.body_text
+ subtype_alternative = 'plain'
+
msg = ir_mail_server.build_email(
email_from=message.email_from,
email_to=to_email(message.email_to),
subject=message.subject,
- body=message.body_html if message.subtype == 'html' else message.body_text,
+ body=body,
+ body_alternative=body_alternative,
email_cc=to_email(message.email_cc),
email_bcc=to_email(message.email_bcc),
reply_to=message.reply_to,
@@ -491,6 +507,7 @@ class mail_message(osv.osv):
references = message.references,
object_id=message.res_id and ('%s-%s' % (message.res_id,message.model)),
subtype=message.subtype,
+ subtype_alternative=subtype_alternative,
headers=message.headers and literal_eval(message.headers))
res = ir_mail_server.send_email(cr, uid, msg,
mail_server_id=message.mail_server_id.id,
diff --git a/addons/mail/mail_message_view.xml b/addons/mail/mail_message_view.xml
index 83e7474fe1a..2bf2756869e 100644
--- a/addons/mail/mail_message_view.xml
+++ b/addons/mail/mail_message_view.xml
@@ -1,9 +1,6 @@
-
-
-
mail.message.form
mail.message
@@ -100,8 +97,10 @@
search
-
+
+
+
@@ -132,24 +131,21 @@
form
tree,form
[('email_from', '!=', False)]
- {'search_default_outgoing':1}
+ {'search_default_received':1}
-
-
-
-
diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py
index c8f7da9a5bb..70b536296bf 100644
--- a/addons/mail/mail_thread.py
+++ b/addons/mail/mail_thread.py
@@ -58,6 +58,14 @@ class mail_thread(osv.osv):
'message_ids': fields.one2many('mail.message', 'res_id', 'Messages', readonly=True),
}
+ def message_capable_models(self, cr, uid, context=None):
+ ret_dict = {}
+ for model_name in self.pool.obj_list():
+ model = self.pool.get(model_name)
+ if 'mail.thread' in getattr(model, '_inherit', []):
+ ret_dict[model_name] = model._description
+ return ret_dict
+
def message_thread_followers(self, cr, uid, ids, context=None):
"""Returns a list of email addresses of the people following
this thread, including the sender of each mail, and the
diff --git a/addons/mail/mail_thread_view.xml b/addons/mail/mail_thread_view.xml
index bd10a72faf2..3a7ed8f46fe 100644
--- a/addons/mail/mail_thread_view.xml
+++ b/addons/mail/mail_thread_view.xml
@@ -8,29 +8,10 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/addons/mail/security/ir.model.access.csv b/addons/mail/security/ir.model.access.csv
index b508cd68d83..42c70da9f19 100644
--- a/addons/mail/security/ir.model.access.csv
+++ b/addons/mail/security/ir.model.access.csv
@@ -1,3 +1,3 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_mail_message","mail.message","model_mail_message",,1,0,0,0
-"access_mail_thread","mail.thread","model_mail_thread",,1,0,0,0
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_mail_message,mail.message,model_mail_message,,1,0,0,0
+access_mail_thread,mail.thread,model_mail_thread,,1,0,0,0
diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py
index 93bf0b004d8..f5906d2b186 100644
--- a/addons/mail/wizard/mail_compose_message.py
+++ b/addons/mail/wizard/mail_compose_message.py
@@ -236,7 +236,7 @@ class mail_compose_message(osv.osv_memory):
attachments=attachment, references=references, res_id=int(mail.res_id),
subtype=mail.subtype, headers=headers, context=context)
# in normal mode, we send the email immediately, as the user expects us to (delay should be sufficiently small)
- mail_message.send(cr, uid, [msg_id], context)
+ mail_message.send(cr, uid, [msg_id], context=context)
return {'type': 'ir.actions.act_window_close'}
diff --git a/addons/marketing/__openerp__.py b/addons/marketing/__openerp__.py
index 1f1995c52da..31d50dc61ac 100644
--- a/addons/marketing/__openerp__.py
+++ b/addons/marketing/__openerp__.py
@@ -25,7 +25,7 @@
"version" : "1.1",
"depends" : ["base", "base_setup"],
"author" : "OpenERP SA",
- "category": 'Marketing',
+ "category": 'Hidden/Dependency',
'complexity': "expert",
"description": """
Menu for Marketing.
diff --git a/addons/marketing/security/ir.model.access.csv b/addons/marketing/security/ir.model.access.csv
index 0343f29f43a..4a08a4aa60d 100644
--- a/addons/marketing/security/ir.model.access.csv
+++ b/addons/marketing/security/ir.model.access.csv
@@ -1 +1 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
diff --git a/addons/marketing_campaign/marketing_campaign.py b/addons/marketing_campaign/marketing_campaign.py
index 547281911c4..82832134c27 100644
--- a/addons/marketing_campaign/marketing_campaign.py
+++ b/addons/marketing_campaign/marketing_campaign.py
@@ -844,3 +844,5 @@ class report_xml(osv.osv):
report_xml()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/marketing_campaign/report/campaign_analysis.py b/addons/marketing_campaign/report/campaign_analysis.py
index af04a7e6dff..ebbb6034a1a 100644
--- a/addons/marketing_campaign/report/campaign_analysis.py
+++ b/addons/marketing_campaign/report/campaign_analysis.py
@@ -99,3 +99,5 @@ class campaign_analysis(osv.osv):
)
""")
campaign_analysis()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/marketing_campaign/security/ir.model.access.csv b/addons/marketing_campaign/security/ir.model.access.csv
index b0157b76c51..9e54e06c5b1 100644
--- a/addons/marketing_campaign/security/ir.model.access.csv
+++ b/addons/marketing_campaign/security/ir.model.access.csv
@@ -1,21 +1,21 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_marketing_campaign_admin","marketing.campaign","model_marketing_campaign","marketing.group_marketing_user",1,1,0,0
-"access_marketing_campaign_segment_campaignadmin","marketing.campaign.segment","model_marketing_campaign_segment","marketing.group_marketing_user",1,1,0,0
-"access_marketing_campaign_activity_campaignadmin","marketing.campaign.activity","model_marketing_campaign_activity","marketing.group_marketing_user",1,1,0,0
-"access_marketing_campaign_workitem_campaignadmin","marketing.campaign.workitem","model_marketing_campaign_workitem","marketing.group_marketing_user",1,1,0,0
-"access_marketing_campaign_transition_campaignadmin","marketing.campaign.transition","model_marketing_campaign_transition","marketing.group_marketing_user",1,1,0,0
-"access_marketing_campaign_analysis_campaignadmin","campaign.analysis","model_campaign_analysis","marketing.group_marketing_user",1,1,0,0
-"access_marketing_campaign_workitem_all","marketing.campaign.workitem","model_marketing_campaign_workitem","base.group_user",1,0,0,0
-"access_email_template_user","email.template","model_email_template","marketing.group_marketing_user",1,1,0,0
-"access_email_template_account_user","ir.mail_server","base.model_ir_mail_server","marketing.group_marketing_user",1,1,0,0
-"access_marketing_campaign_system","marketing.campaign system","model_marketing_campaign","base.group_system",1,0,0,0
-"access_marketing_campaign_segment_system","marketing.campaign.segment system","model_marketing_campaign_segment","base.group_system",1,0,0,0
-"access_marketing_campaign_workitem_system","marketing.campaign.workitem system","model_marketing_campaign_workitem","base.group_system",1,0,0,0
-"access_marketing_campaign_manager","marketing.campaign","model_marketing_campaign","marketing.group_marketing_manager",1,1,1,1
-"access_marketing_campaign_segment_campaign_manager","marketing.campaign.segment","model_marketing_campaign_segment","marketing.group_marketing_manager",1,1,1,1
-"access_marketing_campaign_activity_campaign_manager","marketing.campaign.activity","model_marketing_campaign_activity","marketing.group_marketing_manager",1,1,1,1
-"access_marketing_campaign_workitem_campaign_manager","marketing.campaign.workitem","model_marketing_campaign_workitem","marketing.group_marketing_manager",1,1,1,1
-"access_marketing_campaign_transition_campaign_manager","marketing.campaign.transition","model_marketing_campaign_transition","marketing.group_marketing_manager",1,1,1,1
-"access_marketing_campaign_analysis_campaign_manager","campaign.analysis","model_campaign_analysis","marketing.group_marketing_manager",1,1,1,1
-"access_email_template_manager","email.template","model_email_template","marketing.group_marketing_manager",1,1,1,1
-"access_email_template_account_manager","ir.mail_server","base.model_ir_mail_server","marketing.group_marketing_manager",1,1,1,1
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_marketing_campaign_admin,marketing.campaign,model_marketing_campaign,marketing.group_marketing_user,1,1,0,0
+access_marketing_campaign_segment_campaignadmin,marketing.campaign.segment,model_marketing_campaign_segment,marketing.group_marketing_user,1,1,0,0
+access_marketing_campaign_activity_campaignadmin,marketing.campaign.activity,model_marketing_campaign_activity,marketing.group_marketing_user,1,1,0,0
+access_marketing_campaign_workitem_campaignadmin,marketing.campaign.workitem,model_marketing_campaign_workitem,marketing.group_marketing_user,1,1,0,0
+access_marketing_campaign_transition_campaignadmin,marketing.campaign.transition,model_marketing_campaign_transition,marketing.group_marketing_user,1,1,0,0
+access_marketing_campaign_analysis_campaignadmin,campaign.analysis,model_campaign_analysis,marketing.group_marketing_user,1,1,0,0
+access_marketing_campaign_workitem_all,marketing.campaign.workitem,model_marketing_campaign_workitem,base.group_user,1,0,0,0
+access_email_template_user,email.template,model_email_template,marketing.group_marketing_user,1,1,0,0
+access_email_template_account_user,ir.mail_server,base.model_ir_mail_server,marketing.group_marketing_user,1,1,0,0
+access_marketing_campaign_system,marketing.campaign system,model_marketing_campaign,base.group_system,1,0,0,0
+access_marketing_campaign_segment_system,marketing.campaign.segment system,model_marketing_campaign_segment,base.group_system,1,0,0,0
+access_marketing_campaign_workitem_system,marketing.campaign.workitem system,model_marketing_campaign_workitem,base.group_system,1,0,0,0
+access_marketing_campaign_manager,marketing.campaign,model_marketing_campaign,marketing.group_marketing_manager,1,1,1,1
+access_marketing_campaign_segment_campaign_manager,marketing.campaign.segment,model_marketing_campaign_segment,marketing.group_marketing_manager,1,1,1,1
+access_marketing_campaign_activity_campaign_manager,marketing.campaign.activity,model_marketing_campaign_activity,marketing.group_marketing_manager,1,1,1,1
+access_marketing_campaign_workitem_campaign_manager,marketing.campaign.workitem,model_marketing_campaign_workitem,marketing.group_marketing_manager,1,1,1,1
+access_marketing_campaign_transition_campaign_manager,marketing.campaign.transition,model_marketing_campaign_transition,marketing.group_marketing_manager,1,1,1,1
+access_marketing_campaign_analysis_campaign_manager,campaign.analysis,model_campaign_analysis,marketing.group_marketing_manager,1,1,1,1
+access_email_template_manager,email.template,model_email_template,marketing.group_marketing_manager,1,1,1,1
+access_email_template_account_manager,ir.mail_server,base.model_ir_mail_server,marketing.group_marketing_manager,1,1,1,1
diff --git a/addons/marketing_campaign_crm_demo/__init__.py b/addons/marketing_campaign_crm_demo/__init__.py
index 50a14119520..4c241b72be9 100644
--- a/addons/marketing_campaign_crm_demo/__init__.py
+++ b/addons/marketing_campaign_crm_demo/__init__.py
@@ -1 +1,3 @@
# Debian packaging removes blank files, so this comment is added.
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/marketing_campaign_crm_demo/__openerp__.py b/addons/marketing_campaign_crm_demo/__openerp__.py
index 4841cc1a2e8..a47ac040656 100644
--- a/addons/marketing_campaign_crm_demo/__openerp__.py
+++ b/addons/marketing_campaign_crm_demo/__openerp__.py
@@ -21,13 +21,13 @@
{
- "name" : "Demo data for Marketing Campaign",
+ "name" : "Marketing Campaign - Demo",
"version" : "1.0",
"depends" : ["marketing_campaign",
"crm",
],
"author" : "OpenERP SA",
- "category": 'Hidden',
+ "category": 'Marketing',
"description": """
Demo data for the module marketing_campaign.
============================================
diff --git a/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml b/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml
index ee11fbcdb75..abf29f2c011 100644
--- a/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml
+++ b/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml
@@ -34,137 +34,113 @@
- Thanks for showing interest in OpenERP
- info@tinyerp.com
-
+ Thanks for showing interest in OpenERP
+ info@tinyerp.com
-
-
- Hello,Thanks for generous interest you have shown in the openERP.Regards,OpenERP Team,
- mako
+
+
+ Hello,Thanks for generous interest you have shown in the openERP.Regards,OpenERP Team,
For OpenERP OnDemand Free Trial 2010
- crm.lead
- Propose to subscribe to the OpenERP Discovery Day on May 2010
- info@tinyerp.com
-
+ Propose to subscribe to the OpenERP Discovery Day on May 2010
+ info@tinyerp.com
-
-
- Hello,We have very good offer that might suit you.
+
+
+ Hello,We have very good offer that might suit you.
We propose you to subscribe to the OpenERP Discovery Day on May 2010.
If any further information required kindly revert back.
We really appreciate your co-operation on this.
Regards,OpenERP Team,
- mako
For OpenERP Discovery Day on May 2010
- crm.lead
- Thanks for subscribing to the OpenERP Discovery Day
- info@tinyerp.com
-
+ Thanks for subscribing to the OpenERP Discovery Day
+ info@tinyerp.com
-
-
- Hello,Thanks for showing intrest and for subscribing to the OpenERP Discovery Day.
+
+
+ Hello,Thanks for showing intrest and for subscribing to the OpenERP Discovery Day.
If any further information required kindly revert back.
I really appreciate your co-operation on this.
Regards,OpenERP Team,
- mako
For OpenERP Discovery Day
- crm.lead
- Thanks for buying the OpenERP book
- info@tinyerp.com
-
+ Thanks for buying the OpenERP book
+ info@tinyerp.com
-
-
- Hello,Thanks for showing intrest and buying the OpenERP book.
+
+
+ Hello,Thanks for showing intrest and buying the OpenERP book.
If any further information required kindly revert back.
I really appreciate your co-operation on this.
Regards,OpenERP Team,
- mako
For OpenERP book
- crm.lead
- Propose a free technical training to Gold partners
- info@tinyerp.com
-
+ Propose a free technical training to Gold partners
+ info@tinyerp.com
-
-
- Hello, We have very good offer that might suit you.
+
+
+ Hello, We have very good offer that might suit you.
For our gold partners,We are arranging free technical training on june,2010.
If any further information required kindly revert back.
I really appreciate your co-operation on this.
Regards,OpenERP Team,
- mako
For technical training to Gold partners
- crm.lead
- Propose paid training to Silver partners
- info@tinyerp.com
-
+ Propose paid training to Silver partners
+ info@tinyerp.com
-
-
- Hello, We have very good offer that might suit you.
+
+
+ Hello, We have very good offer that might suit you.
For our silver partners,We are paid technical training on june,2010.
If any further information required kindly revert back.
I really appreciate your co-operation on this.
Regards,OpenERP Team,
- mako
For training to Silver partners
- crm.lead
- Propose gold partnership to silver partners
- info@tinyerp.com
-
+ Propose gold partnership to silver partners
+ info@tinyerp.com
-
-
- Hello, We have very good offer that might suit you.
+
+
+ Hello, We have very good offer that might suit you.
For our silver partners,We are offering Gold partnership.
If any further information required kindly revert back.
I really appreciate your co-operation on this.
Regards,OpenERP Team,
- mako
For gold partnership to silver partners
- crm.lead
- Thanks for subscribing to technical training
- info@tinyerp.com
-
+ Thanks for subscribing to technical training
+ info@tinyerp.com
-
-
- Hello, Thanks for showing intrest and for subscribing to technical training.If any further information required kindly revert back.I really appreciate your co-operation on this.
+
+
+ Hello, Thanks for showing intrest and for subscribing to technical training.If any further information required kindly revert back.I really appreciate your co-operation on this.
Regards,OpenERP Team,
- mako
For subscribing to technical training
- crm.lead
diff --git a/addons/membership/__openerp__.py b/addons/membership/__openerp__.py
index 20d01b6a60e..0012ec2d0b4 100644
--- a/addons/membership/__openerp__.py
+++ b/addons/membership/__openerp__.py
@@ -21,9 +21,9 @@
{
- 'name': 'Membership',
+ 'name': 'Membership Management',
'version': '0.1',
- 'category': 'Hidden',
+ 'category': 'Association',
'description': """
This module allows you to manage all operations for managing memberships.
=========================================================================
diff --git a/addons/membership/i18n/cs.po b/addons/membership/i18n/cs.po
index c8e38a4a997..14aad66209a 100644
--- a/addons/membership/i18n/cs.po
+++ b/addons/membership/i18n/cs.po
@@ -4,77 +4,78 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 6.0dev\n"
+"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2009-09-30 08:29+0000\n"
-"Last-Translator: Kuvaly [LCT] \n"
-"Language-Team: \n"
+"PO-Revision-Date: 2011-11-25 12:33+0000\n"
+"Last-Translator: Jiří Hajda \n"
+"Language-Team: Czech \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:59+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-11-26 05:49+0000\n"
+"X-Generator: Launchpad (build 14381)\n"
+"X-Poedit-Language: Czech\n"
#. module: membership
#: model:process.transition,name:membership.process_transition_invoicetoassociate0
msgid "invoice to associate"
-msgstr ""
+msgstr "faktura k přidružení"
#. module: membership
#: model:process.process,name:membership.process_process_membershipprocess0
msgid "Membership Process"
-msgstr ""
+msgstr "Proces členství"
#. module: membership
#: selection:membership.membership_line,state:0
#: selection:report.membership,membership_state:0
#: selection:res.partner,membership_state:0
msgid "Paid Member"
-msgstr ""
+msgstr "Zaplacený člen"
#. module: membership
#: view:report.membership:0
#: view:res.partner:0
msgid "Group By..."
-msgstr ""
+msgstr "Seskupit podle..."
#. module: membership
#: field:report.membership,num_paid:0
msgid "# Paid"
-msgstr ""
+msgstr "# Zaplaceno"
#. module: membership
#: field:report.membership,tot_earned:0
msgid "Earned Amount"
-msgstr ""
+msgstr "Vydělaná částka"
#. module: membership
#: model:ir.model,name:membership.model_report_membership
msgid "Membership Analysis"
-msgstr ""
+msgstr "Analýza členství"
#. module: membership
#: selection:report.membership,month:0
msgid "March"
-msgstr ""
+msgstr "Březen"
#. module: membership
#: model:process.node,note:membership.process_node_setassociation0
msgid "Set an associate member of partner."
-msgstr ""
+msgstr "Nastavit přidruženého člena k partnerovi"
#. module: membership
#: model:process.transition,note:membership.process_transition_invoicetopaid0
msgid "Invoice is be paid."
-msgstr ""
+msgstr "Faktura je zaplacena"
#. module: membership
#: field:membership.membership_line,company_id:0
#: view:report.membership:0
#: field:report.membership,company_id:0
msgid "Company"
-msgstr ""
+msgstr "Společnost"
#. module: membership
#: field:product.product,membership_date_to:0
@@ -84,84 +85,84 @@ msgstr "Datum do"
#. module: membership
#: model:process.transition,name:membership.process_transition_waitingtoinvoice0
msgid "Waiting to invoice"
-msgstr ""
+msgstr "Čekající na fakturu"
#. module: membership
#: help:report.membership,date_to:0
msgid "End membership date"
-msgstr ""
+msgstr "Datum ukončení členství"
#. module: membership
#: view:res.partner:0
msgid "Suppliers"
-msgstr ""
+msgstr "Dodavatelé"
#. module: membership
#: view:res.partner:0
msgid "All Members"
-msgstr ""
+msgstr "Všichni členové"
#. module: membership
#: field:res.partner,membership_stop:0
msgid "Stop membership date"
-msgstr ""
+msgstr "Datum pozastavení členství"
#. module: membership
#: model:process.transition,name:membership.process_transition_producttomember0
msgid "Product to member"
-msgstr ""
+msgstr "Výrobek pro člena"
#. module: membership
#: model:ir.actions.act_window,name:membership.action_membership_invoice_view
#: view:res.partner:0
msgid "Join Membership"
-msgstr ""
+msgstr "Připojit členství"
#. module: membership
#: field:res.partner,associate_member:0
msgid "Associate member"
-msgstr ""
+msgstr "Přidružený člen"
#. module: membership
#: model:process.node,note:membership.process_node_associatedmember0
msgid "Member is associated."
-msgstr ""
+msgstr "Člen je přidružený."
#. module: membership
#: field:report.membership,tot_pending:0
msgid "Pending Amount"
-msgstr ""
+msgstr "Čekající částka"
#. module: membership
#: model:process.transition,note:membership.process_transition_associationpartner0
msgid "Associated partner."
-msgstr ""
+msgstr "Přidruženého partnera"
#. module: membership
#: field:report.membership,num_invoiced:0
msgid "# Invoiced"
-msgstr ""
+msgstr "# Fakturováno"
#. module: membership
#: model:ir.ui.menu,name:membership.menu_report_membership
msgid "Members Analysis"
-msgstr ""
+msgstr "Analýza členů"
#. module: membership
#: view:res.partner:0
msgid "End Membership Date"
-msgstr ""
+msgstr "Datum ukončení členství"
#. module: membership
#: field:product.product,membership_date_from:0
msgid "Date from"
-msgstr ""
+msgstr "Počáteční datum"
#. module: membership
#: code:addons/membership/membership.py:414
#, python-format
msgid "Partner doesn't have an address to make the invoice."
-msgstr ""
+msgstr "Partner nemá adresu pro vytvoření faktury."
#. module: membership
#: model:ir.model,name:membership.model_res_partner
@@ -172,7 +173,7 @@ msgstr "Partner"
#. module: membership
#: model:process.transition,name:membership.process_transition_invoicetopaid0
msgid "Invoice to paid"
-msgstr ""
+msgstr "Faktura k zaplacení"
#. module: membership
#: view:res.partner:0
@@ -182,12 +183,12 @@ msgstr "Partneři"
#. module: membership
#: field:membership.membership_line,date_from:0
msgid "From"
-msgstr ""
+msgstr "Od"
#. module: membership
#: constraint:membership.membership_line:0
msgid "Error, this membership product is out of date"
-msgstr ""
+msgstr "Chyba, tento výrobek členství je zastaralý"
#. module: membership
#: help:res.partner,membership_state:0
@@ -206,6 +207,15 @@ msgid ""
" -Paid Member: A member who has paid the membership "
"amount."
msgstr ""
+"Označuje stav členství.\n"
+" -Nečlen: Člen, který nepožádál o žádné členství.\n"
+" -Zrušené členství: Člen, který má zrušené své členství.\n"
+" -Starý člen: Člen, kterému vypršelo členství.\n"
+" -Čekající člen: Člen, který požádal o členství, a "
+"kterému bude vytvořena faktura.\n"
+" -Fakturovaný člen: Člen, kterému byla vytvořena "
+"faktura.\n"
+" -Placený člen: Člen, který zaplatil částku za členství."
#. module: membership
#: model:process.transition.action,name:membership.process_transition_action_create0
@@ -215,30 +225,30 @@ msgstr "Vytvořit"
#. module: membership
#: model:ir.model,name:membership.model_membership_membership_line
msgid "Member line"
-msgstr ""
+msgstr "Řádek člena"
#. module: membership
#: help:report.membership,date_from:0
#: field:res.partner,membership_start:0
msgid "Start membership date"
-msgstr ""
+msgstr "Počáteční datum členství"
#. module: membership
#: code:addons/membership/membership.py:410
#: code:addons/membership/membership.py:413
#, python-format
msgid "Error !"
-msgstr ""
+msgstr "Chyba !"
#. module: membership
#: model:process.node,name:membership.process_node_paidmember0
msgid "Paid member"
-msgstr ""
+msgstr "Zaplacený člen"
#. module: membership
#: field:report.membership,num_waiting:0
msgid "# Waiting"
-msgstr ""
+msgstr "# Čekající"
#. module: membership
#: model:ir.actions.act_window,name:membership.action_membership_members
@@ -252,22 +262,22 @@ msgstr "Členové"
#: selection:report.membership,membership_state:0
#: selection:res.partner,membership_state:0
msgid "Non Member"
-msgstr ""
+msgstr "Nečlen"
#. module: membership
#: model:process.node,note:membership.process_node_invoicedmember0
msgid "Open invoice."
-msgstr ""
+msgstr "Otevřít fakturu"
#. module: membership
#: selection:report.membership,month:0
msgid "July"
-msgstr ""
+msgstr "Červenec"
#. module: membership
#: model:product.template,name:membership.membership_0_product_template
msgid "Golden Membership"
-msgstr ""
+msgstr "Zlaté členství"
#. module: membership
#: help:res.partner,associate_member:0
@@ -275,79 +285,81 @@ msgid ""
"A member with whom you want to associate your membership.It will consider "
"the membership state of the associated member."
msgstr ""
+"Člen, s kterým chcete asociovat vaše členství. Vezme v úvahu stav členství "
+"asociovaného člena."
#. module: membership
#: field:membership.membership_line,membership_id:0
#: view:report.membership:0
#: field:report.membership,membership_id:0
msgid "Membership Product"
-msgstr ""
+msgstr "Výrobek členství"
#. module: membership
#: model:process.transition,note:membership.process_transition_producttomember0
msgid "Define product for membership."
-msgstr ""
+msgstr "Určit výrobek pro členství."
#. module: membership
#: model:process.transition,note:membership.process_transition_invoicetoassociate0
msgid "Invoiced member may be Associated member."
-msgstr ""
+msgstr "Fakturovaný člen může být přidružený člen."
#. module: membership
#: view:membership.invoice:0
msgid "Join"
-msgstr ""
+msgstr "Připojit"
#. module: membership
#: help:product.product,membership_date_to:0
#: help:res.partner,membership_stop:0
msgid "Date until which membership remains active."
-msgstr ""
+msgstr "Datum, do kterého členství zůstává aktivní."
#. module: membership
#: view:product.product:0
msgid "Membership products"
-msgstr ""
+msgstr "Výrobky členství"
#. module: membership
#: field:membership.membership_line,date:0
msgid "Join Date"
-msgstr ""
+msgstr "Datum připojení"
#. module: membership
#: help:res.partner,free_member:0
msgid "Select if you want to give membership free of cost."
-msgstr ""
+msgstr "Vyberte, pokud chcete dát členovi cenu zdarma."
#. module: membership
#: model:process.node,name:membership.process_node_setassociation0
msgid "Set association"
-msgstr ""
+msgstr "Nastavit přiřazení"
#. module: membership
#: view:res.partner:0
msgid " Membership State"
-msgstr ""
+msgstr " Stav členství"
#. module: membership
#: view:res.partner:0
msgid "Memberships"
-msgstr ""
+msgstr "Členství"
#. module: membership
#: model:process.node,note:membership.process_node_paidmember0
msgid "Membership invoice paid."
-msgstr ""
+msgstr "Faktura členství zaplacena."
#. module: membership
#: model:ir.model,name:membership.model_product_template
msgid "Product Template"
-msgstr ""
+msgstr "Šablona výrobku"
#. module: membership
#: selection:report.membership,month:0
msgid "September"
-msgstr ""
+msgstr "Září"
#. module: membership
#: model:ir.module.module,description:membership.module_meta_information
@@ -365,11 +377,23 @@ msgid ""
"invoice and send propositions for membership renewal.\n"
" "
msgstr ""
+"\n"
+"Tento modul vám umožňuje spravovat všechny operace pro správu členství.\n"
+"Podporuje různé druhy členství:\n"
+"* volné členství\n"
+"* Přidružený člen (ex: skupinové zapsání pro členství pro všechnyl\n"
+" pobočjy)\n"
+"* Zaplacený člen,\n"
+"* Speciální ceny členů, ...\n"
+"\n"
+"Je integrován s prodejem a účetnictvím, aby vám umožnil automaticky\n"
+"fakturovat a odesílat návrhy pro obnovení členství.\n"
+" "
#. module: membership
#: model:ir.model,name:membership.model_account_invoice_line
msgid "Invoice Line"
-msgstr ""
+msgstr "Řádek faktury"
#. module: membership
#: help:membership.membership_line,state:0
@@ -388,74 +412,85 @@ msgid ""
" -Paid Member: A member who has paid the membership "
"amount."
msgstr ""
+"Označuje stav členství.\n"
+" -Nečlen: Člen, který nepožádál o žádné členství.\n"
+" -Zrušené členství: Člen, který má zrušené své "
+"členství.\n"
+" -Starý člen: Člen, kterému vypršelo členství.\n"
+" -Čekající člen: Člen, který požádal o členství, a "
+"kterému bude vytvořena faktura.\n"
+" -Fakturovaný člen: Člen, kterému byla vytvořena "
+"faktura.\n"
+" -Placený člen: Člen, který zaplatil částku za "
+"členství."
#. module: membership
#: view:report.membership:0
#: field:report.membership,month:0
msgid "Month"
-msgstr ""
+msgstr "Měsíc"
#. module: membership
#: view:product.product:0
msgid "Group by..."
-msgstr ""
+msgstr "Seskupit podle..."
#. module: membership
#: code:addons/membership/membership.py:411
#, python-format
msgid "Partner is a free Member."
-msgstr ""
+msgstr "Partner je volný člen."
#. module: membership
#: model:product.pricelist,name:membership.list1m
msgid "Member Sale Pricelist"
-msgstr ""
+msgstr "Prodejní ceník člena"
#. module: membership
#: field:report.membership,associate_member_id:0
#: view:res.partner:0
msgid "Associate Member"
-msgstr ""
+msgstr "Přiřadit člena"
#. module: membership
#: help:product.product,membership_date_from:0
#: help:res.partner,membership_start:0
msgid "Date from which membership becomes active."
-msgstr ""
+msgstr "Datum, od kterého se stává členství aktivním."
#. module: membership
#: view:report.membership:0
msgid "Associated Partner"
-msgstr ""
+msgstr "Přidruženého partnera"
#. module: membership
#: model:ir.model,name:membership.model_membership_invoice
#: view:membership.invoice:0
msgid "Membership Invoice"
-msgstr ""
+msgstr "Členská faktura"
#. module: membership
#: view:report.membership:0
#: field:report.membership,user_id:0
#: view:res.partner:0
msgid "Salesman"
-msgstr ""
+msgstr "Obchodník"
#. module: membership
#: model:process.node,note:membership.process_node_membershipproduct0
msgid "Define membership product."
-msgstr ""
+msgstr "Určit výrobek členství."
#. module: membership
#: view:product.product:0
msgid "Category"
-msgstr ""
+msgstr "Kategorie"
#. module: membership
#: model:ir.model,name:membership.model_account_invoice
#: field:membership.membership_line,account_invoice_id:0
msgid "Invoice"
-msgstr ""
+msgstr "Faktura"
#. module: membership
#: selection:membership.membership_line,state:0
@@ -467,70 +502,70 @@ msgstr "Volný člen"
#. module: membership
#: model:product.pricelist.version,name:membership.ver1m
msgid "Member Sale Pricelist Version"
-msgstr ""
+msgstr "Verze prodejního ceníku člena"
#. module: membership
#: constraint:product.template:0
msgid ""
"Error: The default UOM and the purchase UOM must be in the same category."
-msgstr ""
+msgstr "Chyba: Výchozí MJ a nákupní MJ musí být ve stejné kategorii."
#. module: membership
#: view:report.membership:0
msgid "Forecast"
-msgstr ""
+msgstr "Předpověď"
#. module: membership
#: field:report.membership,partner_id:0
msgid "Member"
-msgstr ""
+msgstr "Člen"
#. module: membership
#: constraint:res.partner:0
msgid "Error ! You can not create recursive associated members."
-msgstr ""
+msgstr "Chyba ! Nemůžete vytvořit rekurzivní asociované členy."
#. module: membership
#: view:product.product:0
msgid "Date From"
-msgstr ""
+msgstr "Datum od"
#. module: membership
#: model:process.node,name:membership.process_node_associatedmember0
msgid "Associated member"
-msgstr ""
+msgstr "Přiřazený člen"
#. module: membership
#: view:product.product:0
msgid "Accounting Info"
-msgstr ""
+msgstr "Účetní informace"
#. module: membership
#: field:res.partner,membership_cancel:0
msgid "Cancel membership date"
-msgstr ""
+msgstr "Datum zrušení členství"
#. module: membership
#: view:res.partner:0
msgid "Customers"
-msgstr ""
+msgstr "Zákazníci"
#. module: membership
#: selection:report.membership,month:0
msgid "August"
-msgstr ""
+msgstr "Srpen"
#. module: membership
#: model:ir.actions.act_window,name:membership.action_membership_products
#: model:ir.ui.menu,name:membership.menu_membership_products
#: view:product.product:0
msgid "Membership Products"
-msgstr ""
+msgstr "Výrobky členství"
#. module: membership
#: selection:report.membership,month:0
msgid "June"
-msgstr ""
+msgstr "Červen"
#. module: membership
#: model:ir.module.module,shortdesc:membership.module_meta_information
@@ -542,145 +577,145 @@ msgstr ""
#: view:res.partner:0
#: field:res.partner,member_lines:0
msgid "Membership"
-msgstr ""
+msgstr "Členství"
#. module: membership
#: selection:membership.membership_line,state:0
#: selection:report.membership,membership_state:0
#: selection:res.partner,membership_state:0
msgid "Invoiced Member"
-msgstr ""
+msgstr "Fakturovaný člen"
#. module: membership
#: help:membership.membership_line,date:0
msgid "Date on which member has joined the membership"
-msgstr ""
+msgstr "Datum, kdy se člen připojil k členství"
#. module: membership
#: selection:membership.membership_line,state:0
#: selection:report.membership,membership_state:0
#: selection:res.partner,membership_state:0
msgid "Waiting Member"
-msgstr ""
+msgstr "Čekající člen"
#. module: membership
#: model:process.transition,name:membership.process_transition_associationpartner0
msgid "Association Partner"
-msgstr ""
+msgstr "Přiřazený partner"
#. module: membership
#: selection:report.membership,month:0
msgid "November"
-msgstr ""
+msgstr "Listopad"
#. module: membership
#: view:product.product:0
msgid "Extended Filters..."
-msgstr ""
+msgstr "Rozšířené filtry..."
#. module: membership
#: field:membership.membership_line,state:0
msgid "Membership State"
-msgstr ""
+msgstr "Stav členství"
#. module: membership
#: selection:report.membership,month:0
msgid "October"
-msgstr ""
+msgstr "Říjen"
#. module: membership
#: view:product.product:0
msgid "Sale Description"
-msgstr ""
+msgstr "Popis prodeje"
#. module: membership
#: selection:report.membership,month:0
msgid "January"
-msgstr ""
+msgstr "Leden"
#. module: membership
#: view:product.product:0
msgid "Membership Fee"
-msgstr ""
+msgstr "Členský poplatek"
#. module: membership
#: field:res.partner,membership_amount:0
msgid "Membership amount"
-msgstr ""
+msgstr "Částka členství"
#. module: membership
#: help:res.partner,membership_amount:0
msgid "The price negotiated by the partner"
-msgstr ""
+msgstr "Cena vyjednaná partnerem"
#. module: membership
#: model:product.template,name:membership.membership_2_product_template
msgid "Basic Membership"
-msgstr ""
+msgstr "Základní členství"
#. module: membership
#: help:product.product,membership:0
msgid "Select if a product is a membership product."
-msgstr ""
+msgstr "Vyberte, pokud výrobek je výrobek členství."
#. module: membership
#: selection:membership.membership_line,state:0
#: selection:report.membership,membership_state:0
#: selection:res.partner,membership_state:0
msgid "Old Member"
-msgstr ""
+msgstr "Starý člen"
#. module: membership
#: field:membership.membership_line,date_to:0
msgid "To"
-msgstr ""
+msgstr "Do"
#. module: membership
#: view:report.membership:0
#: field:report.membership,membership_state:0
#: field:res.partner,membership_state:0
msgid "Current Membership State"
-msgstr ""
+msgstr "Aktuální stav členství"
#. module: membership
#: view:report.membership:0
msgid "Last 365 Days"
-msgstr ""
+msgstr "Posledních 365 dní"
#. module: membership
#: view:product.product:0
msgid "General"
-msgstr ""
+msgstr "Obecný"
#. module: membership
#: model:process.transition,note:membership.process_transition_waitingtoinvoice0
msgid "Draft invoice is now open."
-msgstr ""
+msgstr "Koncept faktury je nyní otevřen."
#. module: membership
#: view:product.product:0
msgid "Inactive"
-msgstr ""
+msgstr "Neaktivní"
#. module: membership
#: view:report.membership:0
msgid "Last 30 Days"
-msgstr ""
+msgstr "Posledních 30 dní"
#. module: membership
#: selection:report.membership,month:0
msgid "December"
-msgstr ""
+msgstr "Prosinec"
#. module: membership
#: view:membership.invoice:0
msgid "Close"
-msgstr ""
+msgstr "Uzavřít"
#. module: membership
#: view:res.partner:0
msgid "All non Members"
-msgstr ""
+msgstr "Všichni nečlenové"
#. module: membership
#: view:product.product:0
@@ -690,17 +725,17 @@ msgstr "Informace"
#. module: membership
#: field:membership.membership_line,account_invoice_line:0
msgid "Account Invoice line"
-msgstr ""
+msgstr "Účetní řádek faktury"
#. module: membership
#: view:product.product:0
msgid "Categorization"
-msgstr ""
+msgstr "Členění"
#. module: membership
#: model:process.node,note:membership.process_node_waitingmember0
msgid "Draft invoice for membership."
-msgstr ""
+msgstr "Koncept faktury pro členství."
#. module: membership
#: field:membership.invoice,member_price:0
@@ -708,117 +743,117 @@ msgstr ""
#: model:product.price.type,name:membership.product_price_type_memberprice
#: field:product.template,member_price:0
msgid "Member Price"
-msgstr ""
+msgstr "Cena člena"
#. module: membership
#: view:product.product:0
msgid "Purchase Description"
-msgstr ""
+msgstr "Popis nákupu"
#. module: membership
#: model:ir.model,name:membership.model_product_product
msgid "Product"
-msgstr ""
+msgstr "Výrobek"
#. module: membership
#: view:product.product:0
msgid "Description"
-msgstr ""
+msgstr "Popis"
#. module: membership
#: field:res.partner,free_member:0
msgid "Free member"
-msgstr ""
+msgstr "Volný člen"
#. module: membership
#: selection:report.membership,month:0
msgid "May"
-msgstr ""
+msgstr "Květen"
#. module: membership
#: model:product.template,name:membership.membership_1_product_template
msgid "Silver Membership"
-msgstr ""
+msgstr "Stříbrné členství"
#. module: membership
#: view:product.product:0
msgid "Sale Taxes"
-msgstr ""
+msgstr "Prodejní daně"
#. module: membership
#: field:report.membership,date_to:0
#: view:res.partner:0
msgid "End Date"
-msgstr ""
+msgstr "Datum ukončení"
#. module: membership
#: selection:report.membership,month:0
msgid "February"
-msgstr ""
+msgstr "Únor"
#. module: membership
#: model:process.node,name:membership.process_node_invoicedmember0
msgid "Invoiced member"
-msgstr ""
+msgstr "Fakturovaný člen"
#. module: membership
#: selection:report.membership,month:0
msgid "April"
-msgstr ""
+msgstr "Duben"
#. module: membership
#: help:res.partner,membership_cancel:0
msgid "Date on which membership has been cancelled"
-msgstr ""
+msgstr "Datum, kdy bylo zrušeno členství"
#. module: membership
#: field:membership.membership_line,date_cancel:0
msgid "Cancel date"
-msgstr ""
+msgstr "Datum zrušení"
#. module: membership
#: model:process.node,name:membership.process_node_waitingmember0
msgid "Waiting member"
-msgstr ""
+msgstr "Čekající člen"
#. module: membership
#: field:report.membership,date_from:0
#: view:res.partner:0
msgid "Start Date"
-msgstr ""
+msgstr "Počáteční datum"
#. module: membership
#: model:process.node,name:membership.process_node_membershipproduct0
msgid "Membership product"
-msgstr ""
+msgstr "Výrobek členství"
#. module: membership
#: help:membership.membership_line,member_price:0
msgid "Amount for the membership"
-msgstr ""
+msgstr "Částka pro členství"
#. module: membership
#: selection:membership.membership_line,state:0
#: selection:report.membership,membership_state:0
#: selection:res.partner,membership_state:0
msgid "Cancelled Member"
-msgstr ""
+msgstr "Zrušený člen"
#. module: membership
#: constraint:product.product:0
msgid "Error: Invalid ean code"
-msgstr ""
+msgstr "Chyba: Neplatný kód ean"
#. module: membership
#: view:report.membership:0
#: field:report.membership,year:0
msgid "Year"
-msgstr ""
+msgstr "Rok"
#. module: membership
#: view:report.membership:0
msgid "Revenue Done"
-msgstr ""
+msgstr "Příjem proveden"
#~ msgid "Configuration"
#~ msgstr "Konfigurace"
diff --git a/addons/membership/i18n/pt.po b/addons/membership/i18n/pt.po
index 4e956c14e09..8d6d58052ec 100644
--- a/addons/membership/i18n/pt.po
+++ b/addons/membership/i18n/pt.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2010-12-12 07:51+0000\n"
-"Last-Translator: Madalena_prime \n"
+"PO-Revision-Date: 2011-11-23 12:23+0000\n"
+"Last-Translator: Stephane Wirtel (OpenERP) \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:59+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-11-24 05:00+0000\n"
+"X-Generator: Launchpad (build 14336)\n"
#. module: membership
#: model:process.transition,name:membership.process_transition_invoicetoassociate0
@@ -474,7 +474,7 @@ msgstr "Versão da Lista de Preço de Venda do Membro"
msgid ""
"Error: The default UOM and the purchase UOM must be in the same category."
msgstr ""
-"Erro: O UOM por defeito e o UOM de compra devem estar na mesma categoria."
+"Erro: A UdM pré-defenida e a UdM de compra devem ser da mesma categoria."
#. module: membership
#: view:report.membership:0
diff --git a/addons/membership/membership_view.xml b/addons/membership/membership_view.xml
index b14a72b278e..a1c39165c82 100644
--- a/addons/membership/membership_view.xml
+++ b/addons/membership/membership_view.xml
@@ -107,7 +107,7 @@
Membership Products
product.product
[('membership','=',True), ('type', '=', 'service')]
- {'membership':True, 'type':'service'}
+ {'membership':True, 'type':'service', 'default_membership': True, 'default_type': 'service'}
diff --git a/addons/membership/report/report_membership.py b/addons/membership/report/report_membership.py
index c5d82332fc1..631acab46b1 100644
--- a/addons/membership/report/report_membership.py
+++ b/addons/membership/report/report_membership.py
@@ -109,7 +109,7 @@ class report_membership(osv.osv):
LEFT JOIN membership_membership_line ml ON (ml.partner = p.id)
LEFT JOIN account_invoice_line il ON (ml.account_invoice_line = il.id)
LEFT JOIN account_invoice ai ON (il.invoice_id = ai.id)
- WHERE p.membership_state != 'none'
+ WHERE p.membership_state != 'none' and p.active = 'true'
GROUP BY
p.id,
p.user_id,
diff --git a/addons/membership/report/report_membership_view.xml b/addons/membership/report/report_membership_view.xml
index 27ccfae0e12..b0ac01ac89f 100644
--- a/addons/membership/report/report_membership_view.xml
+++ b/addons/membership/report/report_membership_view.xml
@@ -36,9 +36,10 @@
-
+
+
@@ -96,7 +97,7 @@
report.membership
form
- {"search_default_member":1, 'search_default_Revenue':1, 'search_default_this_month':1, 'search_default_salesman':1,'group_by_no_leaf':1}
+ {"search_default_year":1,"search_default_member":1, 'search_default_Revenue':1, 'search_default_this_month':1, 'search_default_salesman':1,'group_by_no_leaf':1}
diff --git a/addons/membership/security/ir.model.access.csv b/addons/membership/security/ir.model.access.csv
index f3d91646c44..d53e57a5151 100644
--- a/addons/membership/security/ir.model.access.csv
+++ b/addons/membership/security/ir.model.access.csv
@@ -1,4 +1,4 @@
-"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
-"access_membership_membership_line_partner_manager","membership.membership_line partner_manager","model_membership_membership_line","base.group_partner_manager",1,1,1,1
-"access_membership_membership_line","membership.membership_line","model_membership_membership_line",,1,0,0,0
-"access_report_membership","report.membership","model_report_membership","base.group_partner_manager",1,0,0,0
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_membership_membership_line_partner_manager,membership.membership_line partner_manager,model_membership_membership_line,base.group_partner_manager,1,1,1,1
+access_membership_membership_line,membership.membership_line,model_membership_membership_line,,1,0,0,0
+access_report_membership,report.membership,model_report_membership,base.group_partner_manager,1,0,0,0
diff --git a/addons/membership/test/test_membership.yml b/addons/membership/test/test_membership.yml
index 75e0f887cfe..27b755f156b 100644
--- a/addons/membership/test/test_membership.yml
+++ b/addons/membership/test/test_membership.yml
@@ -13,36 +13,22 @@
list_price: 80.00
- |
- "Mark Johnson" want to join "Gold Membership".
-- |
- I'm creating new member "Mark Johnson".
+ "Seagate" want to join "Gold Membership", so I'm checking "Current Membership State" of "Seagate". It is an "Non Member" or not.
-
- !record {model: res.partner, id: res_partner_markjohnson0}:
- address:
- - city: paris
- country_id: base.fr
- name: Mark Johnson
- street: 1 rue Rockfeller
- type: invoice
- zip: '75016'
- name: Mark Johnson
-- |
- I'm checking "Current Membership State" of "Mark Johnson". It is an "Non Member" or not.
--
- !assert {model: res.partner, id: res_partner_markjohnson0}:
+ !assert {model: res.partner, id: base.res_partner_seagate}:
- membership_state == 'none', 'Member should be has "Current Membership State" in "Non Member".'
- |
- I'm doing to make membership invoice for "Mark Johnson" on joining "Gold Membership".
+ I'm doing to make membership invoice for "Seagate" on joining "Gold Membership".
-
!python {model: res.partner}: |
- self.create_membership_invoice(cr, uid, [ref("res_partner_markjohnson0")], product_id=ref("product_product_membershipproduct0"), datas={"amount":80.00})
+ self.create_membership_invoice(cr, uid, [ref("base.res_partner_seagate")], product_id=ref("product_product_membershipproduct0"), datas={"amount":80.00})
- |
- I'm checking "Current Membership State" of "Mark Johnson". It is an "Waiting Member" or not.
+ I'm checking "Current Membership State" of "Seagate". It is an "Waiting Member" or not.
-
- !assert {model: res.partner, id: res_partner_markjohnson0}:
+ !assert {model: res.partner, id: base.res_partner_seagate}:
- membership_state == 'waiting', 'Member should be has "Current Membership State" in "Waiting Member".'
- |
- I'm Opening that Invoice which is created for "Mark Johnson".
+ I'm Opening that Invoice which is created for "Seagate".
-
!python {model: res.partner}: |
import netsvc
@@ -52,16 +38,16 @@
membership_line_pool = self.pool.get('membership.membership_line')
membership_pool = self.pool.get('product.product')
- membership_line_ids = membership_line_pool.search(cr, uid, [('membership_id','=',ref('product_product_membershipproduct0')),('partner','=',ref('res_partner_markjohnson0'))])
+ membership_line_ids = membership_line_pool.search(cr, uid, [('membership_id','=',ref('product_product_membershipproduct0')),('partner','=',ref('base.res_partner_seagate'))])
membership_lines = membership_line_pool.browse(cr, uid, membership_line_ids)
assert membership_lines, _('Membership is not registrated.')
membership_line = membership_lines[0]
wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'account.invoice', membership_line.account_invoice_id.id, 'invoice_open', cr)
- |
- I'm checking "Current membership state" of "Mark Johnson". It is an "Invoiced Member" or not.
+ I'm checking "Current membership state" of "Seagate". It is an "Invoiced Member" or not.
-
- !assert {model: res.partner, id: res_partner_markjohnson0}:
+ !assert {model: res.partner, id: base.res_partner_seagate}:
- membership_state == 'invoiced', 'Member should be has "Current Membership State" in "Invoiced Member".'
- |
@@ -85,10 +71,10 @@
- membership_state == 'free', 'Member should be has "Current Membership State" in "Free Member".'
- |
- I'm set "Mark Johnson" as a associated member of "Ms. Johnson" and also set Non free member.
+ I'm set "Seagate" as a associated member of "Ms. Johnson" and also set Non free member.
-
!python {model: res.partner}: |
- self.write(cr, uid, [ref("res_partner_msjohnson0")], {'free_member': False, 'associate_member': ref("res_partner_markjohnson0")})
+ self.write(cr, uid, [ref("res_partner_msjohnson0")], {'free_member': False, 'associate_member': ref("base.res_partner_seagate")})
- |
I'm checking "Current membership state" of "Ms. Johnson". It is an "Paid Member" or not.
@@ -108,17 +94,17 @@
type: service
list_price: 50.00
- |
- I'm making invoice of "Mark Johnson" member on joining new membership "Regular Membership".
+ I'm making invoice of "Seagate" member on joining new membership "Regular Membership".
-
!python {model: res.partner}: |
- self.create_membership_invoice(cr, uid, [ref("res_partner_markjohnson0")], product_id=ref("product_product_membershipproduct1"), datas={"amount":50.00})
+ self.create_membership_invoice(cr, uid, [ref("base.res_partner_seagate")], product_id=ref("product_product_membershipproduct1"), datas={"amount":50.00})
- |
- I'm checking "Current membership state" of "Mark Johnson". It is an "Old Member" or not.
+ I'm checking "Current membership state" of "Seagate". It is an "Old Member" or not.
-
- !assert {model: res.partner, id: res_partner_markjohnson0}:
+ !assert {model: res.partner, id: base.res_partner_seagate}:
- membership_state == 'old', 'Member should be has "Current Membership State" in "Old Member".'
- |
- I'm doing to make credit note of invoice which is paid by "Mark Johnson" to cancel membership.
+ I'm doing to make credit note of invoice which is paid by "Seagate" to cancel membership.
-
!python {model: account.invoice}: |
from tools.translate import _
@@ -128,15 +114,15 @@
membership_pool = self.pool.get('product.product')
invoice_refund_pool = self.pool.get('account.invoice.refund')
- membership_line_ids = membership_line_pool.search(cr, uid, [('membership_id','=',ref('product_product_membershipproduct0')),('partner','=',ref('res_partner_markjohnson0'))])
+ membership_line_ids = membership_line_pool.search(cr, uid, [('membership_id','=',ref('product_product_membershipproduct0')),('partner','=',ref('base.res_partner_seagate'))])
membership_lines = membership_line_pool.browse(cr, uid, membership_line_ids)
assert membership_lines, _('Membership is not registrated.')
membership_line = membership_lines[0]
refund_id = invoice_refund_pool.create(cr, uid, {'description': 'Refund of Membership', 'filter_refund': 'refund'}, {'active_id': membership_line.account_invoice_id.id})
invoice_refund_pool.invoice_refund(cr, uid, [refund_id], {'active_id': membership_line.account_invoice_id.id, 'active_ids': [membership_line.account_invoice_id.id]})
- |
- I'm checking "Current membership state" of "Mark Johnson". It is an "Cancelled Member" or not.
+ I'm checking "Current membership state" of "Seagate". It is an "Cancelled Member" or not.
-
- !assert {model: res.partner, id: res_partner_markjohnson0}:
+ !assert {model: res.partner, id: base.res_partner_seagate}:
- membership_state == 'canceled', 'Member should be has "Current Membership State" in "Cancelled Member".'
diff --git a/addons/mrp/__openerp__.py b/addons/mrp/__openerp__.py
index 38c5fa9a9d1..588ba103f04 100644
--- a/addons/mrp/__openerp__.py
+++ b/addons/mrp/__openerp__.py
@@ -21,7 +21,7 @@
{
- "name" : "Manufacturing Resource Planning",
+ "name" : "MRP",
"version" : "1.1",
"author" : "OpenERP SA",
"website" : "http://www.openerp.com",
@@ -101,6 +101,7 @@ Dashboard provided by this module:
],
'installable': True,
+ 'application': True,
'active': False,
'certificate': '0032052481373',
}
diff --git a/addons/mrp/board_manufacturing_view.xml b/addons/mrp/board_manufacturing_view.xml
index 03d6947d215..9956aae4ffe 100644
--- a/addons/mrp/board_manufacturing_view.xml
+++ b/addons/mrp/board_manufacturing_view.xml
@@ -7,17 +7,15 @@
form
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/addons/mrp/i18n/ar.po b/addons/mrp/i18n/ar.po
index c8a56267090..0a13682d76e 100644
--- a/addons/mrp/i18n/ar.po
+++ b/addons/mrp/i18n/ar.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:53+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:50+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
#. module: mrp
#: field:mrp.production,move_created_ids:0
@@ -715,7 +715,7 @@ msgid "Per month"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -728,7 +728,7 @@ msgid "Product Name"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr ""
@@ -1240,7 +1240,7 @@ msgstr ""
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
@@ -1294,7 +1294,7 @@ msgid "Month -1"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr ""
@@ -1305,7 +1305,7 @@ msgid "Production Order N° :"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr ""
@@ -1534,7 +1534,7 @@ msgid "Manufacturing Orders To Start"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr ""
@@ -1624,7 +1624,7 @@ msgid "Production Analysis"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr ""
@@ -2113,7 +2113,7 @@ msgid "Product type is Stockable or Consumable."
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
diff --git a/addons/mrp/i18n/bg.po b/addons/mrp/i18n/bg.po
index cc97c80360f..2dbb5ea5340 100644
--- a/addons/mrp/i18n/bg.po
+++ b/addons/mrp/i18n/bg.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:53+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:50+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
#. module: mrp
#: field:mrp.production,move_created_ids:0
@@ -748,7 +748,7 @@ msgid "Per month"
msgstr "За месец"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -761,7 +761,7 @@ msgid "Product Name"
msgstr "Име на продукт"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr "Невалидно действие !"
@@ -1273,7 +1273,7 @@ msgstr ""
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
@@ -1327,7 +1327,7 @@ msgid "Month -1"
msgstr "Месец -1"
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr ""
@@ -1338,7 +1338,7 @@ msgid "Production Order N° :"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr ""
@@ -1567,7 +1567,7 @@ msgid "Manufacturing Orders To Start"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr ""
@@ -1657,7 +1657,7 @@ msgid "Production Analysis"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr "Копиране"
@@ -2146,7 +2146,7 @@ msgid "Product type is Stockable or Consumable."
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
diff --git a/addons/mrp/i18n/bs.po b/addons/mrp/i18n/bs.po
index f5106281e27..9a78c360f43 100644
--- a/addons/mrp/i18n/bs.po
+++ b/addons/mrp/i18n/bs.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:53+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:50+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
#. module: mrp
#: field:mrp.production,move_created_ids:0
@@ -715,7 +715,7 @@ msgid "Per month"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -728,7 +728,7 @@ msgid "Product Name"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr ""
@@ -1240,7 +1240,7 @@ msgstr ""
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
@@ -1294,7 +1294,7 @@ msgid "Month -1"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr ""
@@ -1305,7 +1305,7 @@ msgid "Production Order N° :"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr ""
@@ -1534,7 +1534,7 @@ msgid "Manufacturing Orders To Start"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr ""
@@ -1624,7 +1624,7 @@ msgid "Production Analysis"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr ""
@@ -2113,7 +2113,7 @@ msgid "Product type is Stockable or Consumable."
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
diff --git a/addons/mrp/i18n/ca.po b/addons/mrp/i18n/ca.po
index c6d359150ec..a81bfdc6da6 100644
--- a/addons/mrp/i18n/ca.po
+++ b/addons/mrp/i18n/ca.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2011-08-17 22:02+0000\n"
-"Last-Translator: mgaja (GrupoIsep.com) \n"
+"PO-Revision-Date: 2011-12-06 11:07+0000\n"
+"Last-Translator: Fabien (Open ERP) \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:53+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:50+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
#. module: mrp
#: field:mrp.production,move_created_ids:0
@@ -758,7 +758,7 @@ msgid "Per month"
msgstr "Per mes"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -771,7 +771,7 @@ msgid "Product Name"
msgstr "Nom producte"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr "Acció no vàlida!"
@@ -1320,7 +1320,7 @@ msgstr "Ubicació on el sistema emmagatzemarà els productes finalitzats."
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
"Aquest és l'albarà intern que porta el producte acabat cap al pla de "
@@ -1380,7 +1380,7 @@ msgid "Month -1"
msgstr "Mes -1"
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr "Ordre de producció '%s' planificada pel '%s'"
@@ -1391,7 +1391,7 @@ msgid "Production Order N° :"
msgstr "Núm. ordre producció :"
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr "Ordre de fabricació '%s' està preparada per produir"
@@ -1635,7 +1635,7 @@ msgid "Manufacturing Orders To Start"
msgstr "Ordres de producció a iniciar"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr "No es pot eliminar ordre/s de producció que estan en estat %s!"
@@ -1728,7 +1728,7 @@ msgid "Production Analysis"
msgstr "Anàlisi de producció"
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr "Copieu"
@@ -2254,7 +2254,7 @@ msgid "Product type is Stockable or Consumable."
msgstr "Tipus de producte és emmagatzemable o consumible."
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -3321,6 +3321,13 @@ msgstr "Any"
#~ msgid "Workcenter Usage"
#~ msgstr "Us del centre de producció"
+#~ msgid ""
+#~ "This is the internal picking list that brings the finished product to the "
+#~ "production plan"
+#~ msgstr ""
+#~ "Aquest és l'albarà intern que porta el producte acabat cap al pla de "
+#~ "producció."
+
#~ msgid ""
#~ "Routing indicates all the workcenters used, for how long and/or cycles.If "
#~ "Routing is indicated then,the third tab of a production order (workcenters) "
diff --git a/addons/mrp/i18n/cs.po b/addons/mrp/i18n/cs.po
index 5244b3928c6..57c6e3b019b 100644
--- a/addons/mrp/i18n/cs.po
+++ b/addons/mrp/i18n/cs.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:53+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:50+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
"X-Poedit-Language: Czech\n"
#. module: mrp
@@ -727,7 +727,7 @@ msgid "Per month"
msgstr "Za měsíc"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -740,7 +740,7 @@ msgid "Product Name"
msgstr "Jméno výrobku"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr "Neplatná akce !"
@@ -1257,7 +1257,7 @@ msgstr "Umístění kde systém naskladní hotové výrobky."
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
@@ -1311,7 +1311,7 @@ msgid "Month -1"
msgstr "Měsíc -1"
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr "Výrobní příkaz '%s' je naplánován pro %s."
@@ -1322,7 +1322,7 @@ msgid "Production Order N° :"
msgstr "Výrobní příkaz N° :"
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr "Výrobní příkaz '%s' je připraven k výrobě."
@@ -1551,7 +1551,7 @@ msgid "Manufacturing Orders To Start"
msgstr "Výrobní příkazy pro spuštění"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr ""
@@ -1641,7 +1641,7 @@ msgid "Production Analysis"
msgstr "Analýza výroby"
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr "Kopírovat"
@@ -2136,7 +2136,7 @@ msgid "Product type is Stockable or Consumable."
msgstr "Typ výrobku je Skladový nebo Spotřební."
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
diff --git a/addons/mrp/i18n/da.po b/addons/mrp/i18n/da.po
index 17a13380616..59fe0907efe 100644
--- a/addons/mrp/i18n/da.po
+++ b/addons/mrp/i18n/da.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-10 04:57+0000\n"
-"X-Generator: Launchpad (build 14263)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:50+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
#. module: mrp
#: field:mrp.production,move_created_ids:0
@@ -716,7 +716,7 @@ msgid "Per month"
msgstr "Pr. måned"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -729,7 +729,7 @@ msgid "Product Name"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr ""
@@ -1241,7 +1241,7 @@ msgstr ""
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
@@ -1295,7 +1295,7 @@ msgid "Month -1"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr ""
@@ -1306,7 +1306,7 @@ msgid "Production Order N° :"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr ""
@@ -1535,7 +1535,7 @@ msgid "Manufacturing Orders To Start"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr ""
@@ -1625,7 +1625,7 @@ msgid "Production Analysis"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr ""
@@ -2114,7 +2114,7 @@ msgid "Product type is Stockable or Consumable."
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
diff --git a/addons/mrp/i18n/de.po b/addons/mrp/i18n/de.po
index 73f62cd257d..99e1b5f1f59 100644
--- a/addons/mrp/i18n/de.po
+++ b/addons/mrp/i18n/de.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2011-04-03 09:21+0000\n"
-"Last-Translator: Ferdinand @ Camptocamp \n"
+"PO-Revision-Date: 2011-12-06 11:05+0000\n"
+"Last-Translator: Ferdinand-camptocamp \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:53+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:50+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
#. module: mrp
#: field:mrp.production,move_created_ids:0
@@ -758,7 +758,7 @@ msgid "Per month"
msgstr "Pro Monat"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -771,7 +771,7 @@ msgid "Product Name"
msgstr "Produkt Bezeichnung"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr "Fehlerhafte Aktion !"
@@ -1323,7 +1323,7 @@ msgstr "Ort, an dem das System die Fertigprodukte einlagern wird."
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
"Dies ist ein interner Lieferauftrag, der die gefertigten Produkte in den "
@@ -1382,7 +1382,7 @@ msgid "Month -1"
msgstr "Monat -1"
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr "Fertigungsauftrag '%s' ist geplant für %s."
@@ -1393,7 +1393,7 @@ msgid "Production Order N° :"
msgstr "Fertigungsauftragsnr."
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr "Fertigungsauftrag '%s' ist Startbereit."
@@ -1635,7 +1635,7 @@ msgid "Manufacturing Orders To Start"
msgstr "Fertigungsaufträge (Startbereit)"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr "Fertigungsaufträge im Status %s können nicht gelöscht werden"
@@ -1728,7 +1728,7 @@ msgid "Production Analysis"
msgstr "Statistik Fertigungsaufträge"
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr "Duplizieren"
@@ -2257,7 +2257,7 @@ msgid "Product type is Stockable or Consumable."
msgstr "Produkttyp ist 'Lagerprodukt' oder 'Verbrauchsmaterial'."
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -3350,6 +3350,13 @@ msgstr "Jahr"
#~ "können. Wenn an diesem Arbeitsplatz 5 Mitarbeiter tätig sind, liegt die "
#~ "Kapazität pro Zyklus bei 5."
+#~ msgid ""
+#~ "This is the internal picking list that brings the finished product to the "
+#~ "production plan"
+#~ msgstr ""
+#~ "Dies ist ein interner Lieferauftrag, der die gefertigten Produkte in den "
+#~ "Fertigungsplan eintragen wird"
+
#~ msgid ""
#~ "Description of the work center. Explain here what's a cycle according to "
#~ "this work center."
diff --git a/addons/mrp/i18n/el.po b/addons/mrp/i18n/el.po
index 8120ac8bb2f..7d85bf2de57 100644
--- a/addons/mrp/i18n/el.po
+++ b/addons/mrp/i18n/el.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2010-11-27 12:17+0000\n"
+"PO-Revision-Date: 2011-12-06 11:08+0000\n"
"Last-Translator: qdp (OpenERP) \n"
"Language-Team: l10n_chart_gr \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:54+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:50+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
"X-Poedit-Country: GREECE\n"
"X-Poedit-Language: Greek\n"
"X-Poedit-SourceCharset: utf-8\n"
@@ -724,7 +724,7 @@ msgid "Per month"
msgstr "Ανά μήνα"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -737,7 +737,7 @@ msgid "Product Name"
msgstr "Όνομα Προϊόντος"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr "Άκυρη ενέργεια!"
@@ -1249,7 +1249,7 @@ msgstr "Τοποθεσία όπου το σύστημα θα αποθηκεύσ
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
@@ -1303,7 +1303,7 @@ msgid "Month -1"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr ""
@@ -1314,7 +1314,7 @@ msgid "Production Order N° :"
msgstr "Νο Εντολής Παραγωγής:"
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr ""
@@ -1543,7 +1543,7 @@ msgid "Manufacturing Orders To Start"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr ""
@@ -1633,7 +1633,7 @@ msgid "Production Analysis"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr ""
@@ -2123,7 +2123,7 @@ msgid "Product type is Stockable or Consumable."
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
diff --git a/addons/mrp/i18n/es.po b/addons/mrp/i18n/es.po
index bb45000dc25..76bfff76f74 100644
--- a/addons/mrp/i18n/es.po
+++ b/addons/mrp/i18n/es.po
@@ -7,15 +7,15 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2011-03-12 16:35+0000\n"
+"PO-Revision-Date: 2011-12-06 11:03+0000\n"
"Last-Translator: Jordi Esteve (www.zikzakmedia.com) "
"\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:54+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:51+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
#. module: mrp
#: field:mrp.production,move_created_ids:0
@@ -760,7 +760,7 @@ msgid "Per month"
msgstr "Por mes"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -773,7 +773,7 @@ msgid "Product Name"
msgstr "Nombre producto"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr "¡Acción no válida!"
@@ -1321,7 +1321,7 @@ msgstr "Ubicación donde el sistema almacenará los productos finalizados."
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
"Este es el albarán interno que trae el producto terminado hacia el plan de "
@@ -1381,7 +1381,7 @@ msgid "Month -1"
msgstr "Mes -1"
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr "Órden de producción '%s' planificada para el '%s'"
@@ -1392,7 +1392,7 @@ msgid "Production Order N° :"
msgstr "Núm. orden producción :"
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr "Orden fabricación '%s' está preparada para producir."
@@ -1635,7 +1635,7 @@ msgid "Manufacturing Orders To Start"
msgstr "Órdenes de producción a iniciar"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr ""
@@ -1729,7 +1729,7 @@ msgid "Production Analysis"
msgstr "Análisis de producción"
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr "Copiar"
@@ -2258,7 +2258,7 @@ msgid "Product type is Stockable or Consumable."
msgstr "Tipo de producto es almacenable o consumible."
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -3324,6 +3324,13 @@ msgstr "Año"
#~ "futuras cargas de los centros de producción a partir de la planificación de "
#~ "la producción."
+#~ msgid ""
+#~ "This is the internal picking list that brings the finished product to the "
+#~ "production plan"
+#~ msgstr ""
+#~ "Este es el albarán interno que trae el producto terminado hacia el plan de "
+#~ "producción."
+
#~ msgid "Workcenter Usage"
#~ msgstr "Uso centro de producción"
diff --git a/addons/mrp/i18n/es_AR.po b/addons/mrp/i18n/es_AR.po
index f3c9ec67c23..eadea6dfc48 100644
--- a/addons/mrp/i18n/es_AR.po
+++ b/addons/mrp/i18n/es_AR.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:55+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:51+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
#. module: mrp
#: field:mrp.production,move_created_ids:0
@@ -749,7 +749,7 @@ msgid "Per month"
msgstr "Por mes"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -762,7 +762,7 @@ msgid "Product Name"
msgstr "Nombre del Producto"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr "¡Acción no válida!"
@@ -1295,7 +1295,7 @@ msgstr "Ubicación donde el sistema almacenará los productos finalizados."
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
@@ -1353,7 +1353,7 @@ msgid "Month -1"
msgstr "Mes -1"
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr ""
@@ -1364,7 +1364,7 @@ msgid "Production Order N° :"
msgstr "Orden de producción Nº :"
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr ""
@@ -1601,7 +1601,7 @@ msgid "Manufacturing Orders To Start"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr ""
@@ -1692,7 +1692,7 @@ msgid "Production Analysis"
msgstr "Análisis de la producción"
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr "Copiar"
@@ -2202,7 +2202,7 @@ msgid "Product type is Stockable or Consumable."
msgstr "Tipo de producto es almacenable o consumible."
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
diff --git a/addons/mrp/i18n/es_CL.po b/addons/mrp/i18n/es_CL.po
index 5b574d2578d..55a2771ced5 100644
--- a/addons/mrp/i18n/es_CL.po
+++ b/addons/mrp/i18n/es_CL.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:55+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:51+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
#. module: mrp
#: field:mrp.production,move_created_ids:0
@@ -759,7 +759,7 @@ msgid "Per month"
msgstr "Por mes"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -772,7 +772,7 @@ msgid "Product Name"
msgstr "Nombre producto"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr "¡Acción no válida!"
@@ -1320,11 +1320,9 @@ msgstr "Ubicación donde el sistema almacenará los productos finalizados."
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
-"Este es el albarán interno que trae el producto terminado hacia el plan de "
-"producción."
#. module: mrp
#: field:stock.change.standard.price,change_parent_price:0
@@ -1380,7 +1378,7 @@ msgid "Month -1"
msgstr "Mes -1"
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr "Órden de producción '%s' planificada para el '%s'"
@@ -1391,7 +1389,7 @@ msgid "Production Order N° :"
msgstr "Núm. orden producción :"
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr "Orden fabricación '%s' está preparada para producir."
@@ -1628,7 +1626,7 @@ msgid "Manufacturing Orders To Start"
msgstr "Órdenes de producción a iniciar"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr ""
@@ -1722,7 +1720,7 @@ msgid "Production Analysis"
msgstr "Análisis de producción"
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr "Copiar"
@@ -2251,7 +2249,7 @@ msgid "Product type is Stockable or Consumable."
msgstr "Tipo de producto es almacenable o consumible."
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -2567,6 +2565,13 @@ msgstr "Año"
#~ "paralelo. Si este centro de trabajo representa un equipo del 5 trabajadores, "
#~ "la capacidad por ciclo es de 5."
+#~ msgid ""
+#~ "This is the internal picking list that brings the finished product to the "
+#~ "production plan"
+#~ msgstr ""
+#~ "Este es el albarán interno que trae el producto terminado hacia el plan de "
+#~ "producción."
+
#~ msgid ""
#~ "Routing indicates all the workcenters used, for how long and/or cycles.If "
#~ "Routing is indicated then,the third tab of a production order (workcenters) "
diff --git a/addons/mrp/i18n/es_EC.po b/addons/mrp/i18n/es_EC.po
index a11178e0c8e..0cd26845cbf 100644
--- a/addons/mrp/i18n/es_EC.po
+++ b/addons/mrp/i18n/es_EC.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:55+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:52+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
#. module: mrp
#: field:mrp.production,move_created_ids:0
@@ -759,7 +759,7 @@ msgid "Per month"
msgstr "Por mes"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -772,7 +772,7 @@ msgid "Product Name"
msgstr "Nombre producto"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr "¡Acción inválida!"
@@ -1320,11 +1320,9 @@ msgstr "Ubicación donde el sistema almacenará los productos finalizados."
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
-"Este es el albarán interno que trae el producto terminado hacia el plan de "
-"producción."
#. module: mrp
#: field:stock.change.standard.price,change_parent_price:0
@@ -1380,7 +1378,7 @@ msgid "Month -1"
msgstr "Mes -1"
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr "Órden de producción '%s' planificada para el '%s'"
@@ -1391,7 +1389,7 @@ msgid "Production Order N° :"
msgstr "Núm. orden producción :"
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr "Orden fabricación '%s' está preparada para producir."
@@ -1634,7 +1632,7 @@ msgid "Manufacturing Orders To Start"
msgstr "Órdenes de producción a iniciar"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr ""
@@ -1728,7 +1726,7 @@ msgid "Production Analysis"
msgstr "Análisis de producción"
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr "Copiar"
@@ -2257,7 +2255,7 @@ msgid "Product type is Stockable or Consumable."
msgstr "Tipo de producto es almacenable o consumible."
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -3328,6 +3326,13 @@ msgstr "Año"
#~ " *Lista de órdenes de fabricación con excepciones\n"
#~ " "
+#~ msgid ""
+#~ "This is the internal picking list that brings the finished product to the "
+#~ "production plan"
+#~ msgstr ""
+#~ "Este es el albarán interno que trae el producto terminado hacia el plan de "
+#~ "producción."
+
#~ msgid ""
#~ "Routing indicates all the workcenters used, for how long and/or cycles.If "
#~ "Routing is indicated then,the third tab of a production order (workcenters) "
diff --git a/addons/mrp/i18n/es_MX.po b/addons/mrp/i18n/es_MX.po
index 4504a8e2f95..82d584be219 100644
--- a/addons/mrp/i18n/es_MX.po
+++ b/addons/mrp/i18n/es_MX.po
@@ -1321,7 +1321,7 @@ msgstr "Ubicación donde el sistema almacenará los productos finalizados."
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
"Este es el albarán interno que trae el producto terminado hacia el plan de "
@@ -2803,7 +2803,7 @@ msgstr "Año"
#~ "producción."
#~ msgid ""
-#~ "This is the internal picking list take bring the raw materials to the "
+#~ "This is the Internal Picking List take bring the raw materials to the "
#~ "production plan."
#~ msgstr ""
#~ "Ésta es la lista de empaquetado interna que lleva las materias primas a la "
diff --git a/addons/mrp/i18n/es_VE.po b/addons/mrp/i18n/es_VE.po
index 4504a8e2f95..82d584be219 100644
--- a/addons/mrp/i18n/es_VE.po
+++ b/addons/mrp/i18n/es_VE.po
@@ -1321,7 +1321,7 @@ msgstr "Ubicación donde el sistema almacenará los productos finalizados."
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
"Este es el albarán interno que trae el producto terminado hacia el plan de "
@@ -2803,7 +2803,7 @@ msgstr "Año"
#~ "producción."
#~ msgid ""
-#~ "This is the internal picking list take bring the raw materials to the "
+#~ "This is the Internal Picking List take bring the raw materials to the "
#~ "production plan."
#~ msgstr ""
#~ "Ésta es la lista de empaquetado interna que lleva las materias primas a la "
diff --git a/addons/mrp/i18n/et.po b/addons/mrp/i18n/et.po
index 8e2648993cb..39bae390026 100644
--- a/addons/mrp/i18n/et.po
+++ b/addons/mrp/i18n/et.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:53+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:50+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
#. module: mrp
#: field:mrp.production,move_created_ids:0
@@ -715,7 +715,7 @@ msgid "Per month"
msgstr "Kuus"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -728,7 +728,7 @@ msgid "Product Name"
msgstr "Toote nimi"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr "Vigane tegevus !"
@@ -1240,7 +1240,7 @@ msgstr ""
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
@@ -1294,7 +1294,7 @@ msgid "Month -1"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr ""
@@ -1305,7 +1305,7 @@ msgid "Production Order N° :"
msgstr "tootmiskorralduse N° :"
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr ""
@@ -1534,7 +1534,7 @@ msgid "Manufacturing Orders To Start"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr ""
@@ -1624,7 +1624,7 @@ msgid "Production Analysis"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr ""
@@ -2113,7 +2113,7 @@ msgid "Product type is Stockable or Consumable."
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
diff --git a/addons/mrp/i18n/fi.po b/addons/mrp/i18n/fi.po
index 78a0b3583b9..bfcdf990112 100644
--- a/addons/mrp/i18n/fi.po
+++ b/addons/mrp/i18n/fi.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2011-01-19 12:22+0000\n"
-"Last-Translator: Pekka Pylvänäinen \n"
+"PO-Revision-Date: 2011-12-06 09:50+0000\n"
+"Last-Translator: Fabien (Open ERP) \n"
"Language-Team: Finnish \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:53+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:50+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
#. module: mrp
#: field:mrp.production,move_created_ids:0
@@ -749,7 +749,7 @@ msgid "Per month"
msgstr "Kuukaudessa"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -762,7 +762,7 @@ msgid "Product Name"
msgstr "Tuotteen nimi"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr "Virheellinen toiminto!"
@@ -1285,7 +1285,7 @@ msgstr "Paikka jonne järjestelmä varastoi valmiit tuotteet."
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
"Tämä on sisäinen keräilyslista joka tuo lopputuotteen tuontatosuunnitelmaan"
@@ -1343,7 +1343,7 @@ msgid "Month -1"
msgstr "edellinen kk"
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr "Valmistustilaus '%s' on aikataulutettu '%s':lle."
@@ -1354,7 +1354,7 @@ msgid "Production Order N° :"
msgstr "Tuotantotilaus nro:"
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr "Valmistustilaus '%s'on valmis tuotantoon."
@@ -1589,7 +1589,7 @@ msgid "Manufacturing Orders To Start"
msgstr "Aloitettavat valmistustilaukset"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr "Valmistustilauksia, jotka ovat %s tilassa, ei voi poistaa!"
@@ -1682,7 +1682,7 @@ msgid "Production Analysis"
msgstr "Tuotannon analyysi"
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr "Kopioi"
@@ -2185,7 +2185,7 @@ msgid "Product type is Stockable or Consumable."
msgstr "Tuotetyyppi on varastoitava tai käytettävä"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -3219,6 +3219,12 @@ msgstr "Vuosi"
#~ "Työpisteen suorittavien rinnakkaisten tehtävien lukumäärä. Jos työpisteen "
#~ "henkilöstö on 5 työntekijää, kapasiteetti sykliä kohti on 5."
+#~ msgid ""
+#~ "This is the internal picking list that brings the finished product to the "
+#~ "production plan"
+#~ msgstr ""
+#~ "Tämä on sisäinen keräilyslista joka tuo lopputuotteen tuontatosuunnitelmaan"
+
#~ msgid ""
#~ "Description of the work center. Explain here what's a cycle according to "
#~ "this work center."
diff --git a/addons/mrp/i18n/fr.po b/addons/mrp/i18n/fr.po
index 884c885b019..628aeae9449 100644
--- a/addons/mrp/i18n/fr.po
+++ b/addons/mrp/i18n/fr.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2011-09-26 12:16+0000\n"
+"PO-Revision-Date: 2011-12-06 10:24+0000\n"
"Last-Translator: lholivier \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:53+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:50+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
#. module: mrp
#: field:mrp.bom,product_uos:0
@@ -776,7 +776,7 @@ msgid "Per month"
msgstr "Par mois"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -789,7 +789,7 @@ msgid "Product Name"
msgstr "Nom du Produit"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr "Action non valide !"
@@ -1374,7 +1374,7 @@ msgstr "Emplacement où le système stockera les produits finis."
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
"C'est le bon de transfert interne qui fournit les produits finis au plan de "
@@ -1434,7 +1434,7 @@ msgid "Month -1"
msgstr "Mois -1"
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr "Ordre de production '%s' est planifié pour le %s."
@@ -1445,7 +1445,7 @@ msgid "Production Order N° :"
msgstr "Ordre de Production N° :"
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr "L'ordre de production '%s' est pret a être produit."
@@ -1688,7 +1688,7 @@ msgid "Manufacturing Orders To Start"
msgstr "Ordres de fabrication à lancer"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr "Impossible de supprimer l'ordre de production à l'état %s !"
@@ -1767,7 +1767,7 @@ msgid "Production Analysis"
msgstr "Analyse de la production"
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr "Copier"
@@ -2295,7 +2295,7 @@ msgid "Product type is Stockable or Consumable."
msgstr "Le type produit est stockable ou consommable."
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -3340,6 +3340,13 @@ msgstr "Année"
#~ "Le nom de l'objet doit commencer par x_ et ne doit contenir aucun caractère "
#~ "spécial!"
+#~ msgid ""
+#~ "This is the internal picking list that brings the finished product to the "
+#~ "production plan"
+#~ msgstr ""
+#~ "C'est le bon de transfert interne qui fournit les produits finis au plan de "
+#~ "production"
+
#~ msgid "A cycle is defined in the workcenter definition."
#~ msgstr "Un cycle est défini dans la définition du Centre de Production."
diff --git a/addons/mrp/i18n/gl.po b/addons/mrp/i18n/gl.po
index 3ba7c6c8c85..7410d5e6ece 100644
--- a/addons/mrp/i18n/gl.po
+++ b/addons/mrp/i18n/gl.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2011-06-09 15:28+0000\n"
-"Last-Translator: FULL NAME \n"
+"PO-Revision-Date: 2011-12-06 10:31+0000\n"
+"Last-Translator: Fabien (Open ERP) \n"
"Language-Team: Galician \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:53+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:50+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
#. module: mrp
#: field:mrp.production,move_created_ids:0
@@ -757,7 +757,7 @@ msgid "Per month"
msgstr "Por mes"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -770,7 +770,7 @@ msgid "Product Name"
msgstr "Nome produto"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr "Acción non válida!"
@@ -1314,7 +1314,7 @@ msgstr "Lugar onde almacenará o sistema os produtos rematados"
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
"Este é o albará interno que trae o produto rematado ó plan de produción."
@@ -1373,7 +1373,7 @@ msgid "Month -1"
msgstr "Mes -1"
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr "Orde de produción '%s' planificada para o '%s'"
@@ -1384,7 +1384,7 @@ msgid "Production Order N° :"
msgstr "Nº orde produción:"
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr "A orde de fabricación '%s' está preparada para producir."
@@ -1626,7 +1626,7 @@ msgid "Manufacturing Orders To Start"
msgstr "Ordes de produción a iniciar"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr ""
@@ -1720,7 +1720,7 @@ msgid "Production Analysis"
msgstr "Análise de produción"
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr "Copiar"
@@ -2243,7 +2243,7 @@ msgid "Product type is Stockable or Consumable."
msgstr "O Tipo de produto é almacenable ou consumible."
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -2614,6 +2614,12 @@ msgstr "Ano"
#~ "ordes de fabricación con excepcións\n"
#~ " "
+#~ msgid ""
+#~ "This is the internal picking list that brings the finished product to the "
+#~ "production plan"
+#~ msgstr ""
+#~ "Este é o albará interno que trae o produto rematado ó plan de produción."
+
#~ msgid ""
#~ "Routing indicates all the workcenters used, for how long and/or cycles.If "
#~ "Routing is indicated then,the third tab of a production order (workcenters) "
diff --git a/addons/mrp/i18n/hi.po b/addons/mrp/i18n/hi.po
index 40199555bbc..9ece8255329 100644
--- a/addons/mrp/i18n/hi.po
+++ b/addons/mrp/i18n/hi.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:54+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:50+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
#. module: mrp
#: field:mrp.production,move_created_ids:0
@@ -716,7 +716,7 @@ msgid "Per month"
msgstr "प्रति माह"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -729,7 +729,7 @@ msgid "Product Name"
msgstr "वस्तु का नाम"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr ""
@@ -1241,7 +1241,7 @@ msgstr ""
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
@@ -1295,7 +1295,7 @@ msgid "Month -1"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr ""
@@ -1306,7 +1306,7 @@ msgid "Production Order N° :"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr ""
@@ -1535,7 +1535,7 @@ msgid "Manufacturing Orders To Start"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr ""
@@ -1625,7 +1625,7 @@ msgid "Production Analysis"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr ""
@@ -2114,7 +2114,7 @@ msgid "Product type is Stockable or Consumable."
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
diff --git a/addons/mrp/i18n/hr.po b/addons/mrp/i18n/hr.po
index 0f488328de2..4600dbaa8c6 100644
--- a/addons/mrp/i18n/hr.po
+++ b/addons/mrp/i18n/hr.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2010-08-03 08:21+0000\n"
-"Last-Translator: Mantavya Gajjar (Open ERP) \n"
+"PO-Revision-Date: 2011-12-12 09:28+0000\n"
+"Last-Translator: Tomislav Bosnjakovic \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:54+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-13 05:01+0000\n"
+"X-Generator: Launchpad (build 14458)\n"
#. module: mrp
#: field:mrp.production,move_created_ids:0
@@ -31,6 +31,11 @@ msgid ""
"raw materials (stock decrease) and the production of the finished products "
"(stock increase) when the order is processed."
msgstr ""
+"Manufacturing Orders are usually proposed automatically by OpenERP based on "
+"the bill of materials and the procurement rules, but you can also create "
+"manufacturing orders manually. OpenERP will handle the consumption of the "
+"raw materials (stock decrease) and the production of the finished products "
+"(stock increase) when the order is processed."
#. module: mrp
#: help:mrp.production,location_src_id:0
@@ -40,22 +45,22 @@ msgstr "Mjesto gdje sistem traži komponente"
#. module: mrp
#: field:mrp.production,workcenter_lines:0
msgid "Work Centers Utilisation"
-msgstr "Iskorištenje Radnih Centara"
+msgstr "Iskorištenost radnih centara"
#. module: mrp
#: view:mrp.routing.workcenter:0
msgid "Routing Work Centers"
-msgstr "Slijed Radnih Centara"
+msgstr "Radni centri usmjeravanja"
#. module: mrp
#: model:ir.module.module,shortdesc:mrp.module_meta_information
msgid "Manufacturing Resource Planning"
-msgstr ""
+msgstr "Planiranje resursa proizvodnje"
#. module: mrp
#: report:mrp.production.order:0
msgid "No. Of Cycles"
-msgstr "Br. Ciklusa"
+msgstr "Br. ciklusa"
#. module: mrp
#: field:mrp.routing.workcenter,cycle_nbr:0
@@ -68,12 +73,14 @@ msgid ""
"The 'Minimum stock rule' allows the system to create procurement orders "
"automatically as soon as the minimum stock is reached."
msgstr ""
+"'Pravilo minimalne zalihe' omogućuje automatsko kreiranje naloga nabave kada "
+"nivo zalihe dostigne definirani minimum."
#. module: mrp
#: field:mrp.production,picking_id:0
#: field:mrp.production.order,picking_id:0
msgid "Picking list"
-msgstr ""
+msgstr "Skladišnica"
#. module: mrp
#: code:addons/mrp/report/price.py:121
@@ -90,7 +97,7 @@ msgstr ""
#. module: mrp
#: view:mrp.production:0
msgid "Scrap Products"
-msgstr "Otpad"
+msgstr "Otpis proizvoda"
#. module: mrp
#: view:mrp.production.order:0
@@ -102,22 +109,22 @@ msgstr "Dan"
#: model:ir.actions.act_window,name:mrp.mrp_routing_action
#: model:ir.ui.menu,name:mrp.menu_mrp_routing_action
msgid "Routings"
-msgstr ""
+msgstr "Usmjeravanja"
#. module: mrp
#: field:mrp.workcenter,product_id:0
msgid "Work Center Product"
-msgstr ""
+msgstr "Proizvod radnog centra"
#. module: mrp
#: view:mrp.bom:0
msgid "Search Bill Of Material"
-msgstr "Pretraži Listu Materijala"
+msgstr "Traži sastavnice"
#. module: mrp
#: model:process.node,note:mrp.process_node_stockproduct1
msgid "For stockable products and consumables"
-msgstr ""
+msgstr "For stockable products and consumables"
#. module: mrp
#: model:process.transition,name:mrp.process_transition_stockproduction0
@@ -130,6 +137,8 @@ msgid ""
"Number of iterations this work center has to do in the specified operation "
"of the routing."
msgstr ""
+"Number of iterations this work center has to do in the specified operation "
+"of the routing."
#. module: mrp
#: view:mrp.bom:0
@@ -137,18 +146,18 @@ msgstr ""
#: view:mrp.production:0
#: field:mrp.production,name:0
msgid "Reference"
-msgstr "Referenca"
+msgstr "Vezna oznaka"
#. module: mrp
#: view:mrp.production:0
msgid "Finished Products"
-msgstr "Gotovi Proizvodi"
+msgstr "Gototvi proizvodi"
#. module: mrp
#: model:process.transition,name:mrp.process_transition_servicerfq0
#: model:process.transition,name:mrp.process_transition_stockrfq0
msgid "To Buy"
-msgstr "Za Kupiti"
+msgstr "Za nabaviti"
#. module: mrp
#: view:mrp.production.order:0
@@ -165,17 +174,17 @@ msgstr ""
#. module: mrp
#: model:process.transition,note:mrp.process_transition_purchaseprocure0
msgid "The system launches automatically a RFQ to the preferred supplier."
-msgstr ""
+msgstr "Sustav automatski pokreče RFQ na preferiranog dobavljača."
#. module: mrp
#: view:mrp.production:0
msgid "Products to Finish"
-msgstr "Proizvodi za Završiti"
+msgstr "Proizvodi za završiti"
#. module: mrp
#: selection:mrp.bom,method:0
msgid "Set / Pack"
-msgstr "Set / Pakovanje"
+msgstr "Set / Paket"
#. module: mrp
#: field:mrp.installer,mrp_subproduct:0
@@ -188,12 +197,12 @@ msgstr "MRP Podproizvodi"
#: view:mrp.production.order:0
#: field:mrp.production.order,state:0
msgid "State"
-msgstr "Status"
+msgstr "Stanje"
#. module: mrp
#: field:mrp.workcenter,costs_hour:0
msgid "Cost per hour"
-msgstr "Trošak po Stu"
+msgstr "Trošak po satu"
#. module: mrp
#: model:process.transition,note:mrp.process_transition_stockproduction0
@@ -201,7 +210,7 @@ msgid ""
"In case the Supply method of the product is Produce, the system creates a "
"production order."
msgstr ""
-"U slučaju da je metoda nabave proizvoda Proizvodnja, sistem kreira nalog za "
+"Kada je metoda nabave proizvoda Proizvodnja, sistem kreira nalog za "
"proizvodnju."
#. module: mrp
@@ -217,7 +226,7 @@ msgstr "JM"
#: field:mrp.production.order,product_qty:0
#: field:mrp.production.product.line,product_qty:0
msgid "Product Qty"
-msgstr "Količina proizvoda"
+msgstr "Količina"
#. module: mrp
#: help:mrp.workcenter,product_id:0
@@ -225,6 +234,8 @@ msgid ""
"Fill this product to track easily your production costs in the analytic "
"accounting."
msgstr ""
+"Ispunite ovaj proizvod kako b jednostavno pratili troškove proizvodnje "
+"unutar analitike računovodstva."
#. module: mrp
#: model:process.node,note:mrp.process_node_purchaseprocure0
@@ -244,7 +255,7 @@ msgstr "Izvještavanje"
#. module: mrp
#: field:mrp.workcenter,costs_cycle_account_id:0
msgid "Cycle Account"
-msgstr "Račun Ciklusa"
+msgstr "Konto ciklusa"
#. module: mrp
#: code:addons/mrp/report/price.py:121
@@ -260,7 +271,7 @@ msgstr "["
#. module: mrp
#: model:process.transition,name:mrp.process_transition_procureserviceproduct0
msgid "Procurement of services"
-msgstr "Nabava servisa"
+msgstr "Nabava usluga"
#. module: mrp
#: view:mrp.workcenter:0
@@ -270,7 +281,7 @@ msgstr "Informacija o kapacitetu"
#. module: mrp
#: report:mrp.production.order:0
msgid "Destination Location"
-msgstr "Odredišna Lokacija"
+msgstr "Odredišna lokacija"
#. module: mrp
#: view:mrp.installer:0
@@ -280,7 +291,7 @@ msgstr "naslov"
#. module: mrp
#: model:ir.ui.menu,name:mrp.menu_mrp_bom
msgid "Master Data"
-msgstr "Matični Podaci"
+msgstr "Glavni podaci"
#. module: mrp
#: model:process.transition,note:mrp.process_transition_stockmts0
@@ -288,11 +299,13 @@ msgid ""
"The system waits for the products to be available in the stock. These "
"products are typically procured manually or through a minimum stock rule."
msgstr ""
+"The system waits for the products to be available in the stock. These "
+"products are typically procured manually or through a minimum stock rule."
#. module: mrp
#: report:mrp.production.order:0
msgid "Partner Ref"
-msgstr "Referenca Parnera"
+msgstr "Oznaka partnera"
#. module: mrp
#: selection:mrp.workcenter.load,measure_unit:0
@@ -337,7 +350,7 @@ msgstr "Lipanj"
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_product_produce
msgid "Product Produce"
-msgstr "Proizvedi Proizvod"
+msgstr "Proizvedi proizvod"
#. module: mrp
#: selection:mrp.production.order,month:0
@@ -353,12 +366,12 @@ msgstr ""
#. module: mrp
#: model:process.transition,name:mrp.process_transition_procurestockableproduct0
msgid "Procurement of stockable Product"
-msgstr "Nabava skladištivog Proizvoda"
+msgstr "Nabava uskladištivog proizvoda"
#. module: mrp
#: view:mrp.bom:0
msgid "Default UOM"
-msgstr "Predefinirana JM"
+msgstr "Uobičajena JM"
#. module: mrp
#: code:addons/mrp/report/price.py:130
@@ -377,7 +390,7 @@ msgstr "Broj sati"
#. module: mrp
#: view:mrp.production:0
msgid "Confirm Production"
-msgstr "Potvrdi Proizvodnju"
+msgstr "Potvrdi proizvodnju"
#. module: mrp
#: model:process.transition,note:mrp.process_transition_stockproduct0
@@ -385,6 +398,8 @@ msgid ""
"The system creates an order (production or purchased) depending on the sold "
"quantity and the products parameters."
msgstr ""
+"Sistem kreira nalog (za proizvodnju ili nabavu) prema prodanim količinama i "
+"parametrima proizvoda."
#. module: mrp
#: model:process.transition,note:mrp.process_transition_servicemts0
@@ -392,6 +407,8 @@ msgid ""
"This is used in case of a service without any impact in the system, a "
"training session for instance."
msgstr ""
+"This is used in case of a service without any impact in the system, a "
+"training session for instance."
#. module: mrp
#: field:mrp.installer,mrp_repair:0
@@ -411,7 +428,7 @@ msgstr "Radno vrijeme"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.action_report_in_out_picking_tree
msgid "Weekly Stock Value Variation"
-msgstr "Tjedna Varijacija Vrijednosti Zalihe"
+msgstr "Tjedna varijacija vrijednosti zalihe"
#. module: mrp
#: help:mrp.installer,mrp_repair:0
@@ -425,12 +442,12 @@ msgstr ""
#: report:mrp.production.order:0
#: field:mrp.production.order,date_planned:0
msgid "Scheduled Date"
-msgstr "Planirani Datum"
+msgstr "Planirani datum"
#. module: mrp
#: report:mrp.production.order:0
msgid "Bill Of Material"
-msgstr "Lista Materijala"
+msgstr "Sastavnica"
#. module: mrp
#: help:mrp.routing,location_id:0
@@ -439,21 +456,24 @@ msgid ""
"needed.Set a location if you produce at a fixed location. This can be a "
"partner location if you subcontract the manufacturing operations."
msgstr ""
+"Keep empty if you produce at the location where the finished products are "
+"needed.Set a location if you produce at a fixed location. This can be a "
+"partner location if you subcontract the manufacturing operations."
#. module: mrp
#: view:board.board:0
msgid "Stock Value Variation"
-msgstr ""
+msgstr "Stock Value Variation"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.action2
msgid "Bill of Materials Structure"
-msgstr "Struktura Liste Materijala"
+msgstr "Struktura sastavnice"
#. module: mrp
#: model:process.node,note:mrp.process_node_serviceproduct0
msgid "Product type is service"
-msgstr "Tip proizvoda je servis"
+msgstr "Tip proizvoda je usluga"
#. module: mrp
#: model:ir.actions.act_window,help:mrp.mrp_property_group_action
@@ -461,16 +481,18 @@ msgid ""
"Define specific property groups that can be assigned to the properties of "
"your bill of materials."
msgstr ""
+"Define specific property groups that can be assigned to the properties of "
+"your bill of materials."
#. module: mrp
#: model:process.transition,name:mrp.process_transition_bom0
msgid "Manufacturing decomposition"
-msgstr ""
+msgstr "Dekompozicija proizvodnje"
#. module: mrp
#: model:process.node,note:mrp.process_node_serviceproduct1
msgid "For Services."
-msgstr "Za Servise"
+msgstr "Za usluge."
#. module: mrp
#: field:mrp.bom.revision,date:0
@@ -484,6 +506,8 @@ msgid ""
"Complete this only if you want automatic analytic accounting entries on "
"production orders."
msgstr ""
+"Complete this only if you want automatic analytic accounting entries on "
+"production orders."
#. module: mrp
#: field:mrp.production.workcenter.line,cycle:0
@@ -494,7 +518,7 @@ msgstr "Broj ciklusa"
#: model:process.node,note:mrp.process_node_orderrfq0
#: model:process.node,note:mrp.process_node_rfq0
msgid "Request for Quotation."
-msgstr "Zahtjev za Ponudu"
+msgstr "Zahtjev za ponudom"
#. module: mrp
#: model:process.transition,note:mrp.process_transition_billofmaterialrouting0
@@ -502,32 +526,34 @@ msgid ""
"The Bill of Material is linked to a routing, i.e. the succession of work "
"centers."
msgstr ""
+"The Bill of Material is linked to a routing, i.e. the succession of work "
+"centers."
#. module: mrp
#: constraint:product.product:0
msgid "Error: Invalid ean code"
-msgstr "Pogreška: Nevažeći EAN kod"
+msgstr "Greška: Neispravan barkod!"
#. module: mrp
#: view:mrp.routing:0
#: field:mrp.routing,location_id:0
msgid "Production Location"
-msgstr ""
+msgstr "Lokacija proizvodnje"
#. module: mrp
#: view:mrp.production:0
msgid "Change Qty"
-msgstr ""
+msgstr "Promjeni kol."
#. module: mrp
#: view:mrp.production:0
msgid "Force Reservation"
-msgstr ""
+msgstr "Force Reservation"
#. module: mrp
#: field:mrp.bom.revision,author_id:0
msgid "Author"
-msgstr ""
+msgstr "Autor"
#. module: mrp
#: field:report.mrp.inout,value:0
@@ -537,12 +563,12 @@ msgstr "Vrijednost Zalihe"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.action_product_bom_structure
msgid "Product BoM Structure"
-msgstr ""
+msgstr "Proizvod BoM Struktura"
#. module: mrp
#: view:mrp.production:0
msgid "Search Production"
-msgstr "Pretraži Proizvodnju"
+msgstr "Traži proizvodnju"
#. module: mrp
#: code:addons/mrp/report/price.py:130
@@ -558,36 +584,36 @@ msgstr "Ožujak"
#. module: mrp
#: field:mrp.bom,child_complete_ids:0
msgid "BoM Hierarchy"
-msgstr ""
+msgstr "BoM Hierarchy"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.act_mrp_product_produce
#: view:mrp.product.produce:0
#: view:mrp.production:0
msgid "Produce"
-msgstr ""
+msgstr "Produce"
#. module: mrp
#: help:mrp.workcenter,costs_cycle:0
msgid "Specify Cost of Work Center per cycle."
-msgstr ""
+msgstr "Trošak radnog centra po ciklusu."
#. module: mrp
#: selection:mrp.production,state:0
#: view:mrp.production.order:0
#: selection:mrp.production.order,state:0
msgid "Picking Exception"
-msgstr ""
+msgstr "Skladišna iznimka"
#. module: mrp
#: field:mrp.bom,bom_lines:0
msgid "BoM Lines"
-msgstr ""
+msgstr "BoM Lines"
#. module: mrp
#: field:mrp.workcenter,time_start:0
msgid "Time before prod."
-msgstr ""
+msgstr "Time before prod."
#. module: mrp
#: help:mrp.routing,active:0
@@ -595,11 +621,13 @@ msgid ""
"If the active field is set to False, it will allow you to hide the routing "
"without removing it."
msgstr ""
+"If the active field is set to False, it will allow you to hide the routing "
+"without removing it."
#. module: mrp
#: model:process.transition,name:mrp.process_transition_billofmaterialrouting0
msgid "Material Routing"
-msgstr ""
+msgstr "Usmjeravanje materijala"
#. module: mrp
#: view:mrp.production:0
@@ -607,7 +635,7 @@ msgstr ""
#: report:mrp.production.order:0
#: field:mrp.production.order,consumed_products:0
msgid "Consumed Products"
-msgstr "Utrošeni Proizvodi"
+msgstr "Utrošeni proizvodi"
#. module: mrp
#: constraint:mrp.bom:0
@@ -619,7 +647,7 @@ msgstr ""
#: model:ir.model,name:mrp.model_mrp_workcenter_load
#: model:ir.model,name:mrp.model_report_workcenter_load
msgid "Work Center Load"
-msgstr "Opterećenje Radnog Centra"
+msgstr "Opterećenje radnog centra"
#. module: mrp
#: code:addons/mrp/procurement.py:45
@@ -631,7 +659,7 @@ msgstr ""
#: model:ir.actions.act_window,name:mrp.mrp_bom_form_action2
#: model:ir.ui.menu,name:mrp.menu_mrp_bom_form_action2
msgid "Bill of Material Components"
-msgstr "Komponente Liste Materijala"
+msgstr "Komponente sastavnice"
#. module: mrp
#: field:mrp.production.order,nbr:0
@@ -656,16 +684,20 @@ msgid ""
"operations and to plan future loads on work centers based on production "
"plannification."
msgstr ""
+"The list of operations (list of work centers) to produce the finished "
+"product. The routing is mainly used to compute work center costs during "
+"operations and to plan future loads on work centers based on production "
+"plannification."
#. module: mrp
#: help:mrp.workcenter,time_cycle:0
msgid "Time in hours for doing one cycle."
-msgstr ""
+msgstr "Vrijeme u satima za jedan ciklus."
#. module: mrp
#: report:bom.structure:0
msgid "BOM Ref"
-msgstr ""
+msgstr "Ozn. sastavnice"
#. module: mrp
#: view:mrp.production:0
@@ -678,7 +710,7 @@ msgstr "U proizvodnji"
#. module: mrp
#: model:ir.ui.menu,name:mrp.menu_mrp_property
msgid "Master Bill of Materials"
-msgstr ""
+msgstr "Glavna sastavnica"
#. module: mrp
#: help:mrp.bom,product_uos:0
@@ -686,6 +718,7 @@ msgid ""
"Product UOS (Unit of Sale) is the unit of measurement for the invoicing and "
"promotion of stock."
msgstr ""
+"JP proizvoda (Jedinica Prodaje) je mjerna jedinica za fakturiranje prodaje."
#. module: mrp
#: view:mrp.product_price:0
@@ -697,7 +730,7 @@ msgstr "Ispis"
#: view:mrp.bom:0
#: view:mrp.workcenter:0
msgid "Type"
-msgstr "Tip"
+msgstr "Vrsta"
#. module: mrp
#: code:addons/mrp/report/price.py:150
@@ -709,7 +742,7 @@ msgstr "Ukupni Trošak "
#. module: mrp
#: model:process.node,note:mrp.process_node_minimumstockrule0
msgid "Linked to the 'Minimum stock rule' supplying method."
-msgstr ""
+msgstr "Vezano na 'Pravilo minimalne zalihe' metodu nabave."
#. module: mrp
#: selection:mrp.workcenter.load,time_unit:0
@@ -717,7 +750,7 @@ msgid "Per month"
msgstr "Mjesečno"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -727,10 +760,10 @@ msgstr ""
#. module: mrp
#: report:bom.structure:0
msgid "Product Name"
-msgstr "Ime Proizvoda"
+msgstr "Naziv proizvoda"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr "Pogrešna akcija !"
@@ -738,7 +771,7 @@ msgstr "Pogrešna akcija !"
#. module: mrp
#: help:mrp.bom,product_efficiency:0
msgid "A factor of 0.9 means a loss of 10% within the production process."
-msgstr ""
+msgstr "A factor of 0.9 means a loss of 10% within the production process."
#. module: mrp
#: view:mrp.installer:0
@@ -756,12 +789,12 @@ msgstr "Datum ispisa"
#: model:process.node,name:mrp.process_node_orderrfq0
#: model:process.node,name:mrp.process_node_rfq0
msgid "RFQ"
-msgstr ""
+msgstr "ZZP (RFQ)"
#. module: mrp
#: model:process.transition,name:mrp.process_transition_producttostockrules0
msgid "Procurement rule"
-msgstr ""
+msgstr "Pravilo nabave"
#. module: mrp
#: help:mrp.workcenter,costs_hour:0
@@ -790,6 +823,9 @@ msgid ""
"order creates a RFQ for a subcontracting purchase order or waits until the "
"service is done (= the delivery of the products)."
msgstr ""
+"Depending on the chosen method to 'supply' the service, the procurement "
+"order creates a RFQ for a subcontracting purchase order or waits until the "
+"service is done (= the delivery of the products)."
#. module: mrp
#: selection:mrp.production,priority:0
@@ -800,12 +836,12 @@ msgstr "Hitno"
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_routing_workcenter
msgid "Work Center Usage"
-msgstr ""
+msgstr "Work Center Usage"
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_production
msgid "Manufacturing Order"
-msgstr "Nalog za Proizvodnju"
+msgstr "Nalog proizvodnje"
#. module: mrp
#: model:process.transition,name:mrp.process_transition_productionprocureproducts0
@@ -823,19 +859,19 @@ msgstr ""
#: view:mrp.production:0
#: field:mrp.production,cycle_total:0
msgid "Total Cycles"
-msgstr "Ukupno Ciklusa"
+msgstr "Ukupno ciklusa"
#. module: mrp
#: selection:mrp.production,state:0
#: view:mrp.production.order:0
#: selection:mrp.production.order,state:0
msgid "Ready to Produce"
-msgstr "Spremno za Proizvodnju"
+msgstr "Spremno za proizvodnju"
#. module: mrp
#: field:mrp.bom.revision,name:0
msgid "Modification name"
-msgstr "Ime promjene"
+msgstr "Naziv promjene"
#. module: mrp
#: view:mrp.bom:0
@@ -847,7 +883,7 @@ msgstr "Datum"
#. module: mrp
#: field:mrp.bom,type:0
msgid "BoM Type"
-msgstr ""
+msgstr "BoM Type"
#. module: mrp
#: view:mrp.production.order:0
@@ -865,7 +901,7 @@ msgstr ""
#: view:mrp.production.order:0
#: view:mrp.property:0
msgid "Search"
-msgstr "Traži"
+msgstr "Search"
#. module: mrp
#: field:report.workcenter.load,cycle:0
@@ -875,30 +911,30 @@ msgstr "Broj Ciklusa"
#. module: mrp
#: model:ir.model,name:mrp.model_res_company
msgid "Companies"
-msgstr "Tvrtke"
+msgstr "Organizacije"
#. module: mrp
#: model:process.node,name:mrp.process_node_minimumstockrule0
#: model:process.node,name:mrp.process_node_productminimumstockrule0
msgid "Minimum Stock"
-msgstr ""
+msgstr "Minimalna zaliha"
#. module: mrp
#: model:ir.ui.menu,name:mrp.menus_dash_mrp
msgid "Dashboard"
-msgstr "Kontrolna ploča"
+msgstr "Kokpit"
#. module: mrp
#: view:board.board:0
msgid "Work Center Future Load"
-msgstr "Buduće Opterećenje Radnog Centra"
+msgstr "Buduće opterećenje radnog centra"
#. module: mrp
#: model:process.node,name:mrp.process_node_stockproduct0
#: model:process.node,name:mrp.process_node_stockproduct1
#: model:process.process,name:mrp.process_process_stockableproductprocess0
msgid "Stockable Product"
-msgstr "Uskladištivi proizvod"
+msgstr "Stockable Product"
#. module: mrp
#: code:addons/mrp/report/price.py:121
@@ -914,7 +950,7 @@ msgstr "Šifra"
#. module: mrp
#: report:mrp.production.order:0
msgid "No. Of Hours"
-msgstr "Br. Sati"
+msgstr "Br. sati"
#. module: mrp
#: field:mrp.installer,mrp_jit:0
@@ -925,7 +961,7 @@ msgstr ""
#: view:mrp.property:0
#: view:mrp.property.group:0
msgid "Property Group"
-msgstr "Grupa Svojstava"
+msgstr "Grupa svojstava"
#. module: mrp
#: view:mrp.production:0
@@ -935,7 +971,7 @@ msgstr "Kol."
#. module: mrp
#: model:process.node,note:mrp.process_node_production0
msgid "Manufacturing Plan."
-msgstr "Plan Proizvodnje"
+msgstr "Plan proizvodnje."
#. module: mrp
#: view:mrp.routing:0
@@ -957,7 +993,7 @@ msgstr ""
#: view:mrp.production:0
#: view:mrp.workcenter.load:0
msgid "Cancel"
-msgstr "Otkaži"
+msgstr "Odustani"
#. module: mrp
#: view:mrp.production:0
@@ -970,6 +1006,8 @@ msgid ""
"Number of operations this Work Center can do in parallel. If this Work "
"Center represents a team of 5 workers, the capacity per cycle is 5."
msgstr ""
+"Number of operations this Work Center can do in parallel. If this Work "
+"Center represents a team of 5 workers, the capacity per cycle is 5."
#. module: mrp
#: model:process.transition,note:mrp.process_transition_servicerfq0
@@ -977,11 +1015,13 @@ msgid ""
"If the service has a 'Buy' supply method, this creates a RFQ, a "
"subcontracting demand for instance."
msgstr ""
+"Ako je usluga koristi način opskrbe \"Kupovina\", stvara se RFQ, "
+"podugovaranje potražnje za primjer"
#. module: mrp
#: field:mrp.production,move_prod_id:0
msgid "Move product"
-msgstr "Premjesti Proizvod"
+msgstr "Premjesti proizvod"
#. module: mrp
#: view:mrp.production:0
@@ -991,7 +1031,7 @@ msgstr "Kasni"
#. module: mrp
#: model:process.node,name:mrp.process_node_servicemts0
msgid "Make to stock"
-msgstr ""
+msgstr "Sa skladišta (MTS)"
#. module: mrp
#: help:mrp.routing.workcenter,sequence:0
@@ -1002,28 +1042,28 @@ msgstr ""
#. module: mrp
#: report:bom.structure:0
msgid "BOM Name"
-msgstr ""
+msgstr "BOM Name"
#. module: mrp
#: view:mrp.production:0
msgid "Start Production"
-msgstr "Pokreni Proizvodnju"
+msgstr "Pokreni proizvodnju"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.open_board_manufacturing
#: model:ir.ui.menu,name:mrp.menu_board_manufacturing
msgid "Production Dashboard"
-msgstr "Upravljačka ploča proizvodnje"
+msgstr "Kokpit proizvodnje"
#. module: mrp
#: view:mrp.production:0
msgid "Source Loc."
-msgstr ""
+msgstr "Lok. izvora"
#. module: mrp
#: field:mrp.bom,position:0
msgid "Internal Reference"
-msgstr "Interna Referenca"
+msgstr "Interna oznaka"
#. module: mrp
#: help:mrp.installer,stock_location:0
@@ -1035,7 +1075,7 @@ msgstr ""
#. module: mrp
#: model:process.node,note:mrp.process_node_billofmaterial0
msgid "Product's structure"
-msgstr "Struktura Proizvoda"
+msgstr "Struktura proizvoda"
#. module: mrp
#: field:mrp.bom,name:0
@@ -1064,7 +1104,7 @@ msgstr ""
#. module: mrp
#: field:mrp.product.produce,mode:0
msgid "Mode"
-msgstr "Način"
+msgstr "Mode"
#. module: mrp
#: report:bom.structure:0
@@ -1074,7 +1114,7 @@ msgstr "]"
#. module: mrp
#: field:mrp.workcenter.load,measure_unit:0
msgid "Amount measuring unit"
-msgstr ""
+msgstr "Mjerna jedinica iznosa"
#. module: mrp
#: model:ir.actions.act_window,help:mrp.mrp_production_action_planning
@@ -1086,6 +1126,12 @@ msgid ""
"materials have been defined, OpenERP is capable of automatically deciding on "
"the manufacturing route depending on the needs of the company."
msgstr ""
+"Manufacturing Orders describe the operations that need to be carried out and "
+"the raw materials usage for each production stage. You use specifications "
+"(bills of materials or BoM) to work out the raw material requirements and "
+"the manufacturing orders needed for the finished products. Once the bills of "
+"materials have been defined, OpenERP is capable of automatically deciding on "
+"the manufacturing route depending on the needs of the company."
#. module: mrp
#: constraint:mrp.production:0
@@ -1095,7 +1141,7 @@ msgstr ""
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_production_action3
msgid "Manufacturing Orders in Progress"
-msgstr "Nalozi za Proizvodnju u Radu"
+msgstr "Nalozi proizvodnje u tijeku"
#. module: mrp
#: model:ir.module.module,description:mrp.module_meta_information
@@ -1139,7 +1185,7 @@ msgstr ""
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_production_action4
msgid "Manufacturing Orders Waiting Products"
-msgstr "Nalozi za Proizvodnju koji čekaju Proizvode"
+msgstr "Nalozi proizvodnje koji čekaju proizvode"
#. module: mrp
#: view:mrp.bom:0
@@ -1160,19 +1206,19 @@ msgstr "Trašak Ciklusa"
#. module: mrp
#: selection:mrp.workcenter.load,measure_unit:0
msgid "Amount in cycles"
-msgstr "Količina u ciklusima"
+msgstr "Iznos u ciklusima"
#. module: mrp
#: field:mrp.production,location_dest_id:0
#: view:mrp.production.order:0
#: field:mrp.production.order,location_dest_id:0
msgid "Finished Products Location"
-msgstr "Lokacija Završenih Proizvoda"
+msgstr "Lokacija gotovih proizvoda"
#. module: mrp
#: model:ir.ui.menu,name:mrp.menu_pm_resources_config
msgid "Resources"
-msgstr "Resursi"
+msgstr "Sredstva"
#. module: mrp
#: field:mrp.workcenter,costs_journal_id:0
@@ -1184,7 +1230,7 @@ msgstr "Dnevnik analitike"
#: model:ir.ui.menu,name:mrp.menu_view_resource_search_mrp
#: field:mrp.routing,workcenter_lines:0
msgid "Work Centers"
-msgstr "Radni Centri"
+msgstr "Radni centri"
#. module: mrp
#: selection:mrp.workcenter.load,time_unit:0
@@ -1199,6 +1245,10 @@ msgid ""
"They are attached to bills of materials that will define the required raw "
"materials."
msgstr ""
+"Routings allow you to create and manage the manufacturing operations that "
+"should be followed within your work centers in order to produce a product. "
+"They are attached to bills of materials that will define the required raw "
+"materials."
#. module: mrp
#: field:report.workcenter.load,hour:0
@@ -1208,7 +1258,7 @@ msgstr "Broj Sati"
#. module: mrp
#: view:mrp.routing:0
msgid "Work Center Operations"
-msgstr "Operacije Radnih Centara"
+msgstr "Operacije radnog centra"
#. module: mrp
#: view:mrp.routing:0
@@ -1222,7 +1272,7 @@ msgstr "Bilješke"
#: field:mrp.production.order,bom_id:0
#: model:process.node,name:mrp.process_node_billofmaterial0
msgid "Bill of Material"
-msgstr "Lista Materijala"
+msgstr "Sastavnica"
#. module: mrp
#: view:mrp.workcenter.load:0
@@ -1237,14 +1287,16 @@ msgstr "Opterećenje radnog centra"
#. module: mrp
#: help:mrp.production,location_dest_id:0
msgid "Location where the system will stock the finished products."
-msgstr ""
+msgstr "Lokacija gotovih proizvoda"
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
+"This is the Internal Picking List that brings the finished product to the "
+"production plan"
#. module: mrp
#: field:stock.change.standard.price,change_parent_price:0
@@ -1254,7 +1306,7 @@ msgstr ""
#. module: mrp
#: model:ir.model,name:mrp.model_stock_move
msgid "Stock Move"
-msgstr "Prijenos Zaliha"
+msgstr "Skladišni prijenosi"
#. module: mrp
#: model:process.transition,note:mrp.process_transition_producttostockrules0
@@ -1263,11 +1315,14 @@ msgid ""
"maxi quantity. It's available in the Inventory management menu and "
"configured by product."
msgstr ""
+"The Minimum Stock Rule is an automatic procurement rule based on a mini and "
+"maxi quantity. It's available in the Inventory management menu and "
+"configured by product."
#. module: mrp
#: selection:mrp.workcenter.load,time_unit:0
msgid "Day by day"
-msgstr ""
+msgstr "Dan po dan"
#. module: mrp
#: view:mrp.bom:0
@@ -1288,7 +1343,7 @@ msgstr "Prioritet"
#. module: mrp
#: model:ir.model,name:mrp.model_stock_picking
msgid "Picking List"
-msgstr "Lista odabira"
+msgstr "Skladišni dokument"
#. module: mrp
#: view:mrp.production.order:0
@@ -1296,7 +1351,7 @@ msgid "Month -1"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr "Nalog za Proizvodnju '%s' je planiran za %s."
@@ -1304,10 +1359,10 @@ msgstr "Nalog za Proizvodnju '%s' je planiran za %s."
#. module: mrp
#: report:mrp.production.order:0
msgid "Production Order N° :"
-msgstr ""
+msgstr "Production Order N° :"
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr "Nalog za Proizvodnju '%s' je spreman za proizvodnju."
@@ -1315,19 +1370,19 @@ msgstr "Nalog za Proizvodnju '%s' je spreman za proizvodnju."
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_production_product_line
msgid "Production Scheduled Product"
-msgstr ""
+msgstr "Production Scheduled Product"
#. module: mrp
#: help:res.company,manufacturing_lead:0
msgid "Security days for each manufacturing operation."
-msgstr ""
+msgstr "Rezervni dani za svaku operaciju proizvodnje"
#. module: mrp
#: model:process.node,name:mrp.process_node_mts0
#: model:process.transition,name:mrp.process_transition_servicemts0
#: model:process.transition,name:mrp.process_transition_stockmts0
msgid "Make to Stock"
-msgstr ""
+msgstr "Sa skladišta (MTS)"
#. module: mrp
#: selection:mrp.production.order,month:0
@@ -1343,24 +1398,29 @@ msgid ""
"product needs. You can either create a bill of materials to define specific "
"production steps or define a single multi-level bill of materials."
msgstr ""
+"Master Bills of Materials allow you to create and manage the list of "
+"necessary raw materials used to make a finished product. OpenERP will use "
+"these BoMs to automatically propose manufacturing orders according to "
+"product needs. You can either create a bill of materials to define specific "
+"production steps or define a single multi-level bill of materials."
#. module: mrp
#: model:process.transition,note:mrp.process_transition_stockrfq0
msgid ""
"In case the Supply method of the product is Buy, the system creates a "
"purchase order."
-msgstr ""
+msgstr "Kada je Metoda nabave \"Kupi\", sistem kreira nalog za nabavu."
#. module: mrp
#: model:ir.model,name:mrp.model_procurement_order
msgid "Procurement"
-msgstr ""
+msgstr "Procurement"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.action_view_mrp_product_price_wizard
#: view:mrp.product_price:0
msgid "Product Cost Structure"
-msgstr ""
+msgstr "Struktura troška proizvoda"
#. module: mrp
#: code:addons/mrp/report/price.py:130
@@ -1376,7 +1436,7 @@ msgstr ""
#. module: mrp
#: view:mrp.production:0
msgid "Production Work Centers"
-msgstr ""
+msgstr "Radni centri proizvodnje"
#. module: mrp
#: view:mrp.production.order:0
@@ -1393,28 +1453,28 @@ msgstr ""
#. module: mrp
#: view:mrp.workcenter:0
msgid "Search for mrp workcenter"
-msgstr ""
+msgstr "Search for mrp workcenter"
#. module: mrp
#: view:mrp.bom:0
msgid "BoM Structure"
-msgstr ""
+msgstr "BoM Structure"
#. module: mrp
#: field:mrp.production,date_start:0
#: field:mrp.production.order,date_start:0
msgid "Start Date"
-msgstr ""
+msgstr "Početni datum"
#. module: mrp
#: field:mrp.workcenter,costs_hour_account_id:0
msgid "Hour Account"
-msgstr ""
+msgstr "Hour Account"
#. module: mrp
#: view:mrp.production:0
msgid "Destination Loc."
-msgstr ""
+msgstr "Odredišna lokacija"
#. module: mrp
#: field:mrp.production.order,product_id2:0
@@ -1424,24 +1484,24 @@ msgstr ""
#. module: mrp
#: view:mrp.production:0
msgid "Pending"
-msgstr ""
+msgstr "Na čekanju"
#. module: mrp
#: field:mrp.bom,active:0
#: field:mrp.routing,active:0
msgid "Active"
-msgstr ""
+msgstr "Aktivan"
#. module: mrp
#: model:process.node,name:mrp.process_node_procureproducts0
msgid "Procure Products"
-msgstr ""
+msgstr "Procure Products"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.action_report_workcenter_load_tree
#: view:report.workcenter.load:0
msgid "Work Center Loads"
-msgstr ""
+msgstr "Opterećenje radnog centra"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_property_action
@@ -1452,13 +1512,13 @@ msgstr ""
#: view:procurement.order:0
#: field:procurement.order,property_ids:0
msgid "Properties"
-msgstr ""
+msgstr "Svojstva"
#. module: mrp
#: help:mrp.production,origin:0
msgid ""
"Reference of the document that generated this production order request."
-msgstr ""
+msgstr "Dokument koji je generirao ovaj nalog za proizvodnju."
#. module: mrp
#: sql_constraint:mrp.bom:0
@@ -1467,21 +1527,24 @@ msgid ""
"You should install the mrp_subproduct module if you want to manage extra "
"products on BoMs !"
msgstr ""
+"All product quantities must be greater than 0.\n"
+"You should install the mrp_subproduct module if you want to manage extra "
+"products on BoMs !"
#. module: mrp
#: view:mrp.production:0
msgid "Extra Information"
-msgstr "Dodatne Informacije"
+msgstr "Dodatni Podaci"
#. module: mrp
#: model:ir.model,name:mrp.model_change_production_qty
msgid "Change Quantity of Products"
-msgstr ""
+msgstr "Promijeni količine proizvoda"
#. module: mrp
#: model:process.node,note:mrp.process_node_productionorder0
msgid "Drives the procurement orders for raw material."
-msgstr ""
+msgstr "Upravlja nalozima nabave za sirovine."
#. module: mrp
#: view:mrp.production.order:0
@@ -1491,19 +1554,19 @@ msgstr ""
#. module: mrp
#: field:mrp.workcenter,costs_general_account_id:0
msgid "General Account"
-msgstr ""
+msgstr "Konto glavne knjige"
#. module: mrp
#: report:mrp.production.order:0
msgid "SO Number"
-msgstr ""
+msgstr "SO Number"
#. module: mrp
#: selection:mrp.production,state:0
#: view:mrp.production.order:0
#: selection:mrp.production.order,state:0
msgid "Done"
-msgstr ""
+msgstr "Izvršeno"
#. module: mrp
#: model:ir.model,name:mrp.model_stock_change_standard_price
@@ -1515,13 +1578,13 @@ msgstr ""
#: report:mrp.production.order:0
#: field:mrp.production.order,origin:0
msgid "Source Document"
-msgstr ""
+msgstr "Izvorni dokument"
#. module: mrp
#: selection:mrp.production,priority:0
#: selection:mrp.production.order,priority:0
msgid "Not urgent"
-msgstr ""
+msgstr "Not urgent"
#. module: mrp
#: help:stock.change.standard.price,change_parent_price:0
@@ -1533,10 +1596,10 @@ msgstr ""
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_production_action2
msgid "Manufacturing Orders To Start"
-msgstr "Naloz za Proizvodnju Za Pokrenuti"
+msgstr "Ne pokrenuti nalozi proizvodnje"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr ""
@@ -1548,12 +1611,12 @@ msgstr ""
#: view:mrp.workcenter:0
#: field:report.workcenter.load,workcenter_id:0
msgid "Work Center"
-msgstr ""
+msgstr "Radni centar"
#. module: mrp
#: field:mrp.workcenter,capacity_per_cycle:0
msgid "Capacity per Cycle"
-msgstr ""
+msgstr "Kapacitet po ciklusu"
#. module: mrp
#: model:ir.model,name:mrp.model_product_product
@@ -1566,30 +1629,30 @@ msgstr ""
#: field:mrp.production.order,product_id:0
#: field:mrp.production.product.line,product_id:0
msgid "Product"
-msgstr ""
+msgstr "Proizvod"
#. module: mrp
#: view:mrp.production:0
#: field:mrp.production,hour_total:0
msgid "Total Hours"
-msgstr ""
+msgstr "Uk. sati"
#. module: mrp
#: field:mrp.production,location_src_id:0
#: field:mrp.production.order,location_src_id:0
msgid "Raw Materials Location"
-msgstr ""
+msgstr "Lokacija sirovina"
#. module: mrp
#: view:mrp.product_price:0
msgid "Print Cost Structure of Product."
-msgstr ""
+msgstr "Print Cost Structure of Product."
#. module: mrp
#: field:mrp.bom,product_uos:0
#: field:mrp.production.product.line,product_uos:0
msgid "Product UOS"
-msgstr ""
+msgstr "JP Proizvoda"
#. module: mrp
#: model:ir.actions.act_window,help:mrp.mrp_workcenter_action
@@ -1602,7 +1665,7 @@ msgstr ""
#. module: mrp
#: view:mrp.production:0
msgid "Consume Products"
-msgstr ""
+msgstr "Utroši proizvode"
#. module: mrp
#: field:mrp.bom,product_uom:0
@@ -1610,14 +1673,14 @@ msgstr ""
#: field:mrp.production.order,product_uom:0
#: field:mrp.production.product.line,product_uom:0
msgid "Product UOM"
-msgstr ""
+msgstr "JM proizvoda"
#. module: mrp
#: model:process.node,name:mrp.process_node_stock0
#: model:process.transition,name:mrp.process_transition_servicemto0
#: model:process.transition,name:mrp.process_transition_stockproduct0
msgid "Make to Order"
-msgstr ""
+msgstr "Po narudžbi (MTO)"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.action_report_mrp_production_order
@@ -1626,7 +1689,7 @@ msgid "Production Analysis"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr ""
@@ -1634,29 +1697,29 @@ msgstr ""
#. module: mrp
#: view:mrp.production.lot.line:0
msgid "Production Products"
-msgstr ""
+msgstr "Proizvodnja proizvoda"
#. module: mrp
#: field:mrp.production,date_finished:0
#: field:mrp.production.order,date_finished:0
msgid "End Date"
-msgstr ""
+msgstr "Završni Datum"
#. module: mrp
#: field:mrp.workcenter,resource_id:0
msgid "Resource"
-msgstr ""
+msgstr "Resurs"
#. module: mrp
#: help:mrp.bom,date_start:0
#: help:mrp.bom,date_stop:0
msgid "Validity of this BoM or component. Keep empty if it's always valid."
-msgstr ""
+msgstr "Valjanost Bom ili komponente. Držite prazno ako je uvijek valjan."
#. module: mrp
#: field:mrp.production,product_uos:0
msgid "Product UoS"
-msgstr ""
+msgstr "JP Proizvoda"
#. module: mrp
#: view:mrp.production.order:0
@@ -1667,7 +1730,7 @@ msgstr ""
#: selection:mrp.production,priority:0
#: selection:mrp.production.order,priority:0
msgid "Very Urgent"
-msgstr ""
+msgstr "Very Urgent"
#. module: mrp
#: help:mrp.bom,routing_id:0
@@ -1677,37 +1740,41 @@ msgid ""
"operations and to plan future loads on work centers based on production "
"planning."
msgstr ""
+"The list of operations (list of work centers) to produce the finished "
+"product. The routing is mainly used to compute work center costs during "
+"operations and to plan future loads on work centers based on production "
+"planning."
#. module: mrp
#: view:change.production.qty:0
msgid "Approve"
-msgstr ""
+msgstr "Odobri"
#. module: mrp
#: view:mrp.property.group:0
msgid "Properties categories"
-msgstr ""
+msgstr "Properties categories"
#. module: mrp
#: help:mrp.production.workcenter.line,sequence:0
msgid "Gives the sequence order when displaying a list of work orders."
-msgstr ""
+msgstr "Definira poredak radnih naloga u popisu."
#. module: mrp
#: report:mrp.production.order:0
msgid "Source Location"
-msgstr ""
+msgstr "Izvorna lokacija"
#. module: mrp
#: view:mrp.production:0
#: view:mrp.production.product.line:0
msgid "Scheduled Products"
-msgstr "Planirani Proizvodi"
+msgstr "Planirani proizvodi"
#. module: mrp
#: view:mrp.production.lot.line:0
msgid "Production Products Consommation"
-msgstr ""
+msgstr "Production Products Consommation"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_production_action
@@ -1716,7 +1783,7 @@ msgstr ""
#: model:ir.ui.menu,name:mrp.menu_mrp_production_order_action
#: view:mrp.production:0
msgid "Manufacturing Orders"
-msgstr "Nalozi za Proizvodnju"
+msgstr "Nalozi za proizvodnju"
#. module: mrp
#: help:mrp.product.produce,mode:0
@@ -1727,29 +1794,34 @@ msgid ""
"the quantity selected and it will finish the production order when total "
"ordered quantities are produced."
msgstr ""
+"'Consume only' mode will only consume the products with the quantity "
+"selected.\n"
+"'Consume & Produce' mode will consume as well as produce the products with "
+"the quantity selected and it will finish the production order when total "
+"ordered quantities are produced."
#. module: mrp
#: view:mrp.production:0
#: report:mrp.production.order:0
msgid "Work Orders"
-msgstr "Radni Nalozi"
+msgstr "Radni nalozi"
#. module: mrp
#: field:mrp.workcenter,costs_cycle:0
msgid "Cost per cycle"
-msgstr ""
+msgstr "Cost per cycle"
#. module: mrp
#: model:process.node,name:mrp.process_node_serviceproduct0
#: model:process.node,name:mrp.process_node_serviceproduct1
msgid "Service"
-msgstr ""
+msgstr "Service"
#. module: mrp
#: selection:mrp.production,state:0
#: selection:mrp.production.order,state:0
msgid "Cancelled"
-msgstr ""
+msgstr "Otkazani"
#. module: mrp
#: view:mrp.production.order:0
@@ -1761,6 +1833,7 @@ msgstr ""
msgid ""
"UoM (Unit of Measure) is the unit of measurement for the inventory control"
msgstr ""
+"UoM (Unit of Measure) is the unit of measurement for the inventory control"
#. module: mrp
#: model:process.transition,note:mrp.process_transition_bom0
@@ -1769,6 +1842,9 @@ msgid ""
"are products themselves) can also have their own Bill of Material (multi-"
"level)."
msgstr ""
+"The Bill of Material is the product's decomposition. The components (that "
+"are products themselves) can also have their own Bill of Material (multi-"
+"level)."
#. module: mrp
#: field:mrp.bom,company_id:0
@@ -1779,12 +1855,12 @@ msgstr ""
#: field:mrp.routing.workcenter,company_id:0
#: view:mrp.workcenter:0
msgid "Company"
-msgstr ""
+msgstr "Organizacija"
#. module: mrp
#: field:mrp.workcenter,time_cycle:0
msgid "Time for 1 cycle (hour)"
-msgstr ""
+msgstr "Time for 1 cycle (hour)"
#. module: mrp
#: model:ir.actions.report.xml,name:mrp.report_mrp_production_report
@@ -1793,50 +1869,50 @@ msgstr ""
#: model:process.node,name:mrp.process_node_production0
#: model:process.node,name:mrp.process_node_productionorder0
msgid "Production Order"
-msgstr ""
+msgstr "Production Order"
#. module: mrp
#: model:process.node,note:mrp.process_node_productminimumstockrule0
msgid "Automatic procurement rule"
-msgstr ""
+msgstr "Pravilo automatske nabave"
#. module: mrp
#: view:mrp.production:0
msgid "Compute Data"
-msgstr ""
+msgstr "Compute Data"
#. module: mrp
#: field:mrp.production,product_uos_qty:0
msgid "Product UoS Qty"
-msgstr ""
+msgstr "Količina JP"
#. module: mrp
#: code:addons/mrp/report/price.py:130
#: view:mrp.bom:0
#, python-format
msgid "Components"
-msgstr ""
+msgstr "Components"
#. module: mrp
#: report:bom.structure:0
#: model:ir.actions.report.xml,name:mrp.report_bom_structure
msgid "BOM Structure"
-msgstr ""
+msgstr "BOM Struktura"
#. module: mrp
#: field:mrp.bom,date_stop:0
msgid "Valid Until"
-msgstr ""
+msgstr "Valid Until"
#. module: mrp
#: field:mrp.bom,date_start:0
msgid "Valid From"
-msgstr ""
+msgstr "Valid From"
#. module: mrp
#: selection:mrp.bom,type:0
msgid "Normal BoM"
-msgstr ""
+msgstr "Normal BoM"
#. module: mrp
#: field:res.company,manufacturing_lead:0
@@ -1847,7 +1923,7 @@ msgstr "Pripremno vrijeme proizvodnje"
#: field:mrp.bom,product_uos_qty:0
#: field:mrp.production.product.line,product_uos_qty:0
msgid "Product UOS Qty"
-msgstr ""
+msgstr "Količina JP"
#. module: mrp
#: model:ir.actions.act_window,help:mrp.action_report_in_out_picking_tree
@@ -1856,21 +1932,24 @@ msgid ""
"linked to manufacturing activities, receptions of products and delivery "
"orders."
msgstr ""
+"Weekly Stock Value Variation enables you to track the stock value evolution "
+"linked to manufacturing activities, receptions of products and delivery "
+"orders."
#. module: mrp
#: view:mrp.product.produce:0
msgid "Confirm"
-msgstr ""
+msgstr "Potvrdi"
#. module: mrp
#: field:mrp.bom,product_efficiency:0
msgid "Manufacturing Efficiency"
-msgstr "Efikasnost Proizvodnje"
+msgstr "Efikasnost proizvodnje"
#. module: mrp
#: constraint:res.company:0
msgid "Error! You can not create recursive companies."
-msgstr ""
+msgstr "Pogreška! Ne možete kreirati rekurzivne organizacije."
#. module: mrp
#: help:mrp.bom,active:0
@@ -1878,17 +1957,19 @@ msgid ""
"If the active field is set to False, it will allow you to hide the bills of "
"material without removing it."
msgstr ""
+"If the active field is set to False, it will allow you to hide the bills of "
+"material without removing it."
#. module: mrp
#: field:mrp.bom,product_rounding:0
msgid "Product Rounding"
-msgstr ""
+msgstr "Zaokruživanje decimala"
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_production_workcenter_line
#: field:mrp.production.workcenter.line,name:0
msgid "Work Order"
-msgstr ""
+msgstr "Radni nalog"
#. module: mrp
#: model:ir.actions.act_window,help:mrp.action_report_mrp_production_order
@@ -1900,12 +1981,12 @@ msgstr ""
#. module: mrp
#: selection:mrp.product.produce,mode:0
msgid "Consume Only"
-msgstr ""
+msgstr "Samo za utrošiti"
#. module: mrp
#: view:mrp.production:0
msgid "Recreate Picking"
-msgstr ""
+msgstr "Ponovo kreiraj prijenos"
#. module: mrp
#: help:mrp.bom,type:0
@@ -1916,11 +1997,16 @@ msgid ""
"product, it will be sold and shipped as a set of components, instead of "
"being produced."
msgstr ""
+"If a sub-product is used in several products, it can be useful to create its "
+"own BoM. Though if you don't want separated production orders for this sub-"
+"product, select Set/Phantom as BoM type. If a Phantom BoM is used for a root "
+"product, it will be sold and shipped as a set of components, instead of "
+"being produced."
#. module: mrp
#: field:mrp.bom,method:0
msgid "Method"
-msgstr ""
+msgstr "Metoda"
#. module: mrp
#: help:mrp.production,state:0
@@ -1933,62 +2019,68 @@ msgid ""
" When the production gets started then the state is set to 'In Production'.\n"
" When the production is over, the state is set to 'Done'."
msgstr ""
+"Nakon kreiranja nalog za proizvodnju je u stanju 'Nacrt'.\n"
+" Potvrđeni nalozi su u stanju 'Na čekanju' (materijala).\n"
+" U slučaju iznimki stanje je 'Skladišna iznimka'. \n"
+" Ako je zaliha dostatna za proizvodnju stanje je 'Spremno za proizvodnju'.\n"
+" Kad je proizvodnja pokrenuta stanje je 'U proizvodnji'.\n"
+" Izvršeni nalozi su u stanju 'Izvršen'."
#. module: mrp
#: selection:mrp.bom,method:0
msgid "On Order"
-msgstr ""
+msgstr "Na nalogu"
#. module: mrp
#: model:ir.ui.menu,name:mrp.menu_mrp_configuration
#: view:res.company:0
msgid "Configuration"
-msgstr ""
+msgstr "Postava"
#. module: mrp
#: field:mrp.workcenter,time_stop:0
msgid "Time after prod."
-msgstr ""
+msgstr "Vrijeme nakon prod."
#. module: mrp
#: field:mrp.workcenter.load,time_unit:0
msgid "Type of period"
-msgstr ""
+msgstr "Type of period"
#. module: mrp
#: view:mrp.production:0
msgid "Total Qty"
-msgstr ""
+msgstr "Ukupna kol."
#. module: mrp
#: field:mrp.routing.workcenter,hour_nbr:0
msgid "Number of Hours"
-msgstr ""
+msgstr "Broj sati"
#. module: mrp
#: view:mrp.workcenter:0
msgid "Costing Information"
-msgstr ""
+msgstr "Costing Information"
#. module: mrp
#: model:process.node,name:mrp.process_node_purchaseprocure0
msgid "Procurement Orders"
-msgstr ""
+msgstr "Nalozi za nabavu"
#. module: mrp
#: help:mrp.bom,product_rounding:0
msgid "Rounding applied on the product quantity."
-msgstr ""
+msgstr "Zaokruživanje se primjenjuje na količinu proizvoda."
#. module: mrp
#: model:process.node,note:mrp.process_node_stock0
msgid "Assignment from Production or Purchase Order."
-msgstr ""
+msgstr "Prijenos iz proizvodnje ili naloga za nabavu."
#. module: mrp
#: field:mrp.routing.workcenter,routing_id:0
msgid "Parent Routing"
-msgstr ""
+msgstr "Nadređeno usmjeravanje"
#. module: mrp
#: view:mrp.installer:0
@@ -1998,7 +2090,7 @@ msgstr ""
#. module: mrp
#: help:mrp.workcenter,time_start:0
msgid "Time in hours for the setup."
-msgstr ""
+msgstr "Vrijeme u satima za pripremu."
#. module: mrp
#: selection:mrp.production.order,month:0
@@ -2014,7 +2106,7 @@ msgstr ""
#: field:mrp.bom.revision,bom_id:0
#: field:procurement.order,bom_id:0
msgid "BoM"
-msgstr ""
+msgstr "BoM"
#. module: mrp
#: model:ir.model,name:mrp.model_report_mrp_inout
@@ -2026,25 +2118,25 @@ msgstr "Varijacija vrijednosti Zalihe"
#: model:process.node,note:mrp.process_node_mts0
#: model:process.node,note:mrp.process_node_servicemts0
msgid "Assignment from stock."
-msgstr ""
+msgstr "Dodjela sa skladišta"
#. module: mrp
#: selection:mrp.production,state:0
#: view:mrp.production.order:0
#: selection:mrp.production.order,state:0
msgid "Waiting Goods"
-msgstr ""
+msgstr "Waiting Goods"
#. module: mrp
#: field:mrp.bom.revision,last_indice:0
msgid "last indice"
-msgstr ""
+msgstr "last indice"
#. module: mrp
#: field:mrp.bom,revision_ids:0
#: view:mrp.bom.revision:0
msgid "BoM Revisions"
-msgstr ""
+msgstr "BoM Revisions"
#. module: mrp
#: selection:mrp.production,state:0
@@ -2056,7 +2148,7 @@ msgstr ""
#: field:report.mrp.inout,date:0
#: field:report.workcenter.load,name:0
msgid "Week"
-msgstr "Tjedni"
+msgstr "Week"
#. module: mrp
#: field:mrp.installer,progress:0
@@ -2067,24 +2159,24 @@ msgstr ""
#: selection:mrp.production,priority:0
#: selection:mrp.production.order,priority:0
msgid "Normal"
-msgstr ""
+msgstr "Normalan"
#. module: mrp
#: model:process.node,note:mrp.process_node_routing0
msgid "Manufacturing Steps."
-msgstr "Koraci Proizvodnje"
+msgstr "Koraci proizvodnje"
#. module: mrp
#: code:addons/mrp/report/price.py:136
#: model:ir.actions.report.xml,name:mrp.report_cost_structure
#, python-format
msgid "Cost Structure"
-msgstr ""
+msgstr "Cost Structure"
#. module: mrp
#: selection:mrp.product.produce,mode:0
msgid "Consume & Produce"
-msgstr ""
+msgstr "Utroši i proizvedi"
#. module: mrp
#: selection:mrp.production.order,month:0
@@ -2094,7 +2186,7 @@ msgstr ""
#. module: mrp
#: field:mrp.bom,bom_id:0
msgid "Parent BoM"
-msgstr ""
+msgstr "Nadređena sastavnica"
#. module: mrp
#: model:ir.actions.act_window,help:mrp.mrp_bom_form_action2
@@ -2103,6 +2195,9 @@ msgid ""
"master bills of materials. Use this menu to search in which BoM a specific "
"component is used."
msgstr ""
+"Bills of materials components are components and sub-products used to create "
+"master bills of materials. Use this menu to search in which BoM a specific "
+"component is used."
#. module: mrp
#: selection:mrp.production.order,month:0
@@ -2112,10 +2207,10 @@ msgstr ""
#. module: mrp
#: model:process.node,note:mrp.process_node_stockproduct0
msgid "Product type is Stockable or Consumable."
-msgstr ""
+msgstr "Product type is Stockable or Consumable."
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -2125,7 +2220,7 @@ msgstr ""
#. module: mrp
#: field:mrp.product.produce,product_qty:0
msgid "Select Quantity"
-msgstr ""
+msgstr "Odaberi količinu"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.act_product_product_2_mrp_bom
@@ -2133,7 +2228,7 @@ msgstr ""
#: model:ir.ui.menu,name:mrp.menu_mrp_bom_form_action
#: field:product.product,bom_ids:0
msgid "Bill of Materials"
-msgstr ""
+msgstr "Sastavnica"
#. module: mrp
#: help:mrp.routing.workcenter,routing_id:0
@@ -2142,22 +2237,25 @@ msgid ""
"Routing is indicated then,the third tab of a production order (Work Centers) "
"will be automatically pre-completed."
msgstr ""
+"Routing indicates all the Work Centers used, for how long and/or cycles.If "
+"Routing is indicated then,the third tab of a production order (Work Centers) "
+"will be automatically pre-completed."
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_bom_revision
msgid "Bill of Material Revision"
-msgstr ""
+msgstr "Revizija sastavnice"
#. module: mrp
#: view:mrp.routing.workcenter:0
#: view:mrp.workcenter:0
msgid "General Information"
-msgstr ""
+msgstr "Opći podaci"
#. module: mrp
#: view:mrp.production:0
msgid "Productions"
-msgstr ""
+msgstr "Proizvodnja"
#. module: mrp
#: code:addons/mrp/report/price.py:194
@@ -2171,6 +2269,8 @@ msgid ""
"Description of the Work Center. Explain here what's a cycle according to "
"this Work Center."
msgstr ""
+"Description of the Work Center. Explain here what's a cycle according to "
+"this Work Center."
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_routing
@@ -2182,7 +2282,7 @@ msgstr ""
#: view:mrp.routing:0
#: model:process.node,name:mrp.process_node_routing0
msgid "Routing"
-msgstr ""
+msgstr "Usmjeravanje"
#. module: mrp
#: field:mrp.installer,mrp_operations:0
@@ -2192,12 +2292,12 @@ msgstr "Proizvodne Operacije"
#. module: mrp
#: field:mrp.production,date_planned:0
msgid "Scheduled date"
-msgstr ""
+msgstr "Zakazani datum"
#. module: mrp
#: constraint:stock.move:0
msgid "You must assign a production lot for this product"
-msgstr ""
+msgstr "Morate pridijeliti lot proizvodnje ovom proizvodu"
#. module: mrp
#: model:ir.actions.act_window,help:mrp.mrp_property_action
@@ -2208,27 +2308,32 @@ msgid ""
"sales person creates a sales order, he can relate it to several properties "
"and OpenERP will automatically select the BoM to use according the the needs."
msgstr ""
+"The Properties in OpenERP are used to select the right bill of materials for "
+"manufacturing a product when you have different ways of building the same "
+"product. You can assign several properties to each Bill of Materials. When a "
+"sales person creates a sales order, he can relate it to several properties "
+"and OpenERP will automatically select the BoM to use according the the needs."
#. module: mrp
#: view:mrp.production.order:0
#: field:stock.move,production_id:0
msgid "Production"
-msgstr ""
+msgstr "Proizvodnja"
#. module: mrp
#: view:board.board:0
msgid "Procurements in Exception"
-msgstr ""
+msgstr "Nabave s iznimkama"
#. module: mrp
#: model:process.transition,name:mrp.process_transition_minimumstockprocure0
msgid "'Minimum stock rule' material"
-msgstr ""
+msgstr "'Minimum stock rule' material"
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_product_price
msgid "Product Price"
-msgstr ""
+msgstr "Cijena proizvoda"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.action_mrp_installer
@@ -2238,18 +2343,18 @@ msgstr ""
#. module: mrp
#: model:ir.model,name:mrp.model_stock_move_split
msgid "Split in Production lots"
-msgstr ""
+msgstr "Split in Production lots"
#. module: mrp
#: view:change.production.qty:0
msgid "Change Quantity"
-msgstr ""
+msgstr "Promjeni količinu"
#. module: mrp
#: view:change.production.qty:0
#: model:ir.actions.act_window,name:mrp.action_change_production_qty
msgid "Change Product Qty"
-msgstr ""
+msgstr "Promjeni kol. proizvoda"
#. module: mrp
#: view:mrp.bom.revision:0
@@ -2262,7 +2367,7 @@ msgstr ""
#: view:mrp.workcenter:0
#: field:mrp.workcenter,note:0
msgid "Description"
-msgstr ""
+msgstr "Opis"
#. module: mrp
#: selection:mrp.production.order,month:0
@@ -2272,12 +2377,12 @@ msgstr ""
#. module: mrp
#: view:board.board:0
msgid "Manufacturing board"
-msgstr "Ploča proizvodnje"
+msgstr "Kokpit proizvodnje"
#. module: mrp
#: field:mrp.production,date_planned_end:0
msgid "Scheduled End Date"
-msgstr ""
+msgstr "Planirani datum završetka"
#. module: mrp
#: model:ir.actions.act_window,help:mrp.action_report_workcenter_load_tree
@@ -2286,11 +2391,14 @@ msgid ""
"specified period. It is expressed in number of hours and machine related "
"cycles."
msgstr ""
+"Work Center Loads gives you a projection of work center loads over a "
+"specified period. It is expressed in number of hours and machine related "
+"cycles."
#. module: mrp
#: model:process.node,note:mrp.process_node_procureproducts0
msgid "The way to procurement depends on the product type."
-msgstr ""
+msgstr "Način nabave ovisi o vrsti proizvoda"
#. module: mrp
#: model:ir.ui.menu,name:mrp.menu_mrp_manufacturing
@@ -2300,7 +2408,7 @@ msgstr "Proizvodnja"
#. module: mrp
#: view:board.board:0
msgid "Next Production Orders"
-msgstr ""
+msgstr "Next Production Orders"
#. module: mrp
#: selection:mrp.production.order,month:0
@@ -2311,7 +2419,7 @@ msgstr ""
#: model:ir.actions.act_window,name:mrp.mrp_property_group_action
#: model:ir.ui.menu,name:mrp.menu_mrp_property_group_action
msgid "Property Groups"
-msgstr ""
+msgstr "Grupe svojstava"
#. module: mrp
#: selection:mrp.production.order,month:0
@@ -2324,16 +2432,18 @@ msgid ""
"Depending on the chosen method to supply the stockable products, the "
"procurement order creates a RFQ, a production order, ... "
msgstr ""
+"Depending on the chosen method to supply the stockable products, the "
+"procurement order creates a RFQ, a production order, ... "
#. module: mrp
#: help:mrp.workcenter,time_stop:0
msgid "Time in hours for the cleaning."
-msgstr ""
+msgstr "Završno vrijeme u satima za čišćenje."
#. module: mrp
#: model:process.transition,name:mrp.process_transition_purchaseprocure0
msgid "Automatic RFQ"
-msgstr ""
+msgstr "Automatski ZZP (zahtjev za ponudom)"
#. module: mrp
#: model:process.transition,note:mrp.process_transition_servicemto0
@@ -2341,6 +2451,8 @@ msgid ""
"If the service has a 'Produce' supply method, this creates a task in the "
"project management module of OpenERP."
msgstr ""
+"Ako je metoda nabave usluge 'Proizvedi' kreirati će zadatak u modulu "
+"upravljanja projektima."
#. module: mrp
#: model:process.transition,note:mrp.process_transition_productionprocureproducts0
@@ -2349,6 +2461,9 @@ msgid ""
"production order creates as much procurement orders as components listed in "
"the BOM, through a run of the schedulers (MRP)."
msgstr ""
+"In order to supply raw material (to be purchased or produced), the "
+"production order creates as much procurement orders as components listed in "
+"the BOM, through a run of the schedulers (MRP)."
#. module: mrp
#: help:mrp.product_price,number:0
@@ -2356,11 +2471,13 @@ msgid ""
"Specify quantity of products to produce or buy. Report of Cost structure "
"will be displayed base on this quantity."
msgstr ""
+"Specify quantity of products to produce or buy. Report of Cost structure "
+"will be displayed base on this quantity."
#. module: mrp
#: selection:mrp.bom,method:0
msgid "On Stock"
-msgstr ""
+msgstr "Na skladištu"
#. module: mrp
#: field:mrp.bom,sequence:0
@@ -2368,17 +2485,17 @@ msgstr ""
#: field:mrp.production.workcenter.line,sequence:0
#: field:mrp.routing.workcenter,sequence:0
msgid "Sequence"
-msgstr ""
+msgstr "Sekvenca"
#. module: mrp
#: model:ir.ui.menu,name:mrp.menu_view_resource_calendar_leaves_search_mrp
msgid "Resource Leaves"
-msgstr ""
+msgstr "Odsustva resursa"
#. module: mrp
#: help:mrp.bom,sequence:0
msgid "Gives the sequence order when displaying a list of bills of material."
-msgstr ""
+msgstr "Daje poredak u prikazu sastavnica."
#. module: mrp
#: view:mrp.production:0
@@ -2386,7 +2503,7 @@ msgstr ""
#: report:mrp.production.order:0
#: field:mrp.production.order,products_to_consume:0
msgid "Products to Consume"
-msgstr ""
+msgstr "Proizvodi za utrošiti"
#. module: mrp
#: view:mrp.production.order:0
diff --git a/addons/mrp/i18n/hu.po b/addons/mrp/i18n/hu.po
index 85e7187ff40..0a3432b2fc5 100644
--- a/addons/mrp/i18n/hu.po
+++ b/addons/mrp/i18n/hu.po
@@ -7,15 +7,15 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2011-02-09 14:35+0000\n"
+"PO-Revision-Date: 2011-12-06 11:04+0000\n"
"Last-Translator: NOVOTRADE RENDSZERHÁZ ( novotrade.hu ) "
"\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:54+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:50+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
#. module: mrp
#: field:mrp.production,move_created_ids:0
@@ -32,26 +32,31 @@ msgid ""
"raw materials (stock decrease) and the production of the finished products "
"(stock increase) when the order is processed."
msgstr ""
+"A gyártási rendeléseket általában az OpenERP automatikusan javasolja "
+"anyagjegyzékek és beszerzési szabályok alapján, azonban lehetősége van "
+"manuálisan is felvinni gyártási rendeléseket. Az OpenERP kezeli a "
+"nyersanyagok fogyását (készlet csökkenése) és a kész termékek gyártását "
+"(készlet csökkenése), amikor a rendelést végrehajtja."
#. module: mrp
#: help:mrp.production,location_src_id:0
msgid "Location where the system will look for components."
-msgstr ""
+msgstr "A hozzávalókat ezen a helyen keresi majd a rendszer."
#. module: mrp
#: field:mrp.production,workcenter_lines:0
msgid "Work Centers Utilisation"
-msgstr ""
+msgstr "Munkaállomások használata"
#. module: mrp
#: view:mrp.routing.workcenter:0
msgid "Routing Work Centers"
-msgstr ""
+msgstr "Eljárás munkaállomásai"
#. module: mrp
#: model:ir.module.module,shortdesc:mrp.module_meta_information
msgid "Manufacturing Resource Planning"
-msgstr "Gyártási források tervezése"
+msgstr "Erőforrások tervezése"
#. module: mrp
#: report:mrp.production.order:0
@@ -88,12 +93,12 @@ msgstr "Óránkénti költség"
#: code:addons/mrp/report/price.py:130
#, python-format
msgid "Cost Price per Uom"
-msgstr "Önköltség"
+msgstr "Mértékenységenkénti költség"
#. module: mrp
#: view:mrp.production:0
msgid "Scrap Products"
-msgstr ""
+msgstr "Selejt termék"
#. module: mrp
#: view:mrp.production.order:0
@@ -105,22 +110,22 @@ msgstr "Nap"
#: model:ir.actions.act_window,name:mrp.mrp_routing_action
#: model:ir.ui.menu,name:mrp.menu_mrp_routing_action
msgid "Routings"
-msgstr ""
+msgstr "Eljárás"
#. module: mrp
#: field:mrp.workcenter,product_id:0
msgid "Work Center Product"
-msgstr ""
+msgstr "Munkaállomás-termék"
#. module: mrp
#: view:mrp.bom:0
msgid "Search Bill Of Material"
-msgstr ""
+msgstr "Anyagjegyzék keresése"
#. module: mrp
#: model:process.node,note:mrp.process_node_stockproduct1
msgid "For stockable products and consumables"
-msgstr ""
+msgstr "Raktározható és felhasználható termékekhez"
#. module: mrp
#: model:process.transition,name:mrp.process_transition_stockproduction0
@@ -133,6 +138,8 @@ msgid ""
"Number of iterations this work center has to do in the specified operation "
"of the routing."
msgstr ""
+"Megadja, hogy az eljárás adott műveletnél ezt a munkaállomást hányszor kell "
+"igénybe venni."
#. module: mrp
#: view:mrp.bom:0
@@ -156,7 +163,7 @@ msgstr "Vásárolni"
#. module: mrp
#: view:mrp.production.order:0
msgid "Raw Material Location"
-msgstr ""
+msgstr "Alapanyagok helye"
#. module: mrp
#: help:mrp.installer,mrp_operations:0
@@ -164,26 +171,30 @@ msgid ""
"Enhances production orders with readiness states as well as the start date "
"and end date of execution of the order."
msgstr ""
+"Ellátja a gyártási rendeléseket a készültség állapotával és a rendelés "
+"végrehajtásának kezdési, illetve a befejezési idejével."
#. module: mrp
#: model:process.transition,note:mrp.process_transition_purchaseprocure0
msgid "The system launches automatically a RFQ to the preferred supplier."
msgstr ""
+"A rendszer automatikusan kiküld egy ajánlatkérési felhívást a kiválasztott "
+"beszállítónak."
#. module: mrp
#: view:mrp.production:0
msgid "Products to Finish"
-msgstr ""
+msgstr "Befejezendő termékek"
#. module: mrp
#: selection:mrp.bom,method:0
msgid "Set / Pack"
-msgstr ""
+msgstr "Csomag"
#. module: mrp
#: field:mrp.installer,mrp_subproduct:0
msgid "MRP Subproducts"
-msgstr ""
+msgstr "MRP altermékek modul"
#. module: mrp
#: view:mrp.production:0
@@ -204,6 +215,8 @@ msgid ""
"In case the Supply method of the product is Produce, the system creates a "
"production order."
msgstr ""
+"Ha a termék ellátási módja \"Gyártás\", a rendszer gyártási rendelést hoz "
+"létre."
#. module: mrp
#: view:mrp.production:0
@@ -218,7 +231,7 @@ msgstr "ME"
#: field:mrp.production.order,product_qty:0
#: field:mrp.production.product.line,product_qty:0
msgid "Product Qty"
-msgstr "Termékmenny."
+msgstr "Termékmennyiség"
#. module: mrp
#: help:mrp.workcenter,product_id:0
@@ -227,22 +240,22 @@ msgid ""
"accounting."
msgstr ""
"Töltse ki ezt a terméket, hogy könnyen nyomon kövesse a gyártási költségeket "
-"a vezetői számvitelben."
+"az analitikus könyvelésben."
#. module: mrp
#: model:process.node,note:mrp.process_node_purchaseprocure0
msgid "For purchased material"
-msgstr ""
+msgstr "Vásárolt termékhez"
#. module: mrp
#: field:mrp.bom.revision,indice:0
msgid "Revision"
-msgstr "Revízió"
+msgstr "Felülvizsgálat"
#. module: mrp
#: model:ir.ui.menu,name:mrp.next_id_77
msgid "Reporting"
-msgstr "Jelentés"
+msgstr "Jelentéskészítés"
#. module: mrp
#: field:mrp.workcenter,costs_cycle_account_id:0
@@ -263,7 +276,7 @@ msgstr "["
#. module: mrp
#: model:process.transition,name:mrp.process_transition_procureserviceproduct0
msgid "Procurement of services"
-msgstr ""
+msgstr "Szolgáltatások beszerzése"
#. module: mrp
#: view:mrp.workcenter:0
@@ -278,7 +291,7 @@ msgstr "Célállomás helye"
#. module: mrp
#: view:mrp.installer:0
msgid "title"
-msgstr "Pozíció"
+msgstr "pozíció"
#. module: mrp
#: model:ir.ui.menu,name:mrp.menu_mrp_bom
@@ -291,6 +304,9 @@ msgid ""
"The system waits for the products to be available in the stock. These "
"products are typically procured manually or through a minimum stock rule."
msgstr ""
+"A rendszer termékekre vár, hogy elérhetővé válljanak a raktárban. Ezeket a "
+"termékeket általában manuálisan kell beszerezni vagy minimális "
+"készletszabályok beállításával."
#. module: mrp
#: report:mrp.production.order:0
@@ -300,7 +316,7 @@ msgstr "Partner hiv."
#. module: mrp
#: selection:mrp.workcenter.load,measure_unit:0
msgid "Amount in hours"
-msgstr ""
+msgstr "Mennyiség órában"
#. module: mrp
#: field:mrp.production,product_lines:0
@@ -310,12 +326,12 @@ msgstr "Tervezett áruk"
#. module: mrp
#: selection:mrp.bom,type:0
msgid "Sets / Phantom"
-msgstr ""
+msgstr "Csomagok"
#. module: mrp
#: help:mrp.bom,position:0
msgid "Reference to a position in an external plan."
-msgstr ""
+msgstr "Hivatkozás egy külső területre."
#. module: mrp
#: selection:mrp.production.order,month:0
@@ -326,6 +342,8 @@ msgstr "Augusztus"
#: constraint:stock.move:0
msgid "You try to assign a lot which is not from the same product"
msgstr ""
+"Egy olyan tételt próbál hozzárendelni, amely nem ugyanabból a termékfajtából "
+"való."
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_production_order
@@ -340,7 +358,7 @@ msgstr "Június"
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_product_produce
msgid "Product Produce"
-msgstr "Termék előállítása"
+msgstr "Termék gyártása"
#. module: mrp
#: selection:mrp.production.order,month:0
@@ -351,12 +369,12 @@ msgstr "Október"
#: code:addons/mrp/report/price.py:177
#, python-format
msgid "Components Cost of "
-msgstr ""
+msgstr "Hozzávalók költsége "
#. module: mrp
#: model:process.transition,name:mrp.process_transition_procurestockableproduct0
msgid "Procurement of stockable Product"
-msgstr ""
+msgstr "Raktározható termékek beszerzése"
#. module: mrp
#: view:mrp.bom:0
@@ -388,6 +406,8 @@ msgid ""
"The system creates an order (production or purchased) depending on the sold "
"quantity and the products parameters."
msgstr ""
+"A rendszer a termék tulajdonságai és az értékesített mennyiség alapján "
+"létrehoz egy - gyártási vagy beszerzési - rendelést."
#. module: mrp
#: model:process.transition,note:mrp.process_transition_servicemts0
@@ -395,6 +415,8 @@ msgid ""
"This is used in case of a service without any impact in the system, a "
"training session for instance."
msgstr ""
+"Ezt használhatjuk olyan szolgálatásokra, amelyek semmilyen hatással "
+"sincsenek a rendszerre (például egy belső képzés)."
#. module: mrp
#: field:mrp.installer,mrp_repair:0
@@ -404,7 +426,7 @@ msgstr "Javítások"
#. module: mrp
#: field:mrp.installer,stock_location:0
msgid "Advanced Routes"
-msgstr ""
+msgstr "Előrehaladott eljárások"
#. module: mrp
#: model:ir.ui.menu,name:mrp.menu_view_resource_calendar_search_mrp
@@ -422,6 +444,8 @@ msgid ""
"Enables warranty and repair management (and their impact on stocks and "
"invoicing)."
msgstr ""
+"Lehetővé teszi a garancia- és szervízkezelést, és ezek hatását a "
+"raktározásra és a számlázásra."
#. module: mrp
#: field:mrp.production,date_planned_date:0
@@ -442,6 +466,9 @@ msgid ""
"needed.Set a location if you produce at a fixed location. This can be a "
"partner location if you subcontract the manufacturing operations."
msgstr ""
+"Hagyja üresen, ha a gyártást ugyanazon a helyen végzi, ahol a késztermékre "
+"szüksége van. Válasszon egy helyszínt, ha fix helyen gyárt. Ez lehet egy "
+"partner székhelye is, amennyiben a gyártási eljárást kiszervezi."
#. module: mrp
#: view:board.board:0
@@ -451,12 +478,12 @@ msgstr "Készletérték változása"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.action2
msgid "Bill of Materials Structure"
-msgstr ""
+msgstr "Anyagjegyzék-struktúra"
#. module: mrp
#: model:process.node,note:mrp.process_node_serviceproduct0
msgid "Product type is service"
-msgstr "A termék típusa szolgáltatás."
+msgstr "A termék típusa szolgáltatás"
#. module: mrp
#: model:ir.actions.act_window,help:mrp.mrp_property_group_action
@@ -464,16 +491,18 @@ msgid ""
"Define specific property groups that can be assigned to the properties of "
"your bill of materials."
msgstr ""
+"Adjon meg egyedi tulajdonság-csoportokat, amelyeket az anyagjegyzékek "
+"tulajdonságaihoz rendelhet."
#. module: mrp
#: model:process.transition,name:mrp.process_transition_bom0
msgid "Manufacturing decomposition"
-msgstr ""
+msgstr "Gyártás lebontása"
#. module: mrp
#: model:process.node,note:mrp.process_node_serviceproduct1
msgid "For Services."
-msgstr ""
+msgstr "Szolgáltatásokhoz."
#. module: mrp
#: field:mrp.bom.revision,date:0
@@ -487,8 +516,8 @@ msgid ""
"Complete this only if you want automatic analytic accounting entries on "
"production orders."
msgstr ""
-"Csak akkor töltse ki, ha automatikus gyűjtőkód tételeket akar a termelési "
-"utasítások alapján."
+"Csak akkor töltse ki, ha analitikus könyvelési tételek automatikus bevitelét "
+"szeretné a gyártási rendelések alapján."
#. module: mrp
#: field:mrp.production.workcenter.line,cycle:0
@@ -507,6 +536,8 @@ msgid ""
"The Bill of Material is linked to a routing, i.e. the succession of work "
"centers."
msgstr ""
+"Az anyagjegyzék egy gyártási eljáráshoz kapcsolódik, vagyis a munkaállomások "
+"sorozatához."
#. module: mrp
#: constraint:product.product:0
@@ -522,12 +553,12 @@ msgstr "Gyártási hely"
#. module: mrp
#: view:mrp.production:0
msgid "Change Qty"
-msgstr ""
+msgstr "Mennyiség változtatása"
#. module: mrp
#: view:mrp.production:0
msgid "Force Reservation"
-msgstr ""
+msgstr "Foglalás erőltetése"
#. module: mrp
#: field:mrp.bom.revision,author_id:0
@@ -542,12 +573,12 @@ msgstr "Készletérték"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.action_product_bom_structure
msgid "Product BoM Structure"
-msgstr ""
+msgstr "Termék anyagjegyzék-struktúrája"
#. module: mrp
#: view:mrp.production:0
msgid "Search Production"
-msgstr ""
+msgstr "Gyártás keresése"
#. module: mrp
#: code:addons/mrp/report/price.py:130
@@ -563,14 +594,14 @@ msgstr "Március"
#. module: mrp
#: field:mrp.bom,child_complete_ids:0
msgid "BoM Hierarchy"
-msgstr ""
+msgstr "Anyagjegyzék hierarchia"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.act_mrp_product_produce
#: view:mrp.product.produce:0
#: view:mrp.production:0
msgid "Produce"
-msgstr "Gyártás"
+msgstr "Gyártani"
#. module: mrp
#: help:mrp.workcenter,costs_cycle:0
@@ -582,17 +613,17 @@ msgstr ""
#: view:mrp.production.order:0
#: selection:mrp.production.order,state:0
msgid "Picking Exception"
-msgstr "Kiszedési kivétel"
+msgstr "Kiszedési hiba"
#. module: mrp
#: field:mrp.bom,bom_lines:0
msgid "BoM Lines"
-msgstr ""
+msgstr "Anyagjegyzék sorok"
#. module: mrp
#: field:mrp.workcenter,time_start:0
msgid "Time before prod."
-msgstr ""
+msgstr "Gyártás előkészületi idő"
#. module: mrp
#: help:mrp.routing,active:0
@@ -600,11 +631,13 @@ msgid ""
"If the active field is set to False, it will allow you to hide the routing "
"without removing it."
msgstr ""
+"Ha az aktív mezőt \"Hamis\"-ra állítja, akkor törlés nélkül el tudja rejteni "
+"a gyártási eljárást."
#. module: mrp
#: model:process.transition,name:mrp.process_transition_billofmaterialrouting0
msgid "Material Routing"
-msgstr ""
+msgstr "Termék útja"
#. module: mrp
#: view:mrp.production:0
@@ -612,31 +645,31 @@ msgstr ""
#: report:mrp.production.order:0
#: field:mrp.production.order,consumed_products:0
msgid "Consumed Products"
-msgstr ""
+msgstr "Felhasznált termékek"
#. module: mrp
#: constraint:mrp.bom:0
msgid "Error ! You can not create recursive BoM."
-msgstr ""
+msgstr "Hiba! Rekurzív anyagjegyzék nem hozható létre."
#. module: mrp
#: model:ir.actions.act_window,name:mrp.action_mrp_workcenter_load_wizard
#: model:ir.model,name:mrp.model_mrp_workcenter_load
#: model:ir.model,name:mrp.model_report_workcenter_load
msgid "Work Center Load"
-msgstr ""
+msgstr "Munkaállomás terheltsége"
#. module: mrp
#: code:addons/mrp/procurement.py:45
#, python-format
msgid "No BoM defined for this product !"
-msgstr ""
+msgstr "Az adott termékhez nincsen anyagjegyzék megadva!"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_bom_form_action2
#: model:ir.ui.menu,name:mrp.menu_mrp_bom_form_action2
msgid "Bill of Material Components"
-msgstr ""
+msgstr "Anyagjegyzék hozzávalói"
#. module: mrp
#: field:mrp.production.order,nbr:0
@@ -661,6 +694,10 @@ msgid ""
"operations and to plan future loads on work centers based on production "
"plannification."
msgstr ""
+"A késztermék létrehozásához szükséges műveletek (munkaállomások) listája. A "
+"gyártási eljárások fő funkciója a munkaállomások működési költségeinek "
+"számítása és a munkaállomások terheltségének tervezése a gyártási tervezésén "
+"keresztül."
#. module: mrp
#: help:mrp.workcenter,time_cycle:0
@@ -670,7 +707,7 @@ msgstr "Idő (órában), ami egy ciklus elvégzéséhez szükséges"
#. module: mrp
#: report:bom.structure:0
msgid "BOM Ref"
-msgstr ""
+msgstr "Anyagjegyzék hivatkozás"
#. module: mrp
#: view:mrp.production:0
@@ -683,7 +720,7 @@ msgstr "Gyártás alatt"
#. module: mrp
#: model:ir.ui.menu,name:mrp.menu_mrp_property
msgid "Master Bill of Materials"
-msgstr ""
+msgstr "Fő anyagjegyzékek"
#. module: mrp
#: help:mrp.bom,product_uos:0
@@ -691,6 +728,8 @@ msgid ""
"Product UOS (Unit of Sale) is the unit of measurement for the invoicing and "
"promotion of stock."
msgstr ""
+"A termék eladási mértékegysége a számlázásban és a kiszállításban használt "
+"mértékegység."
#. module: mrp
#: view:mrp.product_price:0
@@ -715,6 +754,7 @@ msgstr "Összes költsége "
#: model:process.node,note:mrp.process_node_minimumstockrule0
msgid "Linked to the 'Minimum stock rule' supplying method."
msgstr ""
+"A \"minimális raktárkezelési szabály\" ellátási módszeréhez kapcsolódik."
#. module: mrp
#: selection:mrp.workcenter.load,time_unit:0
@@ -722,12 +762,12 @@ msgid "Per month"
msgstr "Havonta"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
msgid "Couldn't find bill of material for product"
-msgstr ""
+msgstr "A termékhez nem található anyagjegyzék"
#. module: mrp
#: report:bom.structure:0
@@ -735,15 +775,15 @@ msgid "Product Name"
msgstr "Termék neve"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
-msgstr "Érvénytelen művelet !"
+msgstr "Érvénytelen művelet!"
#. module: mrp
#: help:mrp.bom,product_efficiency:0
msgid "A factor of 0.9 means a loss of 10% within the production process."
-msgstr ""
+msgstr "A 0,9-es érték 10%-os veszteséget jelent a gyártási folyamatban."
#. module: mrp
#: view:mrp.installer:0
@@ -751,6 +791,8 @@ msgid ""
"Add more functionalities to the core Manufacturing Application with the "
"following addons."
msgstr ""
+"Bővitse további funkciókkal az alap gyártási alkalmazást az alábbi addonok "
+"használatával."
#. module: mrp
#: report:mrp.production.order:0
@@ -771,7 +813,7 @@ msgstr "Beszerzési szabály"
#. module: mrp
#: help:mrp.workcenter,costs_hour:0
msgid "Specify Cost of Work center per hour."
-msgstr ""
+msgstr "Adja meg a munkaállomás egy órára eső költségét."
#. module: mrp
#: view:mrp.production:0
@@ -786,7 +828,7 @@ msgstr "Szeptember"
#. module: mrp
#: report:mrp.production.order:0
msgid "WorkCenter"
-msgstr ""
+msgstr "Munkaállomás"
#. module: mrp
#: model:process.transition,note:mrp.process_transition_procureserviceproduct0
@@ -795,6 +837,9 @@ msgid ""
"order creates a RFQ for a subcontracting purchase order or waits until the "
"service is done (= the delivery of the products)."
msgstr ""
+"A szolgáltatásnál megadott ellátási módtól függően, a beszerzési rendelés "
+"vagy egy alvállalkozónak szóló ajánlatkérést hoz létre, vagy várakozik, míg "
+"a szolgáltatás (azaz a termék kiszállítása) be nem fejeződik."
#. module: mrp
#: selection:mrp.production,priority:0
@@ -815,7 +860,7 @@ msgstr "Gyártási rendelés"
#. module: mrp
#: model:process.transition,name:mrp.process_transition_productionprocureproducts0
msgid "Procurement of raw material"
-msgstr ""
+msgstr "Alapanyag-beszerzés"
#. module: mrp
#: help:mrp.routing.workcenter,hour_nbr:0
@@ -823,6 +868,8 @@ msgid ""
"Time in hours for this work center to achieve the operation of the specified "
"routing."
msgstr ""
+"A megadott munkaállomásnak szükséges idő (órákban), amivel az eljárásban "
+"megadott műveletet el tudja végezni."
#. module: mrp
#: view:mrp.production:0
@@ -835,7 +882,7 @@ msgstr "Összes ciklus"
#: view:mrp.production.order:0
#: selection:mrp.production.order,state:0
msgid "Ready to Produce"
-msgstr ""
+msgstr "Gyártásra kész"
#. module: mrp
#: field:mrp.bom.revision,name:0
@@ -852,7 +899,7 @@ msgstr "Dátum"
#. module: mrp
#: field:mrp.bom,type:0
msgid "BoM Type"
-msgstr ""
+msgstr "Anyagjegyzék tipusa"
#. module: mrp
#: view:mrp.production.order:0
@@ -865,6 +912,7 @@ msgstr "Kiterjesztett szűrők…"
msgid ""
"Procurement '%s' has an exception: 'No BoM defined for this product !'"
msgstr ""
+"A %s beszerzés hibát jelzett: \"A termékhez nem található anyagjegyzék!\""
#. module: mrp
#: view:mrp.production.order:0
@@ -896,7 +944,7 @@ msgstr "Vezérlőpult"
#. module: mrp
#: view:board.board:0
msgid "Work Center Future Load"
-msgstr ""
+msgstr "Munkaállomások jövőbeli terheltsége"
#. module: mrp
#: model:process.node,name:mrp.process_node_stockproduct0
@@ -909,7 +957,7 @@ msgstr "Készletezhető termék"
#: code:addons/mrp/report/price.py:121
#, python-format
msgid "Work Center name"
-msgstr ""
+msgstr "Munkaállomás neve"
#. module: mrp
#: field:mrp.routing,code:0
@@ -924,18 +972,18 @@ msgstr "Órák száma"
#. module: mrp
#: field:mrp.installer,mrp_jit:0
msgid "Just In Time Scheduling"
-msgstr ""
+msgstr "Just In Time ütemezés"
#. module: mrp
#: view:mrp.property:0
#: view:mrp.property.group:0
msgid "Property Group"
-msgstr ""
+msgstr "Tulajdonságcsoport"
#. module: mrp
#: view:mrp.production:0
msgid "Qty"
-msgstr "Menny."
+msgstr "Mennyiség"
#. module: mrp
#: model:process.node,note:mrp.process_node_production0
@@ -954,6 +1002,8 @@ msgid ""
"Enables multiple product output from a single production order: without "
"this, a production order can have only one output product."
msgstr ""
+"Lehetővét teszi több termék kibocsátását egyetlen gyártási rendelésből. "
+"Enélkül a gyártási rendelés csak egy terméket bocsátana ki."
#. module: mrp
#: view:change.production.qty:0
@@ -982,6 +1032,8 @@ msgid ""
"If the service has a 'Buy' supply method, this creates a RFQ, a "
"subcontracting demand for instance."
msgstr ""
+"Ha a szolgáltatás ellátási módja \"Vásárlás\", akkor a rendszer egy "
+"ajánlatkérést hoz létre."
#. module: mrp
#: field:mrp.production,move_prod_id:0
@@ -996,18 +1048,20 @@ msgstr "Később"
#. module: mrp
#: model:process.node,name:mrp.process_node_servicemts0
msgid "Make to stock"
-msgstr "Készletre gyártás"
+msgstr "Beszerzés készletből"
#. module: mrp
#: help:mrp.routing.workcenter,sequence:0
msgid ""
"Gives the sequence order when displaying a list of routing work centers."
msgstr ""
+"Megadja a sorrendet, amikor az eljárásban lévő munkaállomások listáját "
+"kiállítjuk."
#. module: mrp
#: report:bom.structure:0
msgid "BOM Name"
-msgstr ""
+msgstr "Anyagjegyzék név"
#. module: mrp
#: view:mrp.production:0
@@ -1036,6 +1090,8 @@ msgid ""
"Manages product routes and paths within and between locations (e.g. "
"warehouses)."
msgstr ""
+"Kezeli a termékeljárásokat és a termékútvonalakat a helyeken és a helyek "
+"között (pl.: raktárak között)."
#. module: mrp
#: model:process.node,note:mrp.process_node_billofmaterial0
@@ -1054,7 +1110,7 @@ msgstr "Név"
#. module: mrp
#: view:mrp.installer:0
msgid "MRP Application Configuration"
-msgstr ""
+msgstr "Gyártási modul alkalmazás konfigurálás"
#. module: mrp
#: help:mrp.installer,mrp_jit:0
@@ -1065,6 +1121,11 @@ msgid ""
"avoids having to wait for the procurement scheduler to run or having to run "
"the procurement scheduler manually."
msgstr ""
+"Lehetővé teszi a Just in Time számításokat a beszerzési rendelésekben. \n"
+"\n"
+"Míg ez erőforrás igényesebb, mint az alapértelmezett beállítás, a Just in "
+"Time modul kikerüli azt, hogy a beszerzési ütemező futtatására várjunk, vagy "
+"hogy a beszerzési ütemezőt manuálisan futtassuk."
#. module: mrp
#: field:mrp.product.produce,mode:0
@@ -1079,7 +1140,7 @@ msgstr "]"
#. module: mrp
#: field:mrp.workcenter.load,measure_unit:0
msgid "Amount measuring unit"
-msgstr ""
+msgstr "Érték mértékegysége"
#. module: mrp
#: model:ir.actions.act_window,help:mrp.mrp_production_action_planning
@@ -1091,11 +1152,18 @@ msgid ""
"materials have been defined, OpenERP is capable of automatically deciding on "
"the manufacturing route depending on the needs of the company."
msgstr ""
+"Gyártási rendelések meghatározzák azokat a műveleteket, amelyeket el kell "
+"végezni, illetve az alapanyag-felhasználást minden egyes gyártási fázisban. "
+"Használjon specifikációkat (anyagjegyzékek), hogy meghatározza az alapanyag-"
+"szükségletek és a késztermékek elkészítéséhez szükséges gyártási "
+"rendeléseket. Ha az anyagjegyzékeket egyszer már megadta, az OpenERP képes "
+"automatiklusan eldönteni, hogy melyik gyártási eljárást alkalmazza, függően "
+"a vállalat szükségleteitől."
#. module: mrp
#: constraint:mrp.production:0
msgid "Order quantity cannot be negative or zero !"
-msgstr "Rendelési mennyiség nem lehet negatív vagy nulla !"
+msgstr "Rendelési mennyiség nem lehet negatív vagy nulla!"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_production_action3
@@ -1144,7 +1212,7 @@ msgstr ""
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_production_action4
msgid "Manufacturing Orders Waiting Products"
-msgstr ""
+msgstr "Árura várakozó gyártási rendelések"
#. module: mrp
#: view:mrp.bom:0
@@ -1160,36 +1228,36 @@ msgstr "Csoportosítás..."
#: code:addons/mrp/report/price.py:121
#, python-format
msgid "Cycles Cost"
-msgstr "Ciklus költsége"
+msgstr "Ciklus költség"
#. module: mrp
#: selection:mrp.workcenter.load,measure_unit:0
msgid "Amount in cycles"
-msgstr ""
+msgstr "Érték ciklusokban"
#. module: mrp
#: field:mrp.production,location_dest_id:0
#: view:mrp.production.order:0
#: field:mrp.production.order,location_dest_id:0
msgid "Finished Products Location"
-msgstr ""
+msgstr "Késztermékek helye"
#. module: mrp
#: model:ir.ui.menu,name:mrp.menu_pm_resources_config
msgid "Resources"
-msgstr "Források"
+msgstr "Erőforrások"
#. module: mrp
#: field:mrp.workcenter,costs_journal_id:0
msgid "Analytic Journal"
-msgstr "Gyűjtőnapló"
+msgstr "Analitikus napló"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_workcenter_action
#: model:ir.ui.menu,name:mrp.menu_view_resource_search_mrp
#: field:mrp.routing,workcenter_lines:0
msgid "Work Centers"
-msgstr ""
+msgstr "Munkaállomások"
#. module: mrp
#: selection:mrp.workcenter.load,time_unit:0
@@ -1204,6 +1272,10 @@ msgid ""
"They are attached to bills of materials that will define the required raw "
"materials."
msgstr ""
+"A gyártási eljárások lehetővé teszik Önnek, hogy létrehozza és kezelje "
+"azokat a gyártási műveleteket, amelyeket a termék legyártásához követni kell "
+"a munkaállomásokon. Az eljárások az anyagjegyzékekhez kapcsolódnak, amelyek "
+"meghatározzák a szükséges alapanyagokat."
#. module: mrp
#: field:report.workcenter.load,hour:0
@@ -1213,7 +1285,7 @@ msgstr "Óra száma"
#. module: mrp
#: view:mrp.routing:0
msgid "Work Center Operations"
-msgstr ""
+msgstr "Munkaállomás műveletei"
#. module: mrp
#: view:mrp.routing:0
@@ -1237,24 +1309,24 @@ msgstr "Időegység kiválasztása"
#. module: mrp
#: view:report.workcenter.load:0
msgid "Work Center load"
-msgstr ""
+msgstr "Munkaállomás terheltsége"
#. module: mrp
#: help:mrp.production,location_dest_id:0
msgid "Location where the system will stock the finished products."
-msgstr ""
+msgstr "A késztermékek tárolásának helye."
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
#. module: mrp
#: field:stock.change.standard.price,change_parent_price:0
msgid "Change Parent Price"
-msgstr ""
+msgstr "Fölérendelt ár megváltoztatása"
#. module: mrp
#: model:ir.model,name:mrp.model_stock_move
@@ -1268,6 +1340,9 @@ msgid ""
"maxi quantity. It's available in the Inventory management menu and "
"configured by product."
msgstr ""
+"A minimális készlet szabály egy automatikus beszerzési szabály, amely a "
+"minimum és maximum árumennyiségre épül. Elérhető a leltárkezelés menüben, "
+"illetve az egyes termékeknél állítható be."
#. module: mrp
#: selection:mrp.workcenter.load,time_unit:0
@@ -1282,7 +1357,7 @@ msgstr "Felülvizsgálatok"
#. module: mrp
#: view:mrp.installer:0
msgid "Configure Your Manufacturing Resource Planning Application"
-msgstr ""
+msgstr "Állítsa be a gyártási modul alkalmazását."
#. module: mrp
#: field:mrp.production,priority:0
@@ -1301,38 +1376,38 @@ msgid "Month -1"
msgstr "Előző hónap"
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
-msgstr ""
+msgstr "A %s gyártási rendelést a rendszer a következőre ütemezte: %s"
#. module: mrp
#: report:mrp.production.order:0
msgid "Production Order N° :"
-msgstr "Gyártási rendelés száma"
+msgstr "Gyártási rendelés száma:"
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
-msgstr ""
+msgstr "A %s gyártási rendelés gyártásra kész."
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_production_product_line
msgid "Production Scheduled Product"
-msgstr ""
+msgstr "Gyártásra ütemezett termék"
#. module: mrp
#: help:res.company,manufacturing_lead:0
msgid "Security days for each manufacturing operation."
-msgstr ""
+msgstr "Minden gyártási művelet biztonsági ideje."
#. module: mrp
#: model:process.node,name:mrp.process_node_mts0
#: model:process.transition,name:mrp.process_transition_servicemts0
#: model:process.transition,name:mrp.process_transition_stockmts0
msgid "Make to Stock"
-msgstr "Készletre gyártás"
+msgstr "Beszerzés készletből"
#. module: mrp
#: selection:mrp.production.order,month:0
@@ -1348,6 +1423,12 @@ msgid ""
"product needs. You can either create a bill of materials to define specific "
"production steps or define a single multi-level bill of materials."
msgstr ""
+"A fő anyagjegyzékek lehetővé teszik Önnek, hogy létrehozza és kezelje a "
+"késztermék előállításához szükséges alapanyagok listáját. Az OpenERP "
+"használja ezeket az anyagjegyzékeket, hogy automatikusan javasoljon gyártási "
+"rendeléseket a termékszükségleteknek megfelelően. Létrehozhat "
+"anyagjegyzékeket, hogy meghatározzon speciális gyártási lépéseket vagy "
+"megadhat egy több szintű anyagjegyzék-struktúrát is."
#. module: mrp
#: model:process.transition,note:mrp.process_transition_stockrfq0
@@ -1355,8 +1436,8 @@ msgid ""
"In case the Supply method of the product is Buy, the system creates a "
"purchase order."
msgstr ""
-"Ha a termék ellátási módszere vásárlás, a rendszer szállítói megrendelést "
-"hoz létre."
+"Ha a termék ellátási módszere \"Vásárlás\", a rendszer szállítói "
+"megrendelést hoz létre."
#. module: mrp
#: model:ir.model,name:mrp.model_procurement_order
@@ -1373,7 +1454,7 @@ msgstr "Termék költségszerkezete"
#: code:addons/mrp/report/price.py:130
#, python-format
msgid "Components suppliers"
-msgstr "Alkatrészek beszállítói"
+msgstr "Hozzávalók beszállítói"
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_installer
@@ -1383,7 +1464,7 @@ msgstr "mrp.installer"
#. module: mrp
#: view:mrp.production:0
msgid "Production Work Centers"
-msgstr ""
+msgstr "Gyártási munkaállomások"
#. module: mrp
#: view:mrp.production.order:0
@@ -1400,12 +1481,12 @@ msgstr "Aktív ID nem található"
#. module: mrp
#: view:mrp.workcenter:0
msgid "Search for mrp workcenter"
-msgstr ""
+msgstr "Munkaállomás keresése"
#. module: mrp
#: view:mrp.bom:0
msgid "BoM Structure"
-msgstr ""
+msgstr "Anyagjegyzék struktúra"
#. module: mrp
#: field:mrp.production,date_start:0
@@ -1416,12 +1497,12 @@ msgstr "Kezdő dátum"
#. module: mrp
#: field:mrp.workcenter,costs_hour_account_id:0
msgid "Hour Account"
-msgstr "Óra gyűjtőkód"
+msgstr "Óra számla"
#. module: mrp
#: view:mrp.production:0
msgid "Destination Loc."
-msgstr ""
+msgstr "Célállomás helye"
#. module: mrp
#: field:mrp.production.order,product_id2:0
@@ -1442,13 +1523,13 @@ msgstr "aktív"
#. module: mrp
#: model:process.node,name:mrp.process_node_procureproducts0
msgid "Procure Products"
-msgstr ""
+msgstr "Termékek beszerzése"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.action_report_workcenter_load_tree
#: view:report.workcenter.load:0
msgid "Work Center Loads"
-msgstr ""
+msgstr "Munkaállomások terheltsége"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_property_action
@@ -1466,6 +1547,7 @@ msgstr "Tulajdonságok"
msgid ""
"Reference of the document that generated this production order request."
msgstr ""
+"A dokumentum hivatkozása hozta létre ezt a gyártási rendelési megbízást."
#. module: mrp
#: sql_constraint:mrp.bom:0
@@ -1474,6 +1556,9 @@ msgid ""
"You should install the mrp_subproduct module if you want to manage extra "
"products on BoMs !"
msgstr ""
+"Minden termékmennyiségnek pozitívnak kell lennie.\n"
+"Telepítse az altermékek modult, amennyiben több terméket is szeretnénk egy "
+"anyagjegyzékkel legyártani."
#. module: mrp
#: view:mrp.production:0
@@ -1483,12 +1568,12 @@ msgstr "Extra információ"
#. module: mrp
#: model:ir.model,name:mrp.model_change_production_qty
msgid "Change Quantity of Products"
-msgstr ""
+msgstr "Termékek mennyiségének megváltoztatása"
#. module: mrp
#: model:process.node,note:mrp.process_node_productionorder0
msgid "Drives the procurement orders for raw material."
-msgstr ""
+msgstr "Kezeli az alapanyagok beszerzési rendeléseit."
#. module: mrp
#: view:mrp.production.order:0
@@ -1503,7 +1588,7 @@ msgstr "Főkönyvi számla"
#. module: mrp
#: report:mrp.production.order:0
msgid "SO Number"
-msgstr ""
+msgstr "Értékesítési megbízás száma"
#. module: mrp
#: selection:mrp.production,state:0
@@ -1536,17 +1621,19 @@ msgid ""
"This will change the price of parent products also according to the BoM "
"structure specified for the product."
msgstr ""
+"Ez megváltoztatja a fölérendelt termékek árát is a termék anyagjegyzék-"
+"struktúrájának megfelelően."
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_production_action2
msgid "Manufacturing Orders To Start"
-msgstr ""
+msgstr "Elkezdésre váró gyártási rendelések"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
-msgstr ""
+msgstr "A %s állapotban lévő gyártási rendelések nem törölhetőek!"
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_workcenter
@@ -1555,12 +1642,12 @@ msgstr ""
#: view:mrp.workcenter:0
#: field:report.workcenter.load,workcenter_id:0
msgid "Work Center"
-msgstr ""
+msgstr "Munkaállomás"
#. module: mrp
#: field:mrp.workcenter,capacity_per_cycle:0
msgid "Capacity per Cycle"
-msgstr ""
+msgstr "Ciklusonkénti kapacitás"
#. module: mrp
#: model:ir.model,name:mrp.model_product_product
@@ -1585,7 +1672,7 @@ msgstr "Összes óra"
#: field:mrp.production,location_src_id:0
#: field:mrp.production.order,location_src_id:0
msgid "Raw Materials Location"
-msgstr ""
+msgstr "Alapanyagok helye"
#. module: mrp
#: view:mrp.product_price:0
@@ -1605,11 +1692,14 @@ msgid ""
"of one or more persons and/or machines that can be considered as a unit for "
"capacity and planning forecasting."
msgstr ""
+"A munkaállomások lehetővé teszik Önnek, hogy létrehozza és kezelje az egy "
+"vagy több személyből vagy gépből álló gyártási egységeket, amelyek a "
+"kapacitástervezés és -előrejelzés alapegységeit képezik."
#. module: mrp
#: view:mrp.production:0
msgid "Consume Products"
-msgstr ""
+msgstr "Termékek felhasználása"
#. module: mrp
#: field:mrp.bom,product_uom:0
@@ -1624,16 +1714,16 @@ msgstr "Termék ME"
#: model:process.transition,name:mrp.process_transition_servicemto0
#: model:process.transition,name:mrp.process_transition_stockproduct0
msgid "Make to Order"
-msgstr "Rendelésre gyártás"
+msgstr "Beszerzés megrendelésből"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.action_report_mrp_production_order
#: model:ir.ui.menu,name:mrp.menu_report_mrp_production_orders_tree
msgid "Production Analysis"
-msgstr "Gyártás elemzése"
+msgstr "Gyártáselemzés"
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr "Másolás"
@@ -1647,18 +1737,20 @@ msgstr "Gyártási termékek"
#: field:mrp.production,date_finished:0
#: field:mrp.production.order,date_finished:0
msgid "End Date"
-msgstr "Befejezés dátuma"
+msgstr "Befejezési dátum"
#. module: mrp
#: field:mrp.workcenter,resource_id:0
msgid "Resource"
-msgstr "Forrás"
+msgstr "Erőforrás"
#. module: mrp
#: help:mrp.bom,date_start:0
#: help:mrp.bom,date_stop:0
msgid "Validity of this BoM or component. Keep empty if it's always valid."
msgstr ""
+"Az anyagjegyzék vagy hozzávaló érvényessége. Hagyja üresen, ha mindig "
+"érvényes."
#. module: mrp
#: field:mrp.production,product_uos:0
@@ -1684,21 +1776,25 @@ msgid ""
"operations and to plan future loads on work centers based on production "
"planning."
msgstr ""
+"A késztermék gyártásához szükséges műveletek listája (munkaállomások "
+"listája). Az eljárás főleg arra szolgál, hogy a műveletek alatt a "
+"munkaállomások költségei ki legyenek számítva, és hogy a munkaállomások "
+"jövőbeni terheltsége meg legyen tervezve a gyártási terv alapján."
#. module: mrp
#: view:change.production.qty:0
msgid "Approve"
-msgstr "Jóváhagy"
+msgstr "Jóváhagyás"
#. module: mrp
#: view:mrp.property.group:0
msgid "Properties categories"
-msgstr ""
+msgstr "Tulajdonság-kategóriák"
#. module: mrp
#: help:mrp.production.workcenter.line,sequence:0
msgid "Gives the sequence order when displaying a list of work orders."
-msgstr ""
+msgstr "Megadja a sorrendet, amikor a munka megbízások listáját kiállítjuk."
#. module: mrp
#: report:mrp.production.order:0
@@ -1714,7 +1810,7 @@ msgstr "Tervezett termékek"
#. module: mrp
#: view:mrp.production.lot.line:0
msgid "Production Products Consommation"
-msgstr ""
+msgstr "Gyártási termékek felhasználása"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_production_action
@@ -1734,12 +1830,17 @@ msgid ""
"the quantity selected and it will finish the production order when total "
"ordered quantities are produced."
msgstr ""
+"A \"Csak felhasználás\" mód csak a kijelölt mennyiségű termékeket használja "
+"fel.\n"
+"A \"Felhasználás és gyártás\" mód a kijelölt mennyiségű termékeket "
+"használja fel és gyártja is, és csak akkor fejezi be a gyártási rendelést, "
+"amikor a teljes megrendelt mennyiség legyártásra került."
#. module: mrp
#: view:mrp.production:0
#: report:mrp.production.order:0
msgid "Work Orders"
-msgstr ""
+msgstr "Munka megbízások"
#. module: mrp
#: field:mrp.workcenter,costs_cycle:0
@@ -1761,13 +1862,13 @@ msgstr "Törölt"
#. module: mrp
#: view:mrp.production.order:0
msgid "BOM"
-msgstr ""
+msgstr "Anyagjegyzék"
#. module: mrp
#: help:mrp.bom,product_uom:0
msgid ""
"UoM (Unit of Measure) is the unit of measurement for the inventory control"
-msgstr ""
+msgstr "A mértékegység leltárellenőrzés mértékegysége."
#. module: mrp
#: model:process.transition,note:mrp.process_transition_bom0
@@ -1776,6 +1877,9 @@ msgid ""
"are products themselves) can also have their own Bill of Material (multi-"
"level)."
msgstr ""
+"Az anyagjegyzék a termék szétbontása összetevőkre. Az összetevőknek, amelyek "
+"maguk is termékek, rendelkezhetnek saját anyagjegyzékkel (több szintű "
+"anyagjegyzék)."
#. module: mrp
#: field:mrp.bom,company_id:0
@@ -1828,7 +1932,7 @@ msgstr "Összetevők"
#: report:bom.structure:0
#: model:ir.actions.report.xml,name:mrp.report_bom_structure
msgid "BOM Structure"
-msgstr ""
+msgstr "Anyagjegyzék struktúra"
#. module: mrp
#: field:mrp.bom,date_stop:0
@@ -1843,7 +1947,7 @@ msgstr "Érvényesség kezdete"
#. module: mrp
#: selection:mrp.bom,type:0
msgid "Normal BoM"
-msgstr ""
+msgstr "Normál anyagjegyzék"
#. module: mrp
#: field:res.company,manufacturing_lead:0
@@ -1863,6 +1967,9 @@ msgid ""
"linked to manufacturing activities, receptions of products and delivery "
"orders."
msgstr ""
+"A heti készlet érték változtatása lehetővé teszi Önnek, hogy kövesse a "
+"gyártási tevékenységekhez, a termékek beérkezéséhez és a kiszállítási "
+"megbízásokhoz kapcsolódó készletérték fejlődését."
#. module: mrp
#: view:mrp.product.produce:0
@@ -1872,7 +1979,7 @@ msgstr "Megerősítés"
#. module: mrp
#: field:mrp.bom,product_efficiency:0
msgid "Manufacturing Efficiency"
-msgstr ""
+msgstr "Gyártási hatékonyság"
#. module: mrp
#: constraint:res.company:0
@@ -1885,17 +1992,19 @@ msgid ""
"If the active field is set to False, it will allow you to hide the bills of "
"material without removing it."
msgstr ""
+"Ha az aktív mező \"Hamis\"-ra van állítva, ez lehetővé teszi, hogy elrejtse "
+"az anyagjegyzékeket, anélkül, hogy törölné azokat."
#. module: mrp
#: field:mrp.bom,product_rounding:0
msgid "Product Rounding"
-msgstr ""
+msgstr "Termék kerekítése"
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_production_workcenter_line
#: field:mrp.production.workcenter.line,name:0
msgid "Work Order"
-msgstr ""
+msgstr "Munka megbízás"
#. module: mrp
#: model:ir.actions.act_window,help:mrp.action_report_mrp_production_order
@@ -1903,16 +2012,18 @@ msgid ""
"This reporting allows you to analyse your manufacturing activities and "
"performance."
msgstr ""
+"A riport készítés lehetővé teszi Önnek, hogy elemezze a gyártási "
+"tevékenységét és teljesítményét."
#. module: mrp
#: selection:mrp.product.produce,mode:0
msgid "Consume Only"
-msgstr ""
+msgstr "Csak felhasználás"
#. module: mrp
#: view:mrp.production:0
msgid "Recreate Picking"
-msgstr ""
+msgstr "Kiszedés újrakészítése"
#. module: mrp
#: help:mrp.bom,type:0
@@ -1923,6 +2034,12 @@ msgid ""
"product, it will be sold and shipped as a set of components, instead of "
"being produced."
msgstr ""
+"Ha egy altermék több termékben is használatban van, hasznos lehet "
+"megcsinálni a saját anyagjegyzékét. Ha nem szeretne különböző gyártási "
+"rendeléseket erre az altermékre, akkor válassza a fantom anyagjegyzék "
+"beállítását, mint anyagjegyzék típust. Ha a fantom anyagjegyzék kiinduló "
+"termékként van használatban, akkor azt a rendszer összetevők egységeként "
+"értékesíti és szállítja, ahelyett, hogy gyártaná."
#. module: mrp
#: field:mrp.bom,method:0
@@ -1940,6 +2057,14 @@ msgid ""
" When the production gets started then the state is set to 'In Production'.\n"
" When the production is over, the state is set to 'Done'."
msgstr ""
+"Amikor a gyártási rendelés létrejön, a gyártás állapota \"Tervezet\" lesz.\n"
+"Amikor a rendelés megerősítésre kerül, a gyártás állapota \"Várakozás az "
+"árura\" lesz.\n"
+"Ha bármilyen hiba felmerül, a gyártás állapota \"Kiszedési hiba\" lesz. \n"
+"Ha a készlet elérhető, akkor a gyártás állapota \"Gyártásra kész\" lesz. \n"
+"Amikor a gyártás elkezdődik, akkor a gyártás állapota \"Gyártás alatt\" "
+"lesz.\n"
+"Amikor a gyártás befejeződik, a a gyártás állapota \"Kész\" lesz."
#. module: mrp
#: selection:mrp.bom,method:0
@@ -1950,12 +2075,12 @@ msgstr "Rendelésre"
#: model:ir.ui.menu,name:mrp.menu_mrp_configuration
#: view:res.company:0
msgid "Configuration"
-msgstr "Beállítások"
+msgstr "Beállítás"
#. module: mrp
#: field:mrp.workcenter,time_stop:0
msgid "Time after prod."
-msgstr ""
+msgstr "Gyártás utáni idő"
#. module: mrp
#: field:mrp.workcenter.load,time_unit:0
@@ -1965,7 +2090,7 @@ msgstr "Időszak típusa"
#. module: mrp
#: view:mrp.production:0
msgid "Total Qty"
-msgstr "Összmenny."
+msgstr "Összmennyiség"
#. module: mrp
#: field:mrp.routing.workcenter,hour_nbr:0
@@ -1975,7 +2100,7 @@ msgstr "Órák száma"
#. module: mrp
#: view:mrp.workcenter:0
msgid "Costing Information"
-msgstr ""
+msgstr "Költségszámítási információk"
#. module: mrp
#: model:process.node,name:mrp.process_node_purchaseprocure0
@@ -1985,27 +2110,27 @@ msgstr "Beszerzési megrendelések"
#. module: mrp
#: help:mrp.bom,product_rounding:0
msgid "Rounding applied on the product quantity."
-msgstr ""
+msgstr "A termékmennyiségen alkalmazott kerekítés."
#. module: mrp
#: model:process.node,note:mrp.process_node_stock0
msgid "Assignment from Production or Purchase Order."
-msgstr ""
+msgstr "Ellátás gyártási vagy beszerzési megrendelésből."
#. module: mrp
#: field:mrp.routing.workcenter,routing_id:0
msgid "Parent Routing"
-msgstr ""
+msgstr "Fölérendelt eljárás"
#. module: mrp
#: view:mrp.installer:0
msgid "Configure"
-msgstr "Beállítás"
+msgstr "Beállít"
#. module: mrp
#: help:mrp.workcenter,time_start:0
msgid "Time in hours for the setup."
-msgstr ""
+msgstr "A beállításhoz szükséges idő órákban megadva."
#. module: mrp
#: selection:mrp.production.order,month:0
@@ -2021,19 +2146,19 @@ msgstr "Kép"
#: field:mrp.bom.revision,bom_id:0
#: field:procurement.order,bom_id:0
msgid "BoM"
-msgstr ""
+msgstr "Anyagjegyzék"
#. module: mrp
#: model:ir.model,name:mrp.model_report_mrp_inout
#: view:report.mrp.inout:0
msgid "Stock value variation"
-msgstr ""
+msgstr "Készletérték változás"
#. module: mrp
#: model:process.node,note:mrp.process_node_mts0
#: model:process.node,note:mrp.process_node_servicemts0
msgid "Assignment from stock."
-msgstr ""
+msgstr "Ellátás raktárból"
#. module: mrp
#: selection:mrp.production,state:0
@@ -2045,13 +2170,13 @@ msgstr "Várakozás az árura"
#. module: mrp
#: field:mrp.bom.revision,last_indice:0
msgid "last indice"
-msgstr ""
+msgstr "utolsó jelzőszám"
#. module: mrp
#: field:mrp.bom,revision_ids:0
#: view:mrp.bom.revision:0
msgid "BoM Revisions"
-msgstr ""
+msgstr "Anyagjegyzék felülvizsgálatok"
#. module: mrp
#: selection:mrp.production,state:0
@@ -2091,7 +2216,7 @@ msgstr "Költségszerkezet"
#. module: mrp
#: selection:mrp.product.produce,mode:0
msgid "Consume & Produce"
-msgstr ""
+msgstr "Felhasználás és gyártás"
#. module: mrp
#: selection:mrp.production.order,month:0
@@ -2101,7 +2226,7 @@ msgstr "November"
#. module: mrp
#: field:mrp.bom,bom_id:0
msgid "Parent BoM"
-msgstr ""
+msgstr "Fölérendelt anyagjegyzék"
#. module: mrp
#: model:ir.actions.act_window,help:mrp.mrp_bom_form_action2
@@ -2110,6 +2235,9 @@ msgid ""
"master bills of materials. Use this menu to search in which BoM a specific "
"component is used."
msgstr ""
+"Az anyagjegyzék összetevők azok összetevők és altermékek, amelyek fő "
+"anyagjegyzékek létrehozására szolgálnak. Használja ezt a menüt annak "
+"megkeresésére, hogy egy speciális összetevőt mely anyagjegyzék használ."
#. module: mrp
#: selection:mrp.production.order,month:0
@@ -2119,10 +2247,10 @@ msgstr "Január"
#. module: mrp
#: model:process.node,note:mrp.process_node_stockproduct0
msgid "Product type is Stockable or Consumable."
-msgstr "A termék típusa készletezhető vagy felhasználható."
+msgstr "A termék típusa raktározható vagy felhasználható."
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -2140,7 +2268,7 @@ msgstr "Mennyiség kiválasztása"
#: model:ir.ui.menu,name:mrp.menu_mrp_bom_form_action
#: field:product.product,bom_ids:0
msgid "Bill of Materials"
-msgstr ""
+msgstr "Anyagjegyzékek"
#. module: mrp
#: help:mrp.routing.workcenter,routing_id:0
@@ -2153,7 +2281,7 @@ msgstr ""
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_bom_revision
msgid "Bill of Material Revision"
-msgstr ""
+msgstr "Anyagjegyzék felülvizsgálat"
#. module: mrp
#: view:mrp.routing.workcenter:0
@@ -2164,13 +2292,13 @@ msgstr "Általános információ"
#. module: mrp
#: view:mrp.production:0
msgid "Productions"
-msgstr "Gyártás"
+msgstr "Gyártások"
#. module: mrp
#: code:addons/mrp/report/price.py:194
#, python-format
msgid "Work Cost of "
-msgstr ""
+msgstr "Munkaköltsége "
#. module: mrp
#: help:mrp.workcenter,note:0
@@ -2189,7 +2317,7 @@ msgstr ""
#: view:mrp.routing:0
#: model:process.node,name:mrp.process_node_routing0
msgid "Routing"
-msgstr ""
+msgstr "Gyártási eljárás"
#. module: mrp
#: field:mrp.installer,mrp_operations:0
@@ -2204,7 +2332,7 @@ msgstr "Tervezett dátum"
#. module: mrp
#: constraint:stock.move:0
msgid "You must assign a production lot for this product"
-msgstr ""
+msgstr "Rendeljen hozzá egy gyártási tételt ehhez a termékhez!"
#. module: mrp
#: model:ir.actions.act_window,help:mrp.mrp_property_action
@@ -2215,6 +2343,12 @@ msgid ""
"sales person creates a sales order, he can relate it to several properties "
"and OpenERP will automatically select the BoM to use according the the needs."
msgstr ""
+"A Tulajdonságok az OpenERP-ben arra szolgál, hogy kiválassza a megfelelő "
+"anyagjegyzéket egy termék gyártásához, amikor különböző módokon is "
+"gyárthatja ugyanazt a terméket. Számos tulajdonságot hozzárendelhet minden "
+"egyes anyagjegyzékhez. Amikor egy értékesítő létrehoz egy értékesítési "
+"megbízást, összekapcsolhatja azt számos tulajdonsággal, és az OpenERP "
+"automatikusan kiválasztja a megfelelő anyagjegyzéket az igények alapján."
#. module: mrp
#: view:mrp.production.order:0
@@ -2225,12 +2359,12 @@ msgstr "Gyártás"
#. module: mrp
#: view:board.board:0
msgid "Procurements in Exception"
-msgstr ""
+msgstr "Hibás beszerzések"
#. module: mrp
#: model:process.transition,name:mrp.process_transition_minimumstockprocure0
msgid "'Minimum stock rule' material"
-msgstr ""
+msgstr "\"Minimális készlet szabály\" tárgya"
#. module: mrp
#: model:ir.model,name:mrp.model_mrp_product_price
@@ -2240,7 +2374,7 @@ msgstr "Termék ára"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.action_mrp_installer
msgid "MRP Applications Configuration"
-msgstr ""
+msgstr "Gyártási modul alkalmazások beállítása"
#. module: mrp
#: model:ir.model,name:mrp.model_stock_move_split
@@ -2250,13 +2384,13 @@ msgstr "Gyártási tételek részekre osztása"
#. module: mrp
#: view:change.production.qty:0
msgid "Change Quantity"
-msgstr ""
+msgstr "Mennyiség változtatása"
#. module: mrp
#: view:change.production.qty:0
#: model:ir.actions.act_window,name:mrp.action_change_production_qty
msgid "Change Product Qty"
-msgstr ""
+msgstr "Mennyiség változtatása"
#. module: mrp
#: view:mrp.bom.revision:0
@@ -2279,7 +2413,7 @@ msgstr "Május"
#. module: mrp
#: view:board.board:0
msgid "Manufacturing board"
-msgstr ""
+msgstr "Gyártás áttekintő"
#. module: mrp
#: field:mrp.production,date_planned_end:0
@@ -2293,6 +2427,9 @@ msgid ""
"specified period. It is expressed in number of hours and machine related "
"cycles."
msgstr ""
+"A munkaállomások terheltsége menü ad egy előrejelzést a munkaállomások "
+"terheltségéről egy megadott időszakban. Ez óraszámokban és géphez kapcsolt "
+"ciklusokban kerül kifejezésre."
#. module: mrp
#: model:process.node,note:mrp.process_node_procureproducts0
@@ -2318,7 +2455,7 @@ msgstr "Február"
#: model:ir.actions.act_window,name:mrp.mrp_property_group_action
#: model:ir.ui.menu,name:mrp.menu_mrp_property_group_action
msgid "Property Groups"
-msgstr ""
+msgstr "Tulajdonság-csoportok"
#. module: mrp
#: selection:mrp.production.order,month:0
@@ -2331,16 +2468,19 @@ msgid ""
"Depending on the chosen method to supply the stockable products, the "
"procurement order creates a RFQ, a production order, ... "
msgstr ""
+"Függően a raktározható termékek ellátásra kiválasztott módszertől a "
+"beszerzési megrendelés létrehoz egy ajánlatkérést, egy gyártási "
+"rendelést,... "
#. module: mrp
#: help:mrp.workcenter,time_stop:0
msgid "Time in hours for the cleaning."
-msgstr ""
+msgstr "A tisztítás ideje (órákban)."
#. module: mrp
#: model:process.transition,name:mrp.process_transition_purchaseprocure0
msgid "Automatic RFQ"
-msgstr ""
+msgstr "Automatikus ajánlatkérés"
#. module: mrp
#: model:process.transition,note:mrp.process_transition_servicemto0
@@ -2348,6 +2488,8 @@ msgid ""
"If the service has a 'Produce' supply method, this creates a task in the "
"project management module of OpenERP."
msgstr ""
+"Ha a szolgáltatás ellátási módszere \"Gyártás\", a rendszer feladatokat hoz "
+"létre az OpenERP projektmenedzsment moduljában."
#. module: mrp
#: model:process.transition,note:mrp.process_transition_productionprocureproducts0
@@ -2356,6 +2498,9 @@ msgid ""
"production order creates as much procurement orders as components listed in "
"the BOM, through a run of the schedulers (MRP)."
msgstr ""
+"Az alapanyagok ellátása érdekében (lehet beszerzés vagy gyártás útján), a "
+"gyártási rendelés létrehoz annyi további gyártási rendelést, amennyi "
+"összetevő az anyagjegyzékben van, az ütemező futtatásán keresztül."
#. module: mrp
#: help:mrp.product_price,number:0
@@ -2363,11 +2508,13 @@ msgid ""
"Specify quantity of products to produce or buy. Report of Cost structure "
"will be displayed base on this quantity."
msgstr ""
+"Speciális termékmennyiség gyártásra vagy vásárlásra. A költségstruktúra "
+"riport e mennyiség alapján lesz kiállítva."
#. module: mrp
#: selection:mrp.bom,method:0
msgid "On Stock"
-msgstr "Készletre"
+msgstr "Raktáron"
#. module: mrp
#: field:mrp.bom,sequence:0
@@ -2380,12 +2527,12 @@ msgstr "Sorszám"
#. module: mrp
#: model:ir.ui.menu,name:mrp.menu_view_resource_calendar_leaves_search_mrp
msgid "Resource Leaves"
-msgstr ""
+msgstr "Erőforrás leadás"
#. module: mrp
#: help:mrp.bom,sequence:0
msgid "Gives the sequence order when displaying a list of bills of material."
-msgstr ""
+msgstr "Megadja a sorrendet, amikor az anyagjegyzékek listáját kiállítjuk."
#. module: mrp
#: view:mrp.production:0
@@ -2400,3 +2547,116 @@ msgstr "Felhasználandó termékek"
#: field:mrp.production.order,year:0
msgid "Year"
msgstr "Év"
+
+#~ msgid "Specify Cost of Work center per cycle."
+#~ msgstr "Adja meg a munkaállomás egy ciklusra számított költségét."
+
+#~ msgid "Workcenter Usage"
+#~ msgstr "Munkaállomás kihasználtsága"
+
+#~ msgid ""
+#~ "Number of operations this work center can do in parallel. If this work "
+#~ "center represents a team of 5 workers, the capacity per cycle is 5."
+#~ msgstr ""
+#~ "Műveletek száma, amelyeket a megadott munkaállomás párhuzamosan tud végezni. "
+#~ "Ha ez a munkaállomás 5 munka munkavállalóból álló csoportot jelent, akkor a "
+#~ "ciklusonkénti kapacitás 5."
+
+#~ msgid ""
+#~ "\n"
+#~ " This is the base module to manage the manufacturing process in OpenERP.\n"
+#~ "\n"
+#~ " Features:\n"
+#~ " * Make to Stock / Make to Order (by line)\n"
+#~ " * Multi-level BoMs, no limit\n"
+#~ " * Multi-level routing, no limit\n"
+#~ " * Routing and work center integrated with analytic accounting\n"
+#~ " * Scheduler computation periodically / Just In Time module\n"
+#~ " * Multi-pos, multi-warehouse\n"
+#~ " * Different reordering policies\n"
+#~ " * Cost method by product: standard price, average price\n"
+#~ " * Easy analysis of troubles or needs\n"
+#~ " * Very flexible\n"
+#~ " * Allows to browse Bill of Materials in complete structure\n"
+#~ " that include child and phantom BoMs\n"
+#~ " It supports complete integration and planification of stockable goods,\n"
+#~ " consumable of services. Services are completely integrated with the "
+#~ "rest\n"
+#~ " of the software. For instance, you can set up a sub-contracting service\n"
+#~ " in a BoM to automatically purchase on order the assembly of your "
+#~ "production.\n"
+#~ "\n"
+#~ " Reports provided by this module:\n"
+#~ " * Bill of Material structure and components\n"
+#~ " * Load forecast on workcenters\n"
+#~ " * Print a production order\n"
+#~ " * Stock forecasts\n"
+#~ " Dashboard provided by this module::\n"
+#~ " * List of next production orders\n"
+#~ " * List of deliveries (out picking)\n"
+#~ " * Graph of work center load\n"
+#~ " * List of procurement in exception\n"
+#~ " "
+#~ msgstr ""
+#~ "\n"
+#~ " Ez az alapmodul az OpenERP-ben a gyártási folyamatok kezelésére. \n"
+#~ "\n"
+#~ " Funkciók:\n"
+#~ " * Beszerzés raktárból és beszerzés megrendelésből (soronként "
+#~ "különbözően)\n"
+#~ " * Többszintű anyagjegyzékek (nincs korlátozás)\n"
+#~ " * Többszintű eljárások (nincs korlátozás)\n"
+#~ " * Gyártási eljárás és munkaállomás integráció az analitikus "
+#~ "könyveléssel\n"
+#~ " * Ütemező számítások periódikusan / Just In Time modul\n"
+#~ " * Több értékesítési hely, több raktár kezelése\n"
+#~ " * Különböző újrarendező eljárások\n"
+#~ " * Különböző költségkalkulációk termékenként: elszámoló ár, átlagár\n"
+#~ " * Könnyen kezelhető szükséglet felmérés és hiba felmérés\n"
+#~ " * Nagyon rugalmas\n"
+#~ " * Lehetővé teszi, hogy az anyagjegyzékeket a teljes struktúrájukban "
+#~ "böngésszük,\n"
+#~ " amely magába foglalja az alárendelt és fölérendelt anyagjegyzékeket "
+#~ "is.\n"
+#~ " Támogatja a raktározható áruk és a fogyasztható szolgáltatások teljes "
+#~ "integrációját\n"
+#~ " és a velük való tervezést. A szolgáltatások nem teljesen integráltak\n"
+#~ " a szoftver többi részével. Létrehozhat például egy alárendelt "
+#~ "szolgáltatást \n"
+#~ " egy anyagjegyzékben, hogy automatikusan beszerezze rendelésre a "
+#~ "gyártásának tételeit.\n"
+#~ "\n"
+#~ " A modul által nyújtott riportok:\n"
+#~ " * Anyagjegyzék struktúra és összetevők\n"
+#~ " * Munkaállomások terheltségének előrejelzése\n"
+#~ " * Gyártási rendelés nyomtatása\n"
+#~ " * Raktár előrejelzések\n"
+#~ "\n"
+#~ " A modul által nyújtott vezérlőpultok:\n"
+#~ " * Következő gyártási rendelések listája\n"
+#~ " * Szállítások listája\n"
+#~ " * Grafikon a munkaállomás terheltségéről\n"
+#~ " * Beszerzési hibák listája\n"
+#~ " "
+
+#~ msgid ""
+#~ "This is the internal picking list that brings the finished product to the "
+#~ "production plan"
+#~ msgstr ""
+#~ "Ez a belső kiszedési lista, ami a késztermékeket a termelés tervbe viszi"
+
+#~ msgid ""
+#~ "Routing indicates all the workcenters used, for how long and/or cycles.If "
+#~ "Routing is indicated then,the third tab of a production order (workcenters) "
+#~ "will be automatically pre-completed."
+#~ msgstr ""
+#~ "A gyártási eljárás jelzi, hogy az összes munkaállomás milyen hosszan és/vagy "
+#~ "hány ciklusra van használatban. Ha a gyártási eljárás be van kapcsolva, a "
+#~ "gyártási rendelés 3. füle (munkaállomások) automatikusan kitöltésre kerül."
+
+#~ msgid ""
+#~ "Description of the work center. Explain here what's a cycle according to "
+#~ "this work center."
+#~ msgstr ""
+#~ "Munkaállomás leírása. Elmagyarázásra kerül itt, hogy mit jelent egy ciklus a "
+#~ "munkaállomás összefüggésében."
diff --git a/addons/mrp/i18n/id.po b/addons/mrp/i18n/id.po
index f59cf77019d..7741a302045 100644
--- a/addons/mrp/i18n/id.po
+++ b/addons/mrp/i18n/id.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:54+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:50+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
#. module: mrp
#: field:mrp.production,move_created_ids:0
@@ -715,7 +715,7 @@ msgid "Per month"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -728,7 +728,7 @@ msgid "Product Name"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr ""
@@ -1240,7 +1240,7 @@ msgstr ""
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
@@ -1294,7 +1294,7 @@ msgid "Month -1"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr ""
@@ -1305,7 +1305,7 @@ msgid "Production Order N° :"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr ""
@@ -1534,7 +1534,7 @@ msgid "Manufacturing Orders To Start"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr ""
@@ -1624,7 +1624,7 @@ msgid "Production Analysis"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr ""
@@ -2113,7 +2113,7 @@ msgid "Product type is Stockable or Consumable."
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
diff --git a/addons/mrp/i18n/it.po b/addons/mrp/i18n/it.po
index 3b238fffc78..8cddef0977b 100644
--- a/addons/mrp/i18n/it.po
+++ b/addons/mrp/i18n/it.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2011-01-17 09:33+0000\n"
+"PO-Revision-Date: 2011-12-06 10:31+0000\n"
"Last-Translator: Davide Corio - agilebg.com \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:54+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:50+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
#. module: mrp
#: field:mrp.production,move_created_ids:0
@@ -763,7 +763,7 @@ msgid "Per month"
msgstr "Mensile"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -776,7 +776,7 @@ msgid "Product Name"
msgstr "Descrizione Prodotto"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr "Azione non valida !"
@@ -1316,7 +1316,7 @@ msgstr "Ubicazione dove il sistema stoccherà i prodotti finiti"
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
"Questa è la lista dei prelievi interni necessari per la pianificazione della "
@@ -1375,7 +1375,7 @@ msgid "Month -1"
msgstr "Mese -1"
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr "L'ordine di produzione '%s' è pianificato per il %s."
@@ -1386,7 +1386,7 @@ msgid "Production Order N° :"
msgstr "Ordine di produzione N° :"
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr "L'ordine di produzione '%s' è pronto per essere eseguito."
@@ -1627,7 +1627,7 @@ msgid "Manufacturing Orders To Start"
msgstr "Ordini di Produzione da Eseguire"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr ""
@@ -1721,7 +1721,7 @@ msgid "Production Analysis"
msgstr "Analisi della produzione"
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr "Copia"
@@ -2252,7 +2252,7 @@ msgid "Product type is Stockable or Consumable."
msgstr "Il tipo prodotto è Stoccabile o Consumabile"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -3255,6 +3255,13 @@ msgstr "Anno"
#~ "Se questo centro di lavoro rappresenta un team di 5 operai, la capacità per "
#~ "ciclo sarà 5."
+#~ msgid ""
+#~ "This is the internal picking list that brings the finished product to the "
+#~ "production plan"
+#~ msgstr ""
+#~ "Questa è la lista dei prelievi interni necessari per la pianificazione della "
+#~ "produzione del prodotto finito"
+
#~ msgid ""
#~ "Description of the work center. Explain here what's a cycle according to "
#~ "this work center."
diff --git a/addons/mrp/i18n/ko.po b/addons/mrp/i18n/ko.po
index 3fbc4c82d4c..92e42f8f80d 100644
--- a/addons/mrp/i18n/ko.po
+++ b/addons/mrp/i18n/ko.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2010-11-27 12:18+0000\n"
+"PO-Revision-Date: 2011-12-06 11:08+0000\n"
"Last-Translator: qdp (OpenERP) \n"
"Language-Team: Korean \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:54+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:50+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
#. module: mrp
#: field:mrp.production,move_created_ids:0
@@ -718,7 +718,7 @@ msgid "Per month"
msgstr "월별"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -731,7 +731,7 @@ msgid "Product Name"
msgstr "상품 이름"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr "유효하지 않은 액션 !"
@@ -1243,7 +1243,7 @@ msgstr "완제품을 보관할 시스템의 위치"
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
@@ -1297,7 +1297,7 @@ msgid "Month -1"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr ""
@@ -1308,7 +1308,7 @@ msgid "Production Order N° :"
msgstr "생산 주문 번호:"
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr ""
@@ -1537,7 +1537,7 @@ msgid "Manufacturing Orders To Start"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr ""
@@ -1627,7 +1627,7 @@ msgid "Production Analysis"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr ""
@@ -2116,7 +2116,7 @@ msgid "Product type is Stockable or Consumable."
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
diff --git a/addons/mrp/i18n/lt.po b/addons/mrp/i18n/lt.po
index 44665d98443..4c776d8c9fc 100644
--- a/addons/mrp/i18n/lt.po
+++ b/addons/mrp/i18n/lt.po
@@ -7,15 +7,15 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2010-07-20 22:46+0000\n"
+"PO-Revision-Date: 2011-12-06 10:26+0000\n"
"Last-Translator: Giedrius Slavinskas - inovera.lt "
"\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-11-05 04:54+0000\n"
-"X-Generator: Launchpad (build 14231)\n"
+"X-Launchpad-Export-Date: 2011-12-07 04:51+0000\n"
+"X-Generator: Launchpad (build 14435)\n"
"Language: lt\n"
#. module: mrp
@@ -722,7 +722,7 @@ msgid "Per month"
msgstr "Per mėnesį"
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
@@ -735,7 +735,7 @@ msgid "Product Name"
msgstr "Produkto pavadinimas"
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Invalid action !"
msgstr "Neleistinas veiksmas!"
@@ -1247,7 +1247,7 @@ msgstr "Vieta, kurioje talpinami pabaigti produktai ."
#. module: mrp
#: help:mrp.production,picking_id:0
msgid ""
-"This is the internal picking list that brings the finished product to the "
+"This is the Internal Picking List that brings the finished product to the "
"production plan"
msgstr ""
@@ -1301,7 +1301,7 @@ msgid "Month -1"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:924
+#: code:addons/mrp/mrp.py:914
#, python-format
msgid "Manufacturing order '%s' is scheduled for the %s."
msgstr ""
@@ -1312,7 +1312,7 @@ msgid "Production Order N° :"
msgstr "Gamybos užsakymo Nr. :"
#. module: mrp
-#: code:addons/mrp/mrp.py:640
+#: code:addons/mrp/mrp.py:630
#, python-format
msgid "Manufacturing order '%s' is ready to produce."
msgstr ""
@@ -1541,7 +1541,7 @@ msgid "Manufacturing Orders To Start"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:495
+#: code:addons/mrp/mrp.py:491
#, python-format
msgid "Cannot delete Production Order(s) which are in %s State!"
msgstr ""
@@ -1631,7 +1631,7 @@ msgid "Production Analysis"
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:349
+#: code:addons/mrp/mrp.py:345
#, python-format
msgid "Copy"
msgstr ""
@@ -2121,7 +2121,7 @@ msgid "Product type is Stockable or Consumable."
msgstr ""
#. module: mrp
-#: code:addons/mrp/mrp.py:595
+#: code:addons/mrp/mrp.py:591
#: code:addons/mrp/wizard/change_production_qty.py:77
#: code:addons/mrp/wizard/change_production_qty.py:82
#, python-format
diff --git a/addons/mrp/i18n/mrp.pot b/addons/mrp/i18n/mrp.pot
index 25a8bea531d..937fd9f45c4 100644
--- a/addons/mrp/i18n/mrp.pot
+++ b/addons/mrp/i18n/mrp.pot
@@ -1165,7 +1165,7 @@ msgstr ""
#. module: mrp
#: help:mrp.production,picking_id:0
-msgid "This is the internal picking list that brings the finished product to the production plan"
+msgid "This is the Internal Picking List that brings the finished product to the production plan"
msgstr ""
#. module: mrp
diff --git a/addons/mrp/i18n/nb.po b/addons/mrp/i18n/nb.po
index 2bd9cc375b1..efa8612a315 100644
--- a/addons/mrp/i18n/nb.po
+++ b/addons/mrp/i18n/nb.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2011-01-30 22:16+0000\n"
-"Last-Translator: FULL NAME \n"
+"PO-Revision-Date: 2011-12-06 11:04+0000\n"
+"Last-Translator: Fabien (Open ERP) \n"
"Language-Team: Norwegian Bokmal