openerp-community-reviewer team mailing list archive
-
openerp-community-reviewer team
-
Mailing list archive
-
Message #05655
[Merge] lp:~numerigraphe-team/ocb-addons/7.0-stock-tests-backport into lp:ocb-addons
Lionel Sausin - Numérigraphe has proposed merging lp:~numerigraphe-team/ocb-addons/7.0-stock-tests-backport into lp:ocb-addons.
Requested reviews:
OpenERP Community Backports Team (ocb)
For more details, see:
https://code.launchpad.net/~numerigraphe-team/ocb-addons/7.0-stock-tests-backport/+merge/214234
Backport of the tests for the modules stock, mrp and mrp_operations as of 2013-03-14.
The tests were removed some time before v7.0 for lack of time to fix them.
Luckily they were fixed on the trunk soon after 7.0 was released so a backport is possible, but had not been done yet.
This is the same branch proposed to the official v7.0:
https://code.launchpad.net/~numerigraphe-team/openobject-addons/7.0-stock-tests-backport/+merge/214231
This branch runs green on runbot:
http://runbot.openerp.com/numerigraphe-team-7-0-stock-tests-backport-32768/logs/
--
https://code.launchpad.net/~numerigraphe-team/ocb-addons/7.0-stock-tests-backport/+merge/214234
Your team OpenERP Community Backports Team is requested to review the proposed merge of lp:~numerigraphe-team/ocb-addons/7.0-stock-tests-backport into lp:ocb-addons.
=== modified file 'account_asset/i18n/sv.po'
--- account_asset/i18n/sv.po 2014-03-28 06:44:40 +0000
+++ account_asset/i18n/sv.po 2014-04-04 13:10:02 +0000
@@ -8,14 +8,14 @@
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2014-03-27 12:09+0000\n"
+"PO-Revision-Date: 2014-04-03 22:23+0000\n"
"Last-Translator: Anders Wallenquist <anders.wallenquist@xxxxxxxxx>\n"
"Language-Team: Swedish <sv@xxxxxx>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-28 06:44+0000\n"
-"X-Generator: Launchpad (build 16967)\n"
+"X-Launchpad-Export-Date: 2014-04-04 07:07+0000\n"
+"X-Generator: Launchpad (build 16976)\n"
#. module: account_asset
#: view:account.asset.asset:0
@@ -440,12 +440,17 @@
"You can manually close an asset when the depreciation is over. If the last "
"line of depreciation is posted, the asset automatically goes in that status."
msgstr ""
+"När en inventarie har skapats, är statusen \"Utkast\".\n"
+"Om inventarien är bekräftad, går status i \"Aktiv\" och avskrivningslraderna "
+"kan postas i redovisningen.\n"
+"Du kan stänga manuellt en inventarie när avskrivningen är över. Om den sista "
+"raden i avskrivning postas, går tillgången automatiskt i denna status."
#. module: account_asset
#: field:account.asset.asset,state:0
#: field:asset.asset.report,state:0
msgid "Status"
-msgstr ""
+msgstr "Status"
#. module: account_asset
#: field:account.asset.asset,partner_id:0
@@ -492,7 +497,7 @@
#. module: account_asset
#: view:account.asset.history:0
msgid "Asset History"
-msgstr ""
+msgstr "Inventariehistorik"
#. module: account_asset
#: model:ir.model,name:account_asset.model_asset_depreciation_confirmation_wizard
@@ -605,6 +610,7 @@
#, python-format
msgid "You cannot delete an asset that contains posted depreciation lines."
msgstr ""
+"Du kan inte ta bort en inventarie som innehåller bokförda avskrivningsrader."
#. module: account_asset
#: view:account.asset.category:0
@@ -614,12 +620,12 @@
#. module: account_asset
#: field:account.asset.depreciation.line,amount:0
msgid "Current Depreciation"
-msgstr ""
+msgstr "Aktuell avskrivningsgrad"
#. module: account_asset
#: field:account.asset.asset,name:0
msgid "Asset Name"
-msgstr ""
+msgstr "Inventarienamn"
#. module: account_asset
#: field:account.asset.category,open_asset:0
@@ -679,6 +685,14 @@
" </p>\n"
" "
msgstr ""
+"<p>\n"
+" Ur denna rapport kan du få en överblick på alla avskrivningar. "
+"Den\n"
+" verktygsökning kan också användas för att anpassa dina "
+"inventarierapporter och\n"
+" så, matcha denna analys till dina behov;\n"
+" </ p>\n"
+" "
#. module: account_asset
#: field:account.asset.asset,purchase_value:0
@@ -736,7 +750,7 @@
#. module: account_asset
#: field:account.asset.depreciation.line,sequence:0
msgid "Sequence"
-msgstr ""
+msgstr "Nummerserie"
#. module: account_asset
#: help:account.asset.category,method_period:0
=== modified file 'delivery/i18n/sv.po'
--- delivery/i18n/sv.po 2014-04-01 06:53:25 +0000
+++ delivery/i18n/sv.po 2014-04-04 13:10:02 +0000
@@ -8,14 +8,14 @@
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2014-03-31 16:57+0000\n"
+"PO-Revision-Date: 2014-04-03 10:23+0000\n"
"Last-Translator: Anders Wallenquist <anders.wallenquist@xxxxxxxxx>\n"
"Language-Team: Swedish <sv@xxxxxx>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-01 06:52+0000\n"
-"X-Generator: Launchpad (build 16967)\n"
+"X-Launchpad-Export-Date: 2014-04-04 07:07+0000\n"
+"X-Generator: Launchpad (build 16976)\n"
#. module: delivery
#: report:sale.shipping:0
@@ -30,7 +30,7 @@
#. module: delivery
#: view:delivery.grid.line:0
msgid " in Function of "
-msgstr ""
+msgstr " är en funktion av "
#. module: delivery
#: view:delivery.carrier:0
@@ -93,6 +93,8 @@
#, python-format
msgid "No line matched this product or order in the chosen delivery grid."
msgstr ""
+"Ingen rad matchade denna produkt eller order inom det valda "
+"leveranskombinationen."
#. module: delivery
#: model:ir.actions.act_window,name:delivery.action_picking_tree4
@@ -132,6 +134,19 @@
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klicka för att skapa en leveransprislista för en viss "
+"region.\n"
+" </p><p>\n"
+" Med leveransprislistan kan du beräkna kostnaden och\n"
+" försäljningspriset för leveransen baserat på produkternas "
+"vikt\n"
+" och andra kriterier. Du kan definiera flera prislistor\n"
+" för varje leveransmetod: per land eller ett område i ett "
+"visst\n"
+" land som definieras av ett postnummerområde.\n"
+" </p>\n"
+" "
#. module: delivery
#: report:sale.shipping:0
@@ -151,7 +166,7 @@
#. module: delivery
#: view:sale.order:0
msgid "Add in Quote"
-msgstr ""
+msgstr "Lägg till på offert"
#. module: delivery
#: selection:delivery.grid.line,price_type:0
@@ -232,6 +247,8 @@
"If you don't 'Add in Quote', the exact price will be computed when invoicing "
"based on delivery order(s)."
msgstr ""
+"Om du inte \"Lägg i offert\", kommer det exakta priset beräknas vid "
+"fakturering baserad på leveransordern."
#. module: delivery
#: field:delivery.carrier,partner_id:0
@@ -276,7 +293,7 @@
#. module: delivery
#: field:delivery.carrier,free_if_more_than:0
msgid "Free If Order Total Amount Is More Than"
-msgstr ""
+msgstr "Fritt vid ordertotal över"
#. module: delivery
#: field:delivery.grid.line,grid_id:0
@@ -432,6 +449,21 @@
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klicka för att definiera en ny leveransmetod.\n"
+" </p>\n"
+" Varje transportör (t.ex. UPS) kan ha flera leveransmetoder "
+"(t.ex.\n"
+" UPS Express, UPS Standard) med en uppsättning av "
+"prissättningsregler knuten\n"
+" till varje metod.\n"
+" </p><p>\n"
+" Dessa metoder gör det möjligt att automatiskt beräkna "
+"leveranspriset\n"
+" enligt dina inställningar; på kundordern (baserat på\n"
+" offert) eller faktura (baserat på leveransorder).\n"
+" </p>\n"
+" "
#. module: delivery
#: field:delivery.grid.line,max_value:0
@@ -465,7 +497,7 @@
#. module: delivery
#: model:ir.model,name:delivery.model_stock_picking_in
msgid "Incoming Shipments"
-msgstr ""
+msgstr "Inkommande leveranser"
#. module: delivery
#: selection:delivery.grid.line,operator:0
@@ -475,7 +507,7 @@
#. module: delivery
#: help:stock.picking,weight_uom_id:0
msgid "Unit of measurement for Weight"
-msgstr ""
+msgstr "Viktsenhet"
#. module: delivery
#: report:sale.shipping:0
@@ -550,7 +582,7 @@
#: model:ir.actions.act_window,name:delivery.action_delivery_carrier_form
#: model:ir.ui.menu,name:delivery.menu_action_delivery_carrier_form
msgid "Delivery Methods"
-msgstr ""
+msgstr "Leveransmetoder"
#. module: delivery
#: code:addons/delivery/sale.py:57
@@ -577,7 +609,7 @@
#. module: delivery
#: view:stock.picking.out:0
msgid "Print Delivery Order"
-msgstr ""
+msgstr "Skriv ut leveransorder"
#. module: delivery
#: view:delivery.grid:0
@@ -589,7 +621,7 @@
#: help:stock.move,weight_uom_id:0
msgid ""
"Unit of Measure (Unit of Measure) is the unit of measurement for Weight"
-msgstr ""
+msgstr "Enhet är måttenheten för vikt"
#. module: delivery
#: field:delivery.grid.line,price_type:0
=== modified file 'hr/i18n/sv.po'
--- hr/i18n/sv.po 2014-04-03 06:02:13 +0000
+++ hr/i18n/sv.po 2014-04-04 13:10:02 +0000
@@ -8,14 +8,14 @@
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2014-04-02 13:01+0000\n"
+"PO-Revision-Date: 2014-04-04 06:48+0000\n"
"Last-Translator: Anders Wallenquist <anders.wallenquist@xxxxxxxxx>\n"
"Language-Team: Swedish <sv@xxxxxx>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-03 06:01+0000\n"
-"X-Generator: Launchpad (build 16967)\n"
+"X-Launchpad-Export-Date: 2014-04-04 07:07+0000\n"
+"X-Generator: Launchpad (build 16976)\n"
#. module: hr
#: model:process.node,name:hr.process_node_openerpuser0
@@ -169,7 +169,7 @@
#: model:ir.actions.act_window,name:hr.open_view_categ_form
#: model:ir.ui.menu,name:hr.menu_view_employee_category_form
msgid "Employee Tags"
-msgstr "Etiketter på anställda"
+msgstr "Medarbetaretiketter"
#. module: hr
#: view:hr.job:0
=== modified file 'hr_attendance/i18n/sv.po'
--- hr_attendance/i18n/sv.po 2014-03-24 09:12:54 +0000
+++ hr_attendance/i18n/sv.po 2014-04-04 13:10:02 +0000
@@ -8,19 +8,19 @@
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2013-06-07 19:37+0000\n"
-"PO-Revision-Date: 2014-03-19 07:45+0000\n"
+"PO-Revision-Date: 2014-04-04 06:54+0000\n"
"Last-Translator: Anders Wallenquist <anders.wallenquist@xxxxxxxxx>\n"
"Language-Team: Swedish <sv@xxxxxx>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-20 06:19+0000\n"
-"X-Generator: Launchpad (build 16967)\n"
+"X-Launchpad-Export-Date: 2014-04-04 07:07+0000\n"
+"X-Generator: Launchpad (build 16976)\n"
#. module: hr_attendance
#: model:ir.model,name:hr_attendance.model_hr_attendance_month
msgid "Print Monthly Attendance Report"
-msgstr "Skriv månatlig närvarorapport"
+msgstr ""
#. module: hr_attendance
#: view:hr.attendance:0
@@ -37,7 +37,7 @@
#: field:hr.employee,state:0
#: model:ir.model,name:hr_attendance.model_hr_attendance
msgid "Attendance"
-msgstr "Närvarande"
+msgstr "Närvaro"
#. module: hr_attendance
#. openerp-web
@@ -56,14 +56,15 @@
#. module: hr_attendance
#: help:hr.action.reason,name:0
msgid "Specifies the reason for Signing In/Signing Out."
-msgstr "Ange in/utloggningsorsak"
+msgstr "Ange in/utstämplingsorsak"
#. module: hr_attendance
#: report:report.hr.timesheet.attendance.error:0
msgid ""
"(*) A positive delay means that the employee worked less than recorded."
msgstr ""
-"(*) A positive delay means that the employee worked less than recorded."
+"(*) Ett positiv uppehåll innebär att den anställde arbetat mindre än "
+"registrerat."
#. module: hr_attendance
#: view:hr.attendance.month:0
@@ -127,7 +128,7 @@
#: field:hr.attendance,employee_id:0
#: model:ir.model,name:hr_attendance.model_hr_employee
msgid "Employee"
-msgstr "Anställd"
+msgstr "Medarbetare"
#. module: hr_attendance
#: field:hr.attendance.month,month:0
@@ -179,7 +180,7 @@
#. module: hr_attendance
#: help:hr.config.settings,group_hr_attendance:0
msgid "Allocates attendance group to all users."
-msgstr ""
+msgstr "Tilldela närvarogrupp till alla användare."
#. module: hr_attendance
#: view:hr.attendance:0
@@ -220,7 +221,7 @@
#. module: hr_attendance
#: view:hr.attendance.error:0
msgid "Print Attendance Report Error"
-msgstr "Skrivut delatagarrapportfel"
+msgstr "Skriv ut närvarorapportfel"
#. module: hr_attendance
#: model:ir.actions.act_window,help:hr_attendance.open_view_attendance
@@ -251,7 +252,7 @@
#. module: hr_attendance
#: field:hr.config.settings,group_hr_attendance:0
msgid "Track attendances for all employees"
-msgstr ""
+msgstr "Följ upp närvaro för alla anställda"
#. module: hr_attendance
#: selection:hr.attendance.month,month:0
@@ -309,7 +310,7 @@
#. module: hr_attendance
#: view:hr.action.reason:0
msgid "Define attendance reason"
-msgstr "Define attendance reason"
+msgstr "Defniera frånvarorsak"
#. module: hr_attendance
#: selection:hr.action.reason,action_type:0
@@ -367,7 +368,7 @@
#: model:ir.actions.act_window,name:hr_attendance.open_view_attendance_reason
#: model:ir.ui.menu,name:hr_attendance.menu_open_view_attendance_reason
msgid "Attendance Reasons"
-msgstr "Närvaro Orsaker"
+msgstr "Frånvaroorsaker"
#. module: hr_attendance
#: selection:hr.attendance.month,month:0
@@ -398,7 +399,7 @@
#. module: hr_attendance
#: view:hr.action.reason:0
msgid "Attendance reasons"
-msgstr "Närvaro orsaker"
+msgstr "Frånvaroorsaker"
#. module: hr_attendance
#: model:ir.model,name:hr_attendance.model_hr_attendance_week
@@ -434,6 +435,8 @@
"You tried to %s with a date anterior to another event !\n"
"Try to contact the HR Manager to correct attendances."
msgstr ""
+"Du försökte %s med ett datum som föregår en annan händelse!\n"
+"Försök att kontakta personalansvarig för att korrigera närvaro."
#. module: hr_attendance
#: selection:hr.attendance.month,month:0
=== modified file 'hr_expense/i18n/sv.po'
--- hr_expense/i18n/sv.po 2014-04-01 06:53:25 +0000
+++ hr_expense/i18n/sv.po 2014-04-04 13:10:02 +0000
@@ -8,20 +8,20 @@
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2014-03-31 17:01+0000\n"
+"PO-Revision-Date: 2014-04-04 06:12+0000\n"
"Last-Translator: Anders Wallenquist <anders.wallenquist@xxxxxxxxx>\n"
"Language-Team: Swedish <sv@xxxxxx>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-01 06:52+0000\n"
-"X-Generator: Launchpad (build 16967)\n"
+"X-Launchpad-Export-Date: 2014-04-04 07:07+0000\n"
+"X-Generator: Launchpad (build 16976)\n"
#. module: hr_expense
#: view:hr.expense.expense:0
#: model:process.node,name:hr_expense.process_node_confirmedexpenses0
msgid "Confirmed Expenses"
-msgstr "Bekräftade utgifter"
+msgstr "Bekräftade utlägg"
#. module: hr_expense
#: code:addons/hr_expense/hr_expense.py:349
@@ -181,7 +181,7 @@
#. module: hr_expense
#: view:hr.expense.report:0
msgid "Confirm Expenses"
-msgstr "Bekräfta utgifter"
+msgstr "Bekräfta utlägg"
#. module: hr_expense
#: selection:hr.expense.report,state:0
@@ -266,7 +266,7 @@
#. module: hr_expense
#: model:process.transition,name:hr_expense.process_transition_refuseexpense0
msgid "Refuse expense"
-msgstr "Avslagna utgifter"
+msgstr "Avslagna utlägg"
#. module: hr_expense
#: field:hr.expense.report,price_average:0
@@ -340,7 +340,7 @@
#: field:hr.expense.expense,employee_id:0
#: view:hr.expense.report:0
msgid "Employee"
-msgstr "Anställd"
+msgstr "Medarbetare"
#. module: hr_expense
#: view:hr.expense.expense:0
@@ -369,7 +369,7 @@
#: code:addons/hr_expense/hr_expense.py:238
#, python-format
msgid "The employee must have a home address."
-msgstr ""
+msgstr "Medarbetaren måste ha en hemadress"
#. module: hr_expense
#: view:board.board:0
@@ -386,7 +386,7 @@
#. module: hr_expense
#: model:ir.actions.report.xml,name:hr_expense.hr_expenses
msgid "HR expenses"
-msgstr "Personalutgifter"
+msgstr "Personalutlägg"
#. module: hr_expense
#: field:hr.expense.expense,id:0
@@ -447,7 +447,7 @@
#: code:addons/hr_expense/hr_expense.py:240
#, python-format
msgid "The employee must have a payable account set on his home address."
-msgstr ""
+msgstr "Den anställde måste ha ett utgiftskonto anslutet till sin hemadress"
#. module: hr_expense
#: view:hr.expense.report:0
@@ -502,7 +502,7 @@
#. module: hr_expense
#: field:hr.expense.expense,voucher_id:0
msgid "Employee's Receipt"
-msgstr ""
+msgstr "Medarbetarkvitto"
#. module: hr_expense
#: selection:hr.expense.expense,state:0
@@ -512,7 +512,7 @@
#. module: hr_expense
#: model:process.node,note:hr_expense.process_node_draftexpenses0
msgid "Employee encode all his expenses"
-msgstr "Anställd koda alla hans utgifter"
+msgstr "Medarbetare kodifierar alla sina utgifter"
#. module: hr_expense
#: view:hr.expense.expense:0
@@ -648,6 +648,17 @@
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klicka för att registrera nya utgifter.\n"
+" </p><p>\n"
+" OpenERP kommer att se till att hela processen följs; "
+"bekostnad\n"
+" Bladet är validerat av chef (s), har arbetstagaren "
+"ersättning\n"
+" utlägg sina utlägg, vissa utlägg måste återfaktureras\n"
+" kunder.\n"
+" </p>\n"
+" "
#. module: hr_expense
#: view:hr.expense.expense:0
@@ -677,7 +688,7 @@
#. module: hr_expense
#: model:product.template,name:hr_expense.car_travel_product_template
msgid "Car Travel Expenses"
-msgstr "Utgifter resor med bil"
+msgstr "Bilutlägg"
#. module: hr_expense
#: view:hr.expense.expense:0
@@ -692,12 +703,12 @@
#. module: hr_expense
#: model:process.node,note:hr_expense.process_node_confirmedexpenses0
msgid "The employee validates his expense sheet"
-msgstr "Den anställde bekräftar sin kostnadsblankett"
+msgstr "Medarbetaren granskar sin utläggsansökan"
#. module: hr_expense
#: view:hr.expense.expense:0
msgid "Expenses to Invoice"
-msgstr "Utgifter att fakturera"
+msgstr "Utlägg att fakturera"
#. module: hr_expense
#: model:process.node,name:hr_expense.process_node_supplierinvoice0
@@ -718,7 +729,7 @@
#. module: hr_expense
#: view:hr.expense.report:0
msgid "Approved Expenses"
-msgstr "Godkända utgifter"
+msgstr "Godkända utlägg"
#. module: hr_expense
#: report:hr.expense:0
@@ -883,7 +894,7 @@
#. module: hr_expense
#: field:hr.expense.report,employee_id:0
msgid "Employee's Name"
-msgstr "Anställds namn"
+msgstr "Medarbetarens namn"
#. module: hr_expense
#: view:hr.expense.report:0
@@ -964,7 +975,7 @@
#: model:ir.ui.menu,name:hr_expense.next_id_49
#: model:product.category,name:hr_expense.cat_expense
msgid "Expenses"
-msgstr "Utgifter"
+msgstr "Utlägg"
#. module: hr_expense
#: help:product.product,hr_expense_ok:0
=== modified file 'hr_holidays/i18n/sv.po'
--- hr_holidays/i18n/sv.po 2014-04-01 06:53:25 +0000
+++ hr_holidays/i18n/sv.po 2014-04-04 13:10:02 +0000
@@ -8,14 +8,14 @@
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2014-03-31 17:00+0000\n"
+"PO-Revision-Date: 2014-04-03 07:21+0000\n"
"Last-Translator: Anders Wallenquist <anders.wallenquist@xxxxxxxxx>\n"
"Language-Team: Swedish <sv@xxxxxx>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-01 06:52+0000\n"
-"X-Generator: Launchpad (build 16967)\n"
+"X-Launchpad-Export-Date: 2014-04-04 07:07+0000\n"
+"X-Generator: Launchpad (build 16976)\n"
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
@@ -39,6 +39,8 @@
"You cannot modify a leave request that has been approved. Contact a human "
"resource manager."
msgstr ""
+"Du kan inte ändra ett redan godkänt frånvaroönskemål. Kontakta "
+"personalansvarig."
#. module: hr_holidays
#: help:hr.holidays.status,remaining_leaves:0
@@ -75,7 +77,7 @@
#: model:ir.actions.act_window,name:hr_holidays.request_approve_allocation
#: model:ir.ui.menu,name:hr_holidays.menu_request_approve_allocation
msgid "Allocation Requests to Approve"
-msgstr ""
+msgstr "Frånvaroönskemål att godkänna"
#. module: hr_holidays
#: help:hr.holidays,category_id:0
@@ -112,12 +114,12 @@
#. module: hr_holidays
#: model:mail.message.subtype,description:hr_holidays.mt_holidays_refused
msgid "Request refused"
-msgstr ""
+msgstr "Önskemål tillbakavisat"
#. module: hr_holidays
#: field:hr.holidays,number_of_days_temp:0
msgid "Allocation"
-msgstr "Allokering"
+msgstr "Tilldelning"
#. module: hr_holidays
#: xsl:holidays.summary:0
@@ -132,7 +134,7 @@
#. module: hr_holidays
#: constraint:hr.holidays:0
msgid "You can not have 2 leaves that overlaps on same day!"
-msgstr ""
+msgstr "Du kan inte ha två ledigheter som överlappar samma dag!"
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
@@ -233,7 +235,7 @@
#. module: hr_holidays
#: help:hr.holidays,message_unread:0
msgid "If checked new messages require your attention."
-msgstr ""
+msgstr "Om ikryssad nya meddelanden som kräver din uppmärksamhet"
#. module: hr_holidays
#: field:hr.holidays.status,color_name:0
@@ -263,6 +265,8 @@
"Holds the Chatter summary (number of messages, ...). This summary is "
"directly in html format in order to be inserted in kanban views."
msgstr ""
+"Lagrar pladder-sammanfattning (antal meddelanden, ...). Denna sammanfattning "
+"presenteras i html-format för att kunna sättas in i kanban vyer."
#. module: hr_holidays
#: code:addons/hr_holidays/hr_holidays.py:249
@@ -283,12 +287,12 @@
#. module: hr_holidays
#: model:ir.actions.act_window,name:hr_holidays.act_hr_leave_request_to_meeting
msgid "Leave Meetings"
-msgstr ""
+msgstr "Frånvaromöten"
#. module: hr_holidays
#: model:hr.holidays.status,name:hr_holidays.holiday_status_cl
msgid "Legal Leaves 2013"
-msgstr ""
+msgstr "Lagstadgad ledighet 2013"
#. module: hr_holidays
#: selection:hr.holidays.summary.dept,holiday_type:0
@@ -322,7 +326,7 @@
#: view:hr.holidays.status:0
#: model:ir.actions.act_window,name:hr_holidays.open_view_holiday_status
msgid "Leave Types"
-msgstr ""
+msgstr "Frånvarotyper"
#. module: hr_holidays
#: field:hr.holidays.status,remaining_leaves:0
@@ -332,7 +336,7 @@
#. module: hr_holidays
#: field:hr.holidays,message_follower_ids:0
msgid "Followers"
-msgstr ""
+msgstr "Följare"
#. module: hr_holidays
#: model:ir.model,name:hr_holidays.model_hr_holidays_remaining_leaves_user
@@ -395,6 +399,10 @@
" \n"
"The status is 'Approved', when holiday request is approved by manager."
msgstr ""
+"Statusen är satt till \"att skicka in\", när en semesterbegäran skapas.\n"
+"Statusen är \"godkännd\", när semesterbegäran bekräftas av användaren.\n"
+"Statusen \"Avvisad\", när semestern begäran avslås av chef.\n"
+"Statusen \"Godkänd\", när semestern ansökan godkänns av chef."
#. module: hr_holidays
#: view:hr.holidays:0
@@ -417,10 +425,10 @@
"Funktionen bakom fältet 'Kvarvarande Semester' kan endast användas när det "
"bara finns en ledighetstyp med alternativet 'Tillåt att överskrida gränsen' "
"ej är markerad. (%s hittades). Annars är uppdateringen tvetydig eftersom vi "
-"inte kan besluta om vilken ledighetstyp uppdateringen måste göras för.\n"
-"Du kanske föredrar att använda de vanliga menyerna 'Ledighetsbegäran' och "
+"inte kan besluta om vilken ledighetstyp uppdateringen måste göras för. \n"
+"Du kanske föredrar att använda de klassiska menyer 'Ledighetsbegäran' och "
"'Tilldela Ledighet' som ligger i 'Personal \\ Frånvaro' för att hantera "
-"semesterdagar för de anställda, om konfigurationen inte tillåter att använda "
+"semesterdagar för de anställda om konfigurationen inte tillåter att använda "
"detta fält."
#. module: hr_holidays
@@ -436,7 +444,7 @@
#. module: hr_holidays
#: field:hr.holidays,category_id:0
msgid "Employee Tag"
-msgstr ""
+msgstr "Anställds etikett"
#. module: hr_holidays
#: field:hr.holidays.summary.employee,emp:0
@@ -460,6 +468,13 @@
" </p>\n"
" "
msgstr ""
+"<p>\n"
+" Du kan tilldela återstående lagstadgad ledighetför varje "
+"anställd, OpenERP\n"
+" kommer automatiskt att skapa och validera "
+"ledighetsförfrågningar.\n"
+" </p>\n"
+" "
#. module: hr_holidays
#: help:hr.holidays.status,categ_id:0
@@ -472,7 +487,7 @@
#: code:addons/hr_holidays/wizard/hr_holidays_summary_department.py:44
#, python-format
msgid "You have to select at least one Department. And try again."
-msgstr ""
+msgstr "Åtminstonde en avdelning måste vara vald, försök igen."
#. module: hr_holidays
#: field:hr.holidays,parent_id:0
@@ -492,7 +507,7 @@
#. module: hr_holidays
#: field:hr.holidays,message_unread:0
msgid "Unread Messages"
-msgstr ""
+msgstr "Olästa meddelanden"
#. module: hr_holidays
#: view:hr.holidays:0
@@ -524,7 +539,7 @@
#: view:hr.holidays.summary.dept:0
#: view:hr.holidays.summary.employee:0
msgid "or"
-msgstr ""
+msgstr "eller"
#. module: hr_holidays
#: model:ir.actions.act_window,help:hr_holidays.open_ask_holidays
@@ -539,6 +554,16 @@
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klicka för att skapa en ny ledighetsbegäran.\n"
+" </p><p>\n"
+" När du har spelat in din ledighetsförfrågan, skickas det\n"
+" till en chef för validering. Se till att ställa rätt "
+"frånvarotyp\n"
+" typ (återhämtning, helgdagar, sjukdom) och den exakta\n"
+" antal öppna dagar relaterade till din frånvaro.\n"
+" </p>\n"
+" "
#. module: hr_holidays
#: view:hr.holidays:0
@@ -565,7 +590,7 @@
#. module: hr_holidays
#: view:hr.holidays:0
msgid "Reset to New"
-msgstr ""
+msgstr "Återställ till ny"
#. module: hr_holidays
#: sql_constraint:hr.holidays:0
@@ -580,7 +605,7 @@
#. module: hr_holidays
#: field:hr.employee,leave_date_to:0
msgid "To Date"
-msgstr ""
+msgstr "Till datum"
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
@@ -595,7 +620,7 @@
#. module: hr_holidays
#: model:ir.ui.menu,name:hr_holidays.menu_open_view_holiday_status
msgid "Leaves Types"
-msgstr ""
+msgstr "Frånvarotyp"
#. module: hr_holidays
#: field:hr.holidays,meeting_id:0
@@ -613,7 +638,7 @@
#: view:hr.holidays:0
#: field:hr.holidays,state:0
msgid "Status"
-msgstr ""
+msgstr "Status"
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
@@ -638,7 +663,7 @@
#. module: hr_holidays
#: field:hr.holidays,message_is_follower:0
msgid "Is a Follower"
-msgstr ""
+msgstr "Är en följare"
#. module: hr_holidays
#: field:hr.holidays,user_id:0
@@ -661,7 +686,7 @@
#. module: hr_holidays
#: view:hr.holidays:0
msgid "Add a reason..."
-msgstr ""
+msgstr "Lägg till orsak..."
#. module: hr_holidays
#: field:hr.holidays,manager_id:0
@@ -671,7 +696,7 @@
#. module: hr_holidays
#: field:hr.holidays,message_summary:0
msgid "Summary"
-msgstr ""
+msgstr "Sammandrag"
#. module: hr_holidays
#: model:hr.holidays.status,name:hr_holidays.holiday_status_unpaid
@@ -692,7 +717,7 @@
#. module: hr_holidays
#: view:hr.holidays:0
msgid "Submit to Manager"
-msgstr ""
+msgstr "Skicka till chef"
#. module: hr_holidays
#: view:hr.employee:0
@@ -775,7 +800,7 @@
#: view:hr.holidays:0
#: selection:hr.holidays,type:0
msgid "Allocation Request"
-msgstr "Ledighetstilldelning"
+msgstr "Ledighetsönskemål"
#. module: hr_holidays
#: help:hr.holidays,holiday_type:0
@@ -799,7 +824,7 @@
#: view:hr.employee:0
#: view:hr.holidays:0
msgid "days"
-msgstr ""
+msgstr "dagar"
#. module: hr_holidays
#: view:hr.holidays.summary.dept:0
@@ -827,7 +852,7 @@
#. module: hr_holidays
#: selection:hr.holidays,state:0
msgid "To Submit"
-msgstr ""
+msgstr "Att skicka"
#. module: hr_holidays
#: code:addons/hr_holidays/hr_holidays.py:354
@@ -853,7 +878,7 @@
#. module: hr_holidays
#: selection:hr.holidays,holiday_type:0
msgid "By Employee Tag"
-msgstr ""
+msgstr "Per anställdsetikett"
#. module: hr_holidays
#: selection:hr.employee,current_leave_state:0
@@ -865,7 +890,7 @@
#. module: hr_holidays
#: field:hr.holidays.status,categ_id:0
msgid "Meeting Type"
-msgstr ""
+msgstr "Mötestyp"
#. module: hr_holidays
#: field:hr.holidays.remaining.leaves.user,no_of_leaves:0
@@ -875,7 +900,7 @@
#. module: hr_holidays
#: view:hr.holidays:0
msgid "Allocated Days"
-msgstr ""
+msgstr "Dagar med frånvaro"
#. module: hr_holidays
#: view:hr.holidays:0
@@ -924,13 +949,13 @@
#: selection:hr.holidays.summary.dept,holiday_type:0
#: selection:hr.holidays.summary.employee,holiday_type:0
msgid "Both Approved and Confirmed"
-msgstr ""
+msgstr "Både godkända och bekräftade"
#. module: hr_holidays
#: code:addons/hr_holidays/hr_holidays.py:451
#, python-format
msgid "Request approved, waiting second validation."
-msgstr ""
+msgstr "Förfrågan godkänd, väntar sekundär validering."
#. module: hr_holidays
#: view:hr.holidays:0
@@ -940,7 +965,7 @@
#. module: hr_holidays
#: help:hr.holidays,message_ids:0
msgid "Messages and communication history"
-msgstr ""
+msgstr "Meddelande- och kommunikationshistorik"
#. module: hr_holidays
#: code:addons/hr_holidays/hr_holidays.py:260
@@ -948,7 +973,7 @@
#: sql_constraint:hr.holidays:0
#, python-format
msgid "The start date must be anterior to the end date."
-msgstr ""
+msgstr "Startdatum måste föregå slutdatum."
#. module: hr_holidays
#: xsl:holidays.summary:0
@@ -967,7 +992,7 @@
#: model:ir.actions.act_window,name:hr_holidays.open_allocation_holidays
#: model:ir.ui.menu,name:hr_holidays.menu_open_allocation_holidays
msgid "Allocation Requests"
-msgstr "Ledighetstilldening"
+msgstr "Ledighetsönskemål"
#. module: hr_holidays
#: xsl:holidays.summary:0
@@ -981,6 +1006,9 @@
"to create allocation/leave request. Total based on all the leave types "
"without overriding limit."
msgstr ""
+"Totalt antal lagstadgad ledighet för den anställde, ändra detta värde för "
+"att skapa frånvaro / ledighetsbegäran. Totalt baserat på alla frånvarotyper "
+"utan tvingande gräns."
#. module: hr_holidays
#: selection:hr.holidays.status,color_name:0
@@ -990,7 +1018,7 @@
#. module: hr_holidays
#: xsl:holidays.summary:0
msgid "leaves."
-msgstr ""
+msgstr "Frånvaro"
#. module: hr_holidays
#: view:hr.holidays:0
@@ -1010,7 +1038,7 @@
#. module: hr_holidays
#: view:hr.holidays:0
msgid "Duration"
-msgstr ""
+msgstr "Varaktighet"
#. module: hr_holidays
#: view:hr.holidays:0
@@ -1022,7 +1050,7 @@
#. module: hr_holidays
#: model:mail.message.subtype,description:hr_holidays.mt_holidays_approved
msgid "Request approved"
-msgstr ""
+msgstr "Önskemål accepterat"
#. module: hr_holidays
#: field:hr.holidays,notes:0
@@ -1032,4 +1060,4 @@
#. module: hr_holidays
#: field:hr.holidays.summary.employee,holiday_type:0
msgid "Select Leave Type"
-msgstr ""
+msgstr "Välj frånvarotyp"
=== modified file 'hr_payroll/i18n/sv.po'
--- hr_payroll/i18n/sv.po 2014-04-01 06:53:25 +0000
+++ hr_payroll/i18n/sv.po 2014-04-04 13:10:02 +0000
@@ -8,14 +8,14 @@
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2014-03-31 16:55+0000\n"
+"PO-Revision-Date: 2014-04-03 07:50+0000\n"
"Last-Translator: Anders Wallenquist <anders.wallenquist@xxxxxxxxx>\n"
"Language-Team: Swedish <sv@xxxxxx>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-01 06:52+0000\n"
-"X-Generator: Launchpad (build 16967)\n"
+"X-Launchpad-Export-Date: 2014-04-04 07:07+0000\n"
+"X-Generator: Launchpad (build 16976)\n"
#. module: hr_payroll
#: field:hr.payslip.line,condition_select:0
@@ -102,7 +102,7 @@
#: field:hr.salary.rule,company_id:0
#: field:hr.salary.rule.category,company_id:0
msgid "Company"
-msgstr "Företag"
+msgstr "Bolag"
#. module: hr_payroll
#: view:hr.payslip:0
@@ -234,7 +234,7 @@
#. module: hr_payroll
#: field:hr.config.settings,module_hr_payroll_account:0
msgid "Link your payroll to accounting system"
-msgstr ""
+msgstr "Länka lönesystemet till bokföringen"
#. module: hr_payroll
#: help:hr.payslip.line,amount_select:0
@@ -313,7 +313,7 @@
#. module: hr_payroll
#: constraint:hr.payroll.structure:0
msgid "Error ! You cannot create a recursive Salary Structure."
-msgstr ""
+msgstr "Fel! Du kan inte skapa rekursiva ersättningsstrukturer."
#. module: hr_payroll
#: help:hr.payslip.line,code:0
@@ -354,6 +354,17 @@
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klicka för att lägga till ett nytt medarbetarregister.\n"
+" </p><p>\n"
+" Ett medarbetarregister är en tredje part inblandad i "
+"ersättningssystemet\n"
+" för de anställda. Det kan vara Skattemyndighet, "
+"Försäkringskassan, Arbetsförmedlingen, pensionsstöd, löntagarorganisation "
+"eller vilken den organisation/kassa som tillför eller drar pengar på "
+"lönebeskeden.\n"
+" </p>\n"
+" "
#. module: hr_payroll
#: help:hr.payslip.line,condition_range_max:0
@@ -446,7 +457,7 @@
#. module: hr_payroll
#: help:hr.config.settings,module_hr_payroll_account:0
msgid "Create journal entries from payslips"
-msgstr ""
+msgstr "Skapa journalverifikat från lönebesked."
#. module: hr_payroll
#: field:hr.payslip,paid:0
@@ -456,7 +467,7 @@
#. module: hr_payroll
#: report:contribution.register.lines:0
msgid "PaySlip Lines by Contribution Register"
-msgstr "Lönespecifikationsrader från Bidrags Register"
+msgstr "Lönespecifikationsrader från medarbetarregistret"
#. module: hr_payroll
#: view:hr.payslip:0
@@ -494,7 +505,7 @@
#. module: hr_payroll
#: model:ir.model,name:hr_payroll.model_payslip_lines_contribution_register
msgid "PaySlip Lines by Contribution Registers"
-msgstr "Lönespecifikationsrader genom Bidrags Register"
+msgstr "Lönespecifikationsrader via medarbetarregistret"
#. module: hr_payroll
#: view:hr.payslip:0
@@ -630,7 +641,7 @@
#: help:hr.payslip.line,appears_on_payslip:0
#: help:hr.salary.rule,appears_on_payslip:0
msgid "Used to display the salary rule on payslip."
-msgstr ""
+msgstr "Används för att visa löneregler på lönebeskedet."
#. module: hr_payroll
#: model:ir.model,name:hr_payroll.model_hr_payslip_input
@@ -647,7 +658,7 @@
#. module: hr_payroll
#: view:hr.payslip:0
msgid "Cancel Payslip"
-msgstr ""
+msgstr "Avbryt lönebesked"
#. module: hr_payroll
#: help:hr.payslip.input,contract_id:0
@@ -664,7 +675,7 @@
#: code:addons/hr_payroll/hr_payroll.py:899
#, python-format
msgid "Wrong range condition defined for salary rule %s (%s)."
-msgstr ""
+msgstr "Fel omfångsvillkor definierat för löneregeln %s (%s)."
#. module: hr_payroll
#: help:hr.payslip.input,amount:0
@@ -694,7 +705,7 @@
#. module: hr_payroll
#: view:hr.salary.rule:0
msgid "Company Contribution"
-msgstr ""
+msgstr "Bolagets bidrag"
#. module: hr_payroll
#: help:hr.payslip.run,credit_note:0
@@ -709,7 +720,7 @@
#: code:addons/hr_payroll/hr_payroll.py:876
#, python-format
msgid "Wrong percentage base or quantity defined for salary rule %s (%s)."
-msgstr ""
+msgstr "Fel procentbas eller kvantitet definierad för löneregeln %s (%s)."
#. module: hr_payroll
#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_payroll_structure_list_form
@@ -767,7 +778,7 @@
#: code:addons/hr_payroll/hr_payroll.py:871
#, python-format
msgid "Wrong quantity defined for salary rule %s (%s)."
-msgstr ""
+msgstr "Fel kvantitet definierad för löneregeln %s (%s)."
#. module: hr_payroll
#: view:hr.payslip:0
@@ -852,7 +863,7 @@
#: code:addons/hr_payroll/wizard/hr_payroll_payslips_by_employees.py:52
#, python-format
msgid "You must select employee(s) to generate payslip(s)."
-msgstr ""
+msgstr "Du måste välja anställda för att skapa lönebesked"
#. module: hr_payroll
#: report:paylip.details:0
@@ -1026,7 +1037,7 @@
#: field:hr.salary.rule,register_id:0
#: model:ir.model,name:hr_payroll.model_hr_contribution_register
msgid "Contribution Register"
-msgstr "Bidrags Register"
+msgstr "Medarbetarregister"
#. module: hr_payroll
#: view:payslip.lines.contribution.register:0
@@ -1081,7 +1092,7 @@
#: model:ir.actions.act_window,name:hr_payroll.action_contribution_register_form
#: model:ir.ui.menu,name:hr_payroll.menu_action_hr_contribution_register_form
msgid "Contribution Registers"
-msgstr "Bidrags Register"
+msgstr "Medarbetarregister"
#. module: hr_payroll
#: model:ir.ui.menu,name:hr_payroll.menu_hr_payroll_reporting
@@ -1093,13 +1104,14 @@
#. module: hr_payroll
#: model:ir.actions.report.xml,name:hr_payroll.contribution_register
msgid "PaySlip Lines By Conribution Register"
-msgstr "Lönespecifikationsrader från Bidragsregistret"
+msgstr "Lönespecifikationsrader från medarbetarergistret"
#. module: hr_payroll
#: code:addons/hr_payroll/hr_payroll.py:370
#, python-format
msgid "You cannot delete a payslip which is not draft or cancelled!"
msgstr ""
+"Du kan inte radera ett lönebesked som inte är i \"Utkast\" eller \"Avbruten\""
#. module: hr_payroll
#: report:paylip.details:0
@@ -1171,6 +1183,10 @@
"* If the payslip is confirmed then status is set to 'Done'. \n"
"* When user cancel payslip the status is 'Rejected'."
msgstr ""
+"* När lönebesked skapas statusen är \"Utkast\".\n"
+"* Om lönebesked är under kontroll, är statusen \"Väntar\".\n"
+"* Om lönebesked bekräftas då status är inställd på \"Klar\".\n"
+"* När användaren avbryter lönespecifikation statusen är \"Avvisad\"."
#. module: hr_payroll
#: help:hr.payslip.line,condition_range:0
@@ -1197,7 +1213,7 @@
#. module: hr_payroll
#: view:hr.payslip:0
msgid "Other Inputs"
-msgstr ""
+msgstr "Övriga indata"
#. module: hr_payroll
#: model:ir.actions.act_window,name:hr_payroll.action_hr_salary_rule_category_tree_view
@@ -1209,7 +1225,7 @@
#: code:addons/hr_payroll/hr_payroll.py:882
#, python-format
msgid "Wrong python code defined for salary rule %s (%s)."
-msgstr ""
+msgstr "Fel i python-koden definierat för löneregeln %s (%s)."
#. module: hr_payroll
#: report:contribution.register.lines:0
@@ -1240,7 +1256,7 @@
#: code:addons/hr_payroll/hr_payroll.py:905
#, python-format
msgid "Wrong python condition defined for salary rule %s (%s)."
-msgstr ""
+msgstr "Fel i python-villkoret definierat för löneregeln %s (%s)."
#. module: hr_payroll
#: view:hr.payslip.run:0
=== modified file 'mail/i18n/sv.po'
--- mail/i18n/sv.po 2014-04-03 06:02:13 +0000
+++ mail/i18n/sv.po 2014-04-04 13:10:02 +0000
@@ -9,14 +9,14 @@
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2014-04-03 05:29+0000\n"
+"PO-Revision-Date: 2014-04-03 10:13+0000\n"
"Last-Translator: Anders Wallenquist <anders.wallenquist@xxxxxxxxx>\n"
"Language-Team: Svenska <info@xxxxxxxxxxxxxxxxx>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-03 06:02+0000\n"
-"X-Generator: Launchpad (build 16967)\n"
+"X-Launchpad-Export-Date: 2014-04-04 07:07+0000\n"
+"X-Generator: Launchpad (build 16976)\n"
#. module: mail
#: view:mail.followers:0
@@ -368,6 +368,8 @@
"Message type: email for email message, notification for system message, "
"comment for other messages such as user replies"
msgstr ""
+"Meddelandetyp: e-post för e-postmeddelande, avisering för systemmeddelande, "
+"kommentar är andra meddelanden som till exempel användarsvar"
#. module: mail
#: help:mail.message.subtype,relation_field:0
@@ -391,7 +393,7 @@
#: code:addons/mail/wizard/invite.py:37
#, python-format
msgid "<div>You have been invited to follow %s.</div>"
-msgstr ""
+msgstr "<div>Du har blivit inbjuden att följa %s. </div>"
#. module: mail
#. openerp-web
@@ -492,6 +494,8 @@
"Holds the Chatter summary (number of messages, ...). This summary is "
"directly in html format in order to be inserted in kanban views."
msgstr ""
+"Lagrar pladder-sammanfattning (antal meddelanden, ...). Denna sammanfattning "
+"presenteras i html-format för att kunna sättas in i kanban vyer."
#. module: mail
#: help:mail.alias,alias_model_id:0
@@ -705,6 +709,9 @@
"image, with aspect ratio preserved. Use this field anywhere a small image is "
"required."
msgstr ""
+"Liten bild som representerar gruppen. Det är storleksändras automatiskt till "
+"64x64px, men med bevarat bildförhållande. Använd det här fältet när helst en "
+"liten bild krävs."
#. module: mail
#: view:mail.compose.message:0
@@ -745,7 +752,7 @@
#: code:addons/mail/wizard/invite.py:40
#, python-format
msgid "<div>You have been invited to follow a new document.</div>"
-msgstr ""
+msgstr "<div>Du har blivit inbjuden att följa ett nytt dokument. </div>"
#. module: mail
#: field:mail.compose.message,parent_id:0
@@ -757,6 +764,7 @@
#: selection:res.partner,notification_email_send:0
msgid "All Messages (discussions, emails, followed system notifications)"
msgstr ""
+"Alla meddelanden (diskussioner, e-post, prenumeration på systemaviseringar)"
#. module: mail
#. openerp-web
@@ -826,12 +834,14 @@
"You may not create a user. To create new users, you should use the "
"\"Settings > Users\" menu."
msgstr ""
+"Du kan inte skapa en användare. För att skapa nya användare används "
+"\"Inställningar > Användare\"-menyn"
#. module: mail
#: help:mail.followers,res_model:0
#: help:mail.wizard.invite,res_model:0
msgid "Model of the followed resource"
-msgstr ""
+msgstr "Modell för den prenumererade resursen"
#. module: mail
#. openerp-web
@@ -870,7 +880,7 @@
msgid ""
"Only the invited followers can read the\n"
" discussions on this group."
-msgstr ""
+msgstr "Endast inbjudna följare kan läsa denna grupps diskussioner"
#. module: mail
#: model:ir.model,name:mail.model_ir_ui_menu
@@ -894,6 +904,7 @@
"The following partners chosen as recipients for the email have no email "
"address linked :"
msgstr ""
+"Följande företag är valda mottagare för e-post som saknar länkad adress:"
#. module: mail
#: help:mail.alias,alias_defaults:0
@@ -901,11 +912,13 @@
"A Python dictionary that will be evaluated to provide default values when "
"creating new records for this alias."
msgstr ""
+"Ett Python-dictionary som används för standardvärden när nya poster skapas "
+"för detta alias."
#. module: mail
#: model:ir.model,name:mail.model_mail_message_subtype
msgid "Message subtypes"
-msgstr ""
+msgstr "Undertyper till meddelande"
#. module: mail
#. openerp-web
@@ -970,6 +983,8 @@
msgid ""
"Unable to send email, please configure the sender's email address or alias."
msgstr ""
+"Kunde inte skicka e-post, vänligen konfigurera avsändarens e-postadress "
+"eller alias."
#. module: mail
#: help:res.users,alias_id:0
@@ -987,7 +1002,7 @@
#: help:mail.compose.message,vote_user_ids:0
#: help:mail.message,vote_user_ids:0
msgid "Users that voted for this message"
-msgstr ""
+msgstr "Användare som röstat på detta meddelande"
#. module: mail
#: help:mail.group,alias_id:0
@@ -1077,6 +1092,7 @@
#: help:mail.message,starred:0
msgid "Current user has a starred notification linked to this message"
msgstr ""
+"Aktuell användare har en blockerad avisering länkad till detta meddelande"
#. module: mail
#: field:mail.group,public:0
@@ -1229,7 +1245,7 @@
#. module: mail
#: model:mail.group,name:mail.group_best_sales_practices
msgid "Best Sales Practices"
-msgstr ""
+msgstr "Marknadsföringspraxis"
#. module: mail
#: selection:mail.group,public:0
@@ -1442,7 +1458,7 @@
#. module: mail
#: help:mail.notification,starred:0
msgid "Starred message that goes into the todo mailbox"
-msgstr ""
+msgstr "Blockerade meddelanden som sorteras in i att-göra-boxen"
#. module: mail
#: view:mail.group:0
@@ -1517,11 +1533,12 @@
msgid ""
"Partners that have a notification pushing this message in their mailboxes"
msgstr ""
+"Företag som har en aviseringsknuff av detta meddelande till sina e-postlådor"
#. module: mail
#: view:mail.message:0
msgid "Show already read messages"
-msgstr ""
+msgstr "Visa lästa meddelanden"
#. module: mail
#: view:mail.message:0
@@ -1560,6 +1577,8 @@
"This group is visible by non members. Invisible groups can add "
"members through the invite button."
msgstr ""
+"Denna grupp är synlig för icke medlemmar. Osynliga grupper kan lägga till "
+"medlemmar via den \"osynliga\" knappen."
#. module: mail
#: model:mail.group,name:mail.group_board
@@ -1569,7 +1588,7 @@
#. module: mail
#: field:mail.alias,alias_model_id:0
msgid "Aliased Model"
-msgstr ""
+msgstr "Aliasobjekt"
#. module: mail
#: help:mail.compose.message,message_id:0
@@ -1609,7 +1628,7 @@
#: code:addons/mail/mail_message.py:930
#, python-format
msgid "Partners email addresses not found"
-msgstr ""
+msgstr "Företagets e-postadress saknas"
#. module: mail
#: view:mail.mail:0
@@ -1620,7 +1639,7 @@
#. module: mail
#: field:mail.mail,body_html:0
msgid "Rich-text Contents"
-msgstr ""
+msgstr "Utsmyckat innehåll"
#. module: mail
#: help:mail.compose.message,to_read:0
@@ -1667,6 +1686,9 @@
"installed\n"
" the portal module."
msgstr ""
+"Denna grupp är synlig för alla,\n"
+" även dina kunder i de fall du "
+"installerat portalmodulen."
#. module: mail
#. openerp-web
@@ -1680,7 +1702,7 @@
#: code:addons/mail/static/src/xml/mail.xml:154
#, python-format
msgid "Attach a note that will not be sent to the followers"
-msgstr ""
+msgstr "Bilägg en notering som inte kommer skickas till prenumeranterna"
#. module: mail
#. openerp-web
@@ -1839,7 +1861,7 @@
#: code:addons/mail/update.py:93
#, python-format
msgid "Error during communication with the publisher warranty server."
-msgstr ""
+msgstr "Fel vid kommunikation med servern för 'utgivarens underhållsavtal'."
#. module: mail
#: selection:mail.group,public:0
@@ -1888,7 +1910,7 @@
#. module: mail
#: model:mail.group,name:mail.group_hr_policies
msgid "HR Policies"
-msgstr ""
+msgstr "Personalpolicies"
#. module: mail
#. openerp-web
@@ -1935,6 +1957,3 @@
#: help:mail.mail,reply_to:0
msgid "Preferred response address for the message"
msgstr "Föredragen svarsadress för meddelandet"
-
-#~ msgid "Invitation to follow %s"
-#~ msgstr "Invitation to follow %s"
=== modified file 'mrp/__openerp__.py'
--- mrp/__openerp__.py 2014-03-10 08:54:20 +0000
+++ mrp/__openerp__.py 2014-04-04 13:10:02 +0000
@@ -74,14 +74,19 @@
'res_config_view.xml',
],
'demo': ['mrp_demo.xml'],
- #TODO: This yml tests are needed to be completely reviewed again because the product wood panel is removed in product demo as it does not suit for new demo context of computer and consultant company
- # so the ymls are too complex to change at this stage
'test': [
'test/bom_with_service_type_product.yml',
+<<<<<<< TREE
# 'test/order_demo.yml',
# 'test/order_process.yml',
# 'test/cancel_order.yml',
'test/order_process_prodlot_split.yml',
+=======
+ 'test/mrp_users.yml',
+ 'test/order_demo.yml',
+ 'test/order_process.yml',
+ 'test/cancel_order.yml',
+>>>>>>> MERGE-SOURCE
],
'installable': True,
'application': True,
=== modified file 'mrp/security/ir.model.access.csv'
--- mrp/security/ir.model.access.csv 2014-03-10 08:54:20 +0000
+++ mrp/security/ir.model.access.csv 2014-04-04 13:10:02 +0000
@@ -1,4 +1,5 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_account_analytic_line_user,account.analytic.line,account.model_account_analytic_line,group_mrp_user,1,1,1,0
access_mrp_workcenter,mrp.workcenter,model_mrp_workcenter,mrp.group_mrp_user,1,0,0,0
access_mrp_routing,mrp.routing,model_mrp_routing,mrp.group_mrp_user,1,0,0,0
access_mrp_routing_workcenter,mrp.routing.workcenter,model_mrp_routing_workcenter,mrp.group_mrp_user,1,0,0,0
=== modified file 'mrp/security/mrp_security.xml'
--- mrp/security/mrp_security.xml 2014-03-10 08:54:20 +0000
+++ mrp/security/mrp_security.xml 2014-04-04 13:10:02 +0000
@@ -4,6 +4,7 @@
<record id="group_mrp_user" model="res.groups">
<field name="name">User</field>
+ <field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
<field name="category_id" ref="base.module_category_manufacturing"/>
</record>
<record id="group_mrp_manager" model="res.groups">
=== modified file 'mrp/test/cancel_order.yml'
--- mrp/test/cancel_order.yml 2014-03-10 08:54:20 +0000
+++ mrp/test/cancel_order.yml 2014-04-04 13:10:02 +0000
@@ -1,4 +1,9 @@
-
+ MRP user can cancelled Production Order, so let's check data with giving the access rights of user.
+-
+ !context
+ uid: 'res_users_mrp_user'
+-
I first confirm order for PC Assemble SC349.
-
!workflow {model: mrp.production, action: button_confirm, ref: mrp_production_test1}
=== added file 'mrp/test/mrp_users.yml'
--- mrp/test/mrp_users.yml 1970-01-01 00:00:00 +0000
+++ mrp/test/mrp_users.yml 2014-04-04 13:10:02 +0000
@@ -0,0 +1,31 @@
+-
+ Create a user as 'MRP Manager'
+-
+ !record {model: res.users, id: res_users_mrp_manager}:
+ company_id: base.main_company
+ name: MRP Manager
+ login: mam
+ password: mam
+ email: mrp_manager@xxxxxxxxxxxxxxx
+-
+ I added groups for MRP Manager.
+-
+ !record {model: res.users, id: res_users_mrp_manager}:
+ groups_id:
+ - mrp.group_mrp_manager
+ - account.group_account_user
+-
+ Create a user as 'MRP User'
+-
+ !record {model: res.users, id: res_users_mrp_user}:
+ company_id: base.main_company
+ name: MRP User
+ login: mau
+ password: mau
+ email: mrp_user@xxxxxxxxxxxxxxx
+-
+ I added groups for MRP User.
+-
+ !record {model: res.users, id: res_users_mrp_user}:
+ groups_id:
+ - mrp.group_mrp_user
\ No newline at end of file
=== modified file 'mrp/test/order_demo.yml'
--- mrp/test/order_demo.yml 2014-03-10 08:54:20 +0000
+++ mrp/test/order_demo.yml 2014-04-04 13:10:02 +0000
@@ -1,4 +1,9 @@
-
+ MRP user can create Production Order, so let's check data with giving the access rights of user.
+-
+ !context
+ uid: 'res_users_mrp_user'
+-
I create Production Order of PC Assemble SC349 to produce 5.0 Unit.
-
!record {model: mrp.production, id: mrp_production_test1}:
=== modified file 'mrp/test/order_process.yml'
--- mrp/test/order_process.yml 2014-03-10 08:54:20 +0000
+++ mrp/test/order_process.yml 2014-04-04 13:10:02 +0000
@@ -1,4 +1,9 @@
-
+ MRP user can doing all process related to Production Order, so let's check data with giving the access rights of user.
+-
+ !context
+ uid: 'res_users_mrp_user'
+-
I compute the production order.
-
!python {model: mrp.production}: |
@@ -14,7 +19,7 @@
Now I check workcenter lines.
-
!python {model: mrp.production}: |
- from tools import float_compare
+ from openerp.tools import float_compare
def assert_equals(value1, value2, msg, float_compare=float_compare):
assert float_compare(value1, value2, precision_digits=2) == 0, msg
order = self.browse(cr, uid, ref("mrp_production_test1"), context=context)
@@ -23,6 +28,7 @@
I confirm the Production Order.
-
!workflow {model: mrp.production, action: button_confirm, ref: mrp_production_test1}
+
-
I check details of Produce Move of Production Order to trace Final Product.
-
@@ -59,6 +65,16 @@
assert move_line.location_id.id == routing_loc or order.location_src_id.id, "Source location is not correspond in 'To consume line'."
assert move_line.location_dest_id.id == source_location_id, "Destination Location is not correspond in 'To consume line'."
-
+ I consume raw materials and put one material in scrap location due to waste it.
+-
+ !python {model: mrp.production}: |
+ scrap_location_ids = self.pool.get('stock.location').search(cr, uid, [('scrap_location','=',True)])
+ scrap_location_id = scrap_location_ids[0]
+ order = self.browse(cr, uid, ref("mrp_production_test1"))
+ for move in order.move_lines:
+ if move.product_id.id == ref("product.product_product_6"):
+ move.action_scrap(5.0, scrap_location_id)
+-
I check details of an Internal Shipment after confirmed production order to bring components in Raw Materials Location.
-
!python {model: mrp.production}: |
@@ -94,6 +110,11 @@
procurement_ids = procurement.search(cr, uid, [('move_id','=',move_line.id)])
assert procurement_ids, "Procurement should be created for shipment line of raw materials."
shipment_procurement = procurement.browse(cr, uid, procurement_ids[0], context=context)
+ # procurement state should be `confirmed` at this stage, except if mrp_jit is installed, in which
+ # case it could already be in `running` or `exception` state (not enough stock)
+ expected_states = ('confirmed', 'running', 'exception')
+ assert shipment_procurement.state in expected_states, 'Procurement state is `%s` for %s, expected one of %s' % \
+ (shipment_procurement.state, shipment_procurement.product_id.name, expected_states)
assert shipment_procurement.date_planned == date_planned, "Planned date is not correspond in procurement."
assert shipment_procurement.product_id.id == order_line.product_id.id, "Product is not correspond in procurement."
assert shipment_procurement.product_qty == order_line.product_qty, "Qty is not correspond in procurement."
@@ -150,17 +171,7 @@
order = self.browse(cr, uid, ref("mrp_production_test1"))
assert order.state == 'in_production', 'Production order should be in production State.'
-
- I consume raw materials and put one material in scrap location due to waste it.
--
- !python {model: mrp.production}: |
- scrap_location_ids = self.pool.get('stock.location').search(cr, uid, [('scrap_location','=',True)])
- scrap_location_id = scrap_location_ids[0]
- order = self.browse(cr, uid, ref("mrp_production_test1"))
- for move in order.move_lines:
move.action_consume(move.product_qty)
- if move.product_id.id == ref("product.product_product_6"):
- move.action_scrap(5.0, scrap_location_id)
--
I produce product.
-
!python {model: mrp.product.produce}: |
@@ -178,7 +189,10 @@
order = self.browse(cr, uid, ref("mrp_production_test1"))
assert order.state == 'done', "Production order should be closed."
-
- I check Total Costs at End of Production.
+ I check Total Costs at End of Production as a manager.
+-
+ !context
+ uid: 'res_users_mrp_manager'
-
!python {model: mrp.production}: |
order = self.browse(cr, uid, ref("mrp_production_test1"))
@@ -213,6 +227,9 @@
-
I print a "BOM Structure".
-
+ !context
+ uid: 'res_users_mrp_user'
+-
!python {model: mrp.production}: |
import netsvc, tools, os
order = self.browse(cr, uid, ref("mrp_production_test1"))
=== modified file 'mrp_operations/__openerp__.py'
--- mrp_operations/__openerp__.py 2014-03-10 08:54:20 +0000
+++ mrp_operations/__openerp__.py 2014-04-04 13:10:02 +0000
@@ -70,7 +70,7 @@
'mrp_operations_demo.yml'
],
'test': [
-# 'test/workcenter_operations.yml',
+ 'test/workcenter_operations.yml',
],
'installable': True,
'auto_install': False,
=== modified file 'mrp_operations/test/workcenter_operations.yml'
--- mrp_operations/test/workcenter_operations.yml 2014-03-10 08:54:20 +0000
+++ mrp_operations/test/workcenter_operations.yml 2014-04-04 13:10:02 +0000
@@ -1,6 +1,24 @@
-
+ Create a user as 'MRP User'
+-
+ !record {model: res.users, id: res_mrp_operation_user}:
+ company_id: base.main_company
+ name: MRP User
+ login: maou
+ password: maou
+ email: mrp_operation_user@xxxxxxxxxxxxxxx
+-
+ I added groups for MRP User.
+-
+ !record {model: res.users, id: res_mrp_operation_user}:
+ groups_id:
+ - mrp.group_mrp_user
+-
In order to test mrp_operations with OpenERP, I refer created production order of PC Assemble SC349
- with routing - Manual Component's Assembly to test complete production process with respect of workcenter.
+ with routing - Manual Component's Assembly to test complete production process with respect of workcenter with giving access rights of MRP User.
+-
+ !context
+ uid: 'res_mrp_operation_user'
-
I compute the production order.
-
@@ -106,7 +124,7 @@
I print a Barcode Report of Operation line.
-
!python {model: mrp_operations.operation.code}: |
- import netsvc, tools, os
+ from openerp import netsvc, tools
(data, format) = netsvc.LocalService('report.mrp.code.barcode').create(cr, uid, [ref('mrp_operations.mrp_op_1'),ref('mrp_operations.mrp_op_2'),ref('mrp_operations.mrp_op_3'),ref('mrp_operations.mrp_op_4'),ref('mrp_operations.mrp_op_5')], {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'mrp_operations-barcode_report.'+format), 'wb+').write(data)
@@ -115,7 +133,7 @@
I print Workcenter's Barcode Report.
-
!python {model: mrp.workcenter}: |
- import netsvc, tools, os
+ from openerp import netsvc, tools
(data, format) = netsvc.LocalService('report.mrp.wc.barcode').create(cr, uid, [ref('mrp.mrp_workcenter_0'),ref('mrp.mrp_workcenter_1')], {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'mrp_operations-workcenter_barcode_report.'+format), 'wb+').write(data)
=== modified file 'sale/i18n/sv.po'
--- sale/i18n/sv.po 2014-04-03 06:02:13 +0000
+++ sale/i18n/sv.po 2014-04-04 13:10:02 +0000
@@ -8,14 +8,14 @@
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2013-06-07 19:36+0000\n"
-"PO-Revision-Date: 2014-04-03 05:30+0000\n"
+"PO-Revision-Date: 2014-04-03 10:44+0000\n"
"Last-Translator: Anders Wallenquist <anders.wallenquist@xxxxxxxxx>\n"
"Language-Team: Swedish <sv@xxxxxx>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-04-03 06:02+0000\n"
-"X-Generator: Launchpad (build 16967)\n"
+"X-Launchpad-Export-Date: 2014-04-04 07:07+0000\n"
+"X-Generator: Launchpad (build 16976)\n"
#. module: sale
#: model:ir.model,name:sale.model_account_config_settings
@@ -65,7 +65,7 @@
#: code:addons/sale/wizard/sale_make_invoice_advance.py:102
#, python-format
msgid "The value of Advance Amount must be positive."
-msgstr ""
+msgstr "Värdet på förskotterat belopp måste vara positivt."
#. module: sale
#: help:sale.config.settings,group_discount_per_so_line:0
@@ -97,6 +97,10 @@
"The 'Waiting Schedule' status is set when the invoice is confirmed "
" but waiting for the scheduler to run on the order date."
msgstr ""
+"Ger status för offert eller kundorder. Status Undantag ställs in automatiskt "
+"när faktura- (Faktura i undantag) eller plockningsprocessen (Levarans i "
+"undantag). Status 'Planerad väntan' \"ställs in när fakturan är bekräftad, "
+"men väntar på planeringsscheduleringskörningen på orderdagen."
#. module: sale
#: view:sale.report:0
@@ -291,7 +295,7 @@
#: code:addons/sale/sale.py:598
#, python-format
msgid "You cannot confirm a sales order which has no line."
-msgstr ""
+msgstr "Du kan inte bekräfta en kundorder som saknar rader."
#. module: sale
#: model:ir.actions.act_window,help:sale.action_order_line_tree2
@@ -307,6 +311,15 @@
" </p>\n"
" "
msgstr ""
+"<p>\n"
+" Här är en lista på varje fakturerbar kundorderrad. Du kan\n"
+" göra partiella faktureringar via kundorderrader. Denna "
+"listan är onödig \n"
+" i de fall du valt att fakturera med leveransorder som "
+"underlag eller du alltid\n"
+" fakturerar kundordern i sin helhet.\n"
+" </ p>\n"
+" "
#. module: sale
#: view:sale.order:0
@@ -724,6 +737,14 @@
" \n"
"* The 'Cancelled' status is set when a user cancel the sales order related."
msgstr ""
+"* Status \"Utkast\" ställs in när den relaterade kundorder i utkast status.\n"
+"* Status \"Bekräftat\" ställs in när den relaterade "
+"försäljningsorderläggningen .\n"
+"* Status \"Undantag\" ställs in när den relaterade kundorder in som "
+"undantag.\n"
+"* Status \"Klar\" ställs in när försäljningsorderraden har plockats.\n"
+"* Status \"Inställd\" ställs in när en användare avbryter kundorder "
+"relaterade."
#. module: sale
#: code:addons/sale/wizard/sale_make_invoice_advance.py:92
@@ -1565,6 +1586,91 @@
"</div>\n"
" "
msgstr ""
+"\n"
+"<div style=\"font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-"
+"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; \">\n"
+"\n"
+" <p>Hej ${object.partner_id.name},</p>\n"
+" \n"
+" <p>Här kommer din ${object.state in ('draft', 'sent') and 'offert' or "
+"'orderbekräftelse'} från ${object.company_id.name}: </p>\n"
+"\n"
+" <p style=\"border-left: 1px solid #8e0000; margin-left: 30px;\">\n"
+" <strong>UPPGIFTER</strong><br />\n"
+" Ordernummer: <strong>${object.name}</strong><br />\n"
+" Ordertotal: <strong>${object.amount_total} "
+"${object.pricelist_id.currency_id.name}</strong><br />\n"
+" Orderdatum: ${object.date_order}<br />\n"
+" % if object.origin:\n"
+" Orderreferens: ${object.origin}<br />\n"
+" % endif\n"
+" % if object.client_order_ref:\n"
+" Er referens: ${object.client_order_ref}<br />\n"
+" % endif\n"
+" % if object.user_id:\n"
+" Din kontaktperson: <a "
+"href=\"mailto:${object.user_id.email or "
+"''}?subject=Order%20${object.name}\">${object.user_id.name}</a>\n"
+" % endif\n"
+" </p>\n"
+"\n"
+" % if object.paypal_url:\n"
+" <br/>\n"
+" <p>Det är även möjligt att betala direkt via Paypal:</p>\n"
+" <a style=\"margin-left: 120px;\" href=\"${object.paypal_url}\">\n"
+" <img class=\"oe_edi_paypal_button\" "
+"src=\"https://www.paypal.com/en_US/i/btn/btn_paynowCC_LG.gif\"/>\n"
+" </a>\n"
+" % endif\n"
+"\n"
+" <br/>\n"
+" <p>Vid eventuella frågot, tveka inte att kontakta oss.</p>\n"
+" <p>Tack för att ni väljer ${object.company_id.name or 'oss'}!</p>\n"
+" <br/>\n"
+" <br/>\n"
+" <div style=\"width: 375px; margin: 0px; padding: 0px; background-color: "
+"#8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; "
+"background-repeat: repeat no-repeat;\">\n"
+" <h3 style=\"margin: 0px; padding: 2px 14px; font-size: 12px; color: "
+"#DDD;\">\n"
+" <strong style=\"text-"
+"transform:uppercase;\">${object.company_id.name}</strong></h3>\n"
+" </div>\n"
+" <div style=\"width: 347px; margin: 0px; padding: 5px 14px; line-height: "
+"16px; background-color: #F2F2F2;\">\n"
+" <span style=\"color: #222; margin-bottom: 5px; display: block; \">\n"
+" % if object.company_id.street:\n"
+" ${object.company_id.street}<br/>\n"
+" % endif\n"
+" % if object.company_id.street2:\n"
+" ${object.company_id.street2}<br/>\n"
+" % endif\n"
+" % if object.company_id.city or object.company_id.zip:\n"
+" ${object.company_id.zip} ${object.company_id.city}<br/>\n"
+" % endif\n"
+" % if object.company_id.country_id:\n"
+" ${object.company_id.state_id and ('%s, ' % "
+"object.company_id.state_id.name) or ''} ${object.company_id.country_id.name "
+"or ''}<br/>\n"
+" % endif\n"
+" </span>\n"
+" % if object.company_id.phone:\n"
+" <div style=\"margin-top: 0px; margin-right: 0px; margin-bottom: "
+"0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: "
+"0px; padding-left: 0px; \">\n"
+" Phone: ${object.company_id.phone}\n"
+" </div>\n"
+" % endif\n"
+" % if object.company_id.website:\n"
+" <div>\n"
+" Web : <a "
+"href=\"${object.company_id.website}\">${object.company_id.website}</a>\n"
+" </div>\n"
+" %endif\n"
+" <p></p>\n"
+" </div>\n"
+"</div>\n"
+" "
#. module: sale
#: view:sale.order.line:0
@@ -2282,11 +2388,3 @@
#: field:sale.report,year:0
msgid "Year"
msgstr "År"
-
-#~ msgid ""
-#~ "In order to delete a confirmed sales order, you must cancel it before!"
-#~ msgstr ""
-#~ "In order to delete a confirmed sales order, you must cancel it before!"
-
-#~ msgid "No Customer Defined!"
-#~ msgstr "Kund saknas!"
=== modified file 'stock/__openerp__.py'
--- stock/__openerp__.py 2014-03-10 08:54:20 +0000
+++ stock/__openerp__.py 2014-04-04 13:10:02 +0000
@@ -59,7 +59,6 @@
'sequence': 16,
'demo': [
'stock_demo.xml',
-# 'stock_demo.yml',
],
'data': [
'security/stock_security.xml',
@@ -91,10 +90,18 @@
'res_config_view.xml',
],
'test': [
+<<<<<<< TREE
# 'test/opening_stock.yml',
# 'test/shipment.yml',
# 'test/stock_report.yml',
'test/stock_move_chain_validation.yml',
+=======
+ 'test/stock_users.yml',
+ 'stock_demo.yml',
+ 'test/opening_stock.yml',
+ 'test/shipment.yml',
+ 'test/stock_report.yml',
+>>>>>>> MERGE-SOURCE
],
'installable': True,
'application': True,
=== modified file 'stock/i18n/zh_TW.po'
--- stock/i18n/zh_TW.po 2014-03-31 06:40:21 +0000
+++ stock/i18n/zh_TW.po 2014-04-04 13:10:02 +0000
@@ -8,14 +8,14 @@
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2014-02-06 15:56+0000\n"
-"PO-Revision-Date: 2014-03-30 12:01+0000\n"
+"PO-Revision-Date: 2014-04-03 11:14+0000\n"
"Last-Translator: Andy Cheng <andy@xxxxxxxxxx>\n"
"Language-Team: Chinese (Traditional) <zh_TW@xxxxxx>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2014-03-31 06:40+0000\n"
-"X-Generator: Launchpad (build 16967)\n"
+"X-Launchpad-Export-Date: 2014-04-04 07:07+0000\n"
+"X-Generator: Launchpad (build 16976)\n"
#. module: stock
#: field:stock.inventory.line.split,line_exist_ids:0
@@ -4360,7 +4360,7 @@
#. module: stock
#: view:product.product:0
msgid "update"
-msgstr ""
+msgstr "更新"
#. module: stock
#: view:stock.change.product.qty:0
@@ -4379,7 +4379,7 @@
#: view:stock.return.picking:0
#: view:stock.split.into:0
msgid "or"
-msgstr ""
+msgstr "或"
#. module: stock
#: selection:stock.picking,invoice_state:0
@@ -4399,7 +4399,7 @@
#: code:addons/stock/stock.py:1213
#, python-format
msgid "You cannot remove the picking which is in %s state!"
-msgstr ""
+msgstr "您不能移除 %s 狀態的提貨單"
#. module: stock
#: help:res.partner,property_stock_customer:0
=== modified file 'stock/security/stock_security.xml'
--- stock/security/stock_security.xml 2014-03-10 08:54:20 +0000
+++ stock/security/stock_security.xml 2014-04-04 13:10:02 +0000
@@ -10,7 +10,7 @@
<record id="group_stock_manager" model="res.groups">
<field name="name">Manager</field>
<field name="category_id" ref="base.module_category_warehouse_management"/>
- <field name="implied_ids" eval="[(4, ref('group_stock_user'))]"/>
+ <field name="implied_ids" eval="[(4, ref('group_stock_user')), (4, ref('account.group_account_user'))]"/>
<field name="users" eval="[(4, ref('base.user_root'))]"/>
</record>
=== modified file 'stock/stock_demo.yml'
--- stock/stock_demo.yml 2014-03-10 08:54:20 +0000
+++ stock/stock_demo.yml 2014-04-04 13:10:02 +0000
@@ -1,99 +1,107 @@
-
- !record {model: stock.location, id: location_refrigerator}:
- name: Refrigerator
- usage: internal
--
- !record {model: stock.location, id: location_delivery_counter}:
- name: Delivery Counter
- usage: internal
--
- !record {model: stock.location, id: location_refrigerator_small}:
- name: Small Refrigerator
- usage: internal
- location_id: location_refrigerator
+ Only stock manager can create location,warehouse and product, so let's check data with giving the access rights of manager
+-
+ !context
+ uid: 'res_users_stock_manager'
+-
+ !record {model: stock.location, id: location_monitor}:
+ name: chicago shop
+ usage: internal
+-
+ !record {model: stock.location, id: stock_location_output}:
+ name: Output
+ usage: internal
+-
+ !record {model: stock.location, id: location_monitor_small}:
+ name: Small chicago shop
+ usage: internal
+ location_id: location_monitor
-
!record {model: stock.location, id: location_opening}:
name: opening
usage: inventory
-
- !record {model: stock.location, id: location_convenience_shop}:
- name: Convenient Store
+ !record {model: stock.location, id: stock_location_3}:
+ name: IT Suppliers
usage: supplier
-
- !record {model: stock.warehouse, id: warehouse_icecream}:
- name: Ice Cream Shop
- lot_input_id: location_refrigerator
- lot_stock_id: location_refrigerator
- lot_output_id: location_delivery_counter
+ !record {model: stock.warehouse, id: stock_warehouse_shop0}:
+ name: Chicago Warehouse
+ lot_input_id: location_monitor
+ lot_stock_id: location_monitor
+ lot_output_id: stock_location_output
-
- !record {model: product.product, id: product_icecream}:
- default_code: 001
- name: Ice Cream
- type: product
- categ_id: product.product_category_1
- list_price: 100.0
- standard_price: 70.0
- uom_id: product.product_uom_kgm
- uom_po_id: product.product_uom_kgm
- procure_method: make_to_stock
+ !record {model: product.product, id: product_product_6}:
+ default_code: LCD15
+ name: 15” LCD Monitor
+ type: consu
+ categ_id: product.product_category_8
+ list_price: 1200.0
+ standard_price: 800.0
+ uom_id: product.product_uom_unit
+ uom_po_id: product.product_uom_unit
property_stock_inventory: location_opening
valuation: real_time
cost_method: average
- property_stock_account_input: account.o_expense
- property_stock_account_output: account.o_income
- description: Ice cream can be mass-produced and thus is widely available in developed parts of the world. Ice cream can be purchased in large cartons (vats and squrounds) from supermarkets and grocery stores, in smaller quantities from ice cream shops, convenience stores, and milk bars, and in individual servings from small carts or vans at public events.
-
--
- !record {model: stock.production.lot, id: lot_icecream_0}:
- name: Lot0 for Ice cream
- product_id: product_icecream
--
- !record {model: stock.production.lot, id: lot_icecream_1}:
- name: Lot1 for Ice cream
- product_id: product_icecream
--
- !record {model: stock.inventory, id: stock_inventory_icecream}:
- name: Inventory for icecream
--
- !record {model: stock.inventory.line, id: stock_inventory_line_icecream_lot0}:
- product_id: product_icecream
- product_uom: product.product_uom_kgm
- inventory_id: stock_inventory_icecream
+ property_stock_account_input: account.conf_o_income
+ property_stock_account_output: account.a_expense
+-
+ Stock user can handled production lot,inventory and picking, so let's check data with giving the access rights of user
+-
+ !context
+ uid: 'res_users_stock_user'
+-
+ !record {model: stock.production.lot, id: lot_monitor_0}:
+ name: Lot0 for LCD Monitor
+ product_id: product_product_6
+-
+ !record {model: stock.production.lot, id: lot_monitor_1}:
+ name: Lot1 for LCD Monitor
+ product_id: product_product_6
+-
+ !record {model: stock.inventory, id: stock_inventory_0}:
+ name: Starting Inventory
+ state: draft
+-
+ !record {model: stock.inventory.line, id: stock_inventory_line_3}:
+ product_id: product_product_6
+ product_uom: product.product_uom_unit
+ inventory_id: stock_inventory_0
product_qty: 50.0
- prod_lot_id: lot_icecream_0
- location_id: location_refrigerator
+ prod_lot_id: lot_monitor_0
+ location_id: location_monitor
-
- !record {model: stock.inventory.line, id: stock_inventory_line_icecream_lot1}:
- product_id: product_icecream
- product_uom: product.product_uom_kgm
- inventory_id: stock_inventory_icecream
+ !record {model: stock.inventory.line, id: stock_inventory_line_monitor}:
+ product_id: product_product_6
+ product_uom: product.product_uom_unit
+ inventory_id: stock_inventory_0
product_qty: 40.0
- prod_lot_id: lot_icecream_1
- location_id: location_refrigerator
+ prod_lot_id: lot_monitor_1
+ location_id: location_monitor
-
!record {model: stock.picking, id: outgoing_shipment}:
type: out
- location_dest_id: location_delivery_counter
+ location_dest_id: stock_location_output
-
- !record {model: stock.move, id: outgoing_shipment_icecream}:
+ !record {model: stock.move, id: outgoing_shipment_monitor}:
picking_id: outgoing_shipment
- product_id: product_icecream
- product_uom: product.product_uom_kgm
+ product_id: product_product_6
+ product_uom: product.product_uom_unit
product_qty: 130.0
- location_id: location_refrigerator
- location_dest_id: location_delivery_counter
+ location_id: location_monitor
+ location_dest_id: stock_location_output
-
!record {model: stock.picking, id: incomming_shipment}:
type: in
invoice_state: 2binvoiced
partner_id: base.res_partner_address_9
- location_dest_id: location_refrigerator
+ location_dest_id: location_monitor
-
- !record {model: stock.move, id: incomming_shipment_icecream}:
+ !record {model: stock.move, id: incomming_shipment_monitor}:
picking_id: incomming_shipment
- product_id: product_icecream
- product_uom: product.product_uom_kgm
+ product_id: product_product_6
+ product_uom: product.product_uom_unit
product_qty: 50.0
- location_id: location_convenience_shop
- location_dest_id: location_refrigerator
+ location_id: stock_location_3
+ location_dest_id: location_monitor
=== modified file 'stock/test/opening_stock.yml'
--- stock/test/opening_stock.yml 2014-03-10 08:54:20 +0000
+++ stock/test/opening_stock.yml 2014-04-04 13:10:02 +0000
@@ -1,67 +1,87 @@
-
- I update the price of the Ice-cream.
+ Only stock manager can change the price and update stock of products, so let's check data with giving the access rights of manager
+-
+ !context
+ uid: 'res_users_stock_manager'
+-
+ I update the price of the 15” LCD Monitor.
-
!python {model: stock.change.standard.price}: |
- context.update({'active_model':'product.product', 'active_id': ref('product_icecream'), 'active_ids':[ref('product_icecream')]})
+ context.update({'active_model':'product.product', 'active_id': ref('product_product_6'), 'active_ids':[ref('product_product_6')]})
-
!record {model: stock.change.standard.price, id: change_price}:
- new_price: 120
+ new_price: 1500
-
!python {model: stock.change.standard.price}: |
self.change_price(cr, uid, [ref('change_price')], context=context)
-
- I check price of Ice-cream after update price.
+ I check price of 15” LCD Monitor after update price.
-
!python {model: product.product}: |
- product = self.browse(cr, uid, ref('product_icecream'), context=context)
- assert product.standard_price == 120, "Price is not updated."
+ product = self.browse(cr, uid, ref('product_product_6'), context=context)
+ assert product.standard_price == 1500, "Price is not updated."
-
- I update the current stock of the Ice-cream with 10 kgm in Small Refrigerator in lot0.
+ I update the current stock of the 15” LCD Monitor with 10 unit in stock location shop1 in lot0.
-
!record {model: stock.change.product.qty, id: change_qty}:
- location_id: location_refrigerator_small
+ location_id: location_monitor_small
new_quantity: 10
- product_id: product_icecream
- prodlot_id: lot_icecream_1
+ product_id: product_product_6
+ prodlot_id: lot_monitor_1
-
!python {model: stock.change.product.qty}: |
self.change_product_qty(cr, uid, [ref('change_qty')], context=context)
-
- I check available stock of Ice-cream after update stock.
+ I check available stock of 15” LCD Monitor after update stock.
-
!python {model: product.product}: |
- product = self.browse(cr, uid, ref('product_icecream'), context=context)
+ product = self.browse(cr, uid, ref('product_product_6'), context=context)
assert product.qty_available == 10, "Stock is not updated."
-
+ Stock user can merge inventory, so let's check data with giving the access rights of user.
+-
+ !context
+ uid: 'res_users_stock_user'
+-
I merge inventory.
-
!python {model: stock.inventory.merge }: |
- context.update({'active_model': 'stock.inventory', 'active_id': ref('stock_inventory_icecream'), 'active_ids': [ref('stock_inventory_icecream')]})
+ context.update({'active_model': 'stock.inventory', 'active_id': ref('stock_inventory_0'), 'active_ids': [ref('stock_inventory_0')]})
-
!record {model: stock.inventory.merge, id: merge_inventory}:
-
!python {model: stock.inventory.merge }: |
self.do_merge(cr, uid, [ref('merge_inventory')], context=context)
-
+ Only stock manager cancelled inventory, so let's check data with giving the access rights of manager
+-
+ !context
+ uid: 'res_users_stock_manager'
+-
I cancel inventory.
-
!python {model: stock.inventory}: |
- self.action_cancel_inventory(cr, uid, [ref('stock_inventory_icecream')])
+ self.action_cancel_inventory(cr, uid, [ref('stock_inventory_0')])
+-
+ stock user can reset inventory, so let's check data with giving the access rights of user
+-
+ !context
+ uid: 'res_users_stock_user'
-
I reset to draft inventory.
-
!python {model: stock.inventory}: |
- self.action_cancel_draft(cr, uid, [ref('stock_inventory_icecream')])
+ self.action_cancel_draft(cr, uid, [ref('stock_inventory_0')])
-
- I confirm physical inventory of Ice-cream which are came in different lots.
+ I confirm physical inventory of 15” LCD Monitor which are came in different lots.
-
!python {model: stock.inventory}: |
- self.action_confirm(cr, uid, [ref('stock_inventory_icecream')], context=context)
+ self.action_confirm(cr, uid, [ref('stock_inventory_0')], context=context)
-
I check move details after confirmed physical inventory.
-
!python {model: stock.inventory}: |
- inventory = self.browse(cr, uid, ref('stock_inventory_icecream'), context=context)
+ inventory = self.browse(cr, uid, ref('stock_inventory_0'), context=context)
assert len(inventory.move_ids) == len(inventory.inventory_line_id), "moves are not correspond."
for move_line in inventory.move_ids:
for line in inventory.inventory_line_id:
@@ -77,15 +97,15 @@
I split inventory line.
-
!python {model: stock.inventory.line.split}: |
- context.update({'active_model': 'stock.inventory.line', 'active_id': ref('stock_inventory_line_icecream_lot0'), 'active_ids': [ref('stock_inventory_line_icecream_lot0')]})
+ context.update({'active_model': 'stock.inventory.line', 'active_id': ref('stock_inventory_line_3'), 'active_ids': [ref('stock_inventory_line_3')]})
-
!record {model: stock.inventory.line.split, id: split_inventory_lot0}:
use_exist: True
line_exist_ids:
- quantity: 6
- prodlot_id: lot_icecream_0
+ prodlot_id: lot_monitor_0
- quantity: 4
- prodlot_id: lot_icecream_0
+ prodlot_id: lot_monitor_0
-
!python {model: stock.inventory.line.split }: |
self.split_lot(cr, uid, [ref('split_inventory_lot0')], context=context)
@@ -93,39 +113,49 @@
I fill inventory line.
-
!python {model: stock.fill.inventory}: |
- context.update({'active_model': 'stock.inventory', 'active_id': ref('stock_inventory_icecream'), 'active_ids': [ref('stock_inventory_icecream')]})
+ context.update({'active_model': 'stock.inventory', 'active_id': ref('stock_inventory_0'), 'active_ids': [ref('stock_inventory_0')]})
-
!record {model: stock.fill.inventory, id: fill_inventory}:
- location_id: location_refrigerator
+ location_id: location_monitor
recursive: True
-
!python {model: stock.fill.inventory }: |
self.fill_inventory(cr, uid, [ref('fill_inventory')], context=context)
-
- Now I check vitual stock of Ice-cream after confirmed physical inventory.
+ Now I check vitual stock of 15” LCD Monitor after confirmed physical inventory.
-
!python {model: product.product}: |
- product = self.browse(cr, uid, ref('product_icecream'), context=context)
+ product = self.browse(cr, uid, ref('product_product_6'), context=context)
assert product.virtual_available == 100, "Vitual stock is not updated."
-
- I close physical inventory of Ice-cream.
--
- !python {model: stock.inventory}: |
- self.action_done(cr, uid, [ref('stock_inventory_icecream')], context=context)
--
- I check closed move and real stock of Ice-cream after closed physical inventory.
--
- !python {model: stock.inventory}: |
- inventory = self.browse(cr, uid, ref('stock_inventory_icecream'), context=context)
+ Only stock manager can close physical inventory, so let's check data with giving the access rights of manager
+-
+ !context
+ uid: 'res_users_stock_manager'
+-
+ I close physical inventory of 15” LCD Monitor.
+-
+ !python {model: stock.inventory}: |
+ self.action_done(cr, uid, [ref('stock_inventory_0')], context=context)
+-
+ Stock user can check closed move and real stock, so let's check data with giving the access rights of user
+-
+ !context
+ uid: 'res_users_stock_user'
+-
+ I check closed move and real stock of 15” LCD Monitor after closed physical inventory.
+-
+ !python {model: stock.inventory}: |
+ inventory = self.browse(cr, uid, ref('stock_inventory_0'), context=context)
assert inventory.state == 'done', "inventory is not closed."
for move_line in inventory.move_ids:
assert move_line.state == 'done', "Move is not closed."
- product = self.pool.get('product.product').browse(cr, uid, ref('product_icecream'), context=context)
+ product = self.pool.get('product.product').browse(cr, uid, ref('product_product_6'), context=context)
product.qty_available == 100, "Real stock is not updated."
-
I check stock in lot.
-
!python {model: stock.production.lot}: |
- lot = self.browse(cr, uid, ref('lot_icecream_0'), context=context)
+ lot = self.browse(cr, uid, ref('lot_monitor_0'), context=context)
assert lot.stock_available == 50, "Stock in lot is not correspond."
=== modified file 'stock/test/shipment.yml'
--- stock/test/shipment.yml 2012-05-08 21:22:45 +0000
+++ stock/test/shipment.yml 2014-04-04 13:10:02 +0000
@@ -1,9 +1,14 @@
-
- I confirm outgoing shipment of 130 kgm Ice-cream.
+ Stock manager can only test whole process related to Shipment, so let's check data with stock manager.
+-
+ !context
+ uid: 'res_users_stock_manager'
+-
+ I confirm outgoing shipment of 130 Unit 15” LCD Monitor.
-
!workflow {model: stock.picking, action: button_confirm, ref: outgoing_shipment}
-
- I check shipment details after confirmed.
+ I check shipment details after confirmation.
-
!python {model: stock.picking}: |
shipment = self.browse(cr, uid, ref("outgoing_shipment"))
@@ -12,147 +17,151 @@
assert move_line.state == "confirmed", "Move should be confirmed."
-
- Now I check vitual stock of Ice-cream after confirmed outgoing shipment.
+ Now, I check virtual stock of 15” LCD Monitor after confirming outgoing shipment.
-
!python {model: product.product}: |
- product = self.browse(cr, uid, ref('product_icecream'), context=context)
- product.virtual_available == -30, "Vitual stock is not updated."
+ product = self.browse(cr, uid, ref('product_product_6'), context=context)
+ assert product.virtual_available == -30, "Virtual stock is not updated."
-
- I confirm incomming shipment of 50 kgm Ice-cream.
+ I confirm incoming shipment of 50 Unit 15” LCD Monitor.
-
!workflow {model: stock.picking, action: button_confirm, ref: incomming_shipment}
-
- I receive 40kgm Ice-cream so I make backorder of incomming shipment for 40 kgm.
+ I split incoming shipment into lots. each lot contain 10 Unit 15” LCD Monitor.
+-
+ !python {model: stock.picking}: |
+ shipment = self.browse(cr, uid, ref("incomming_shipment"))
+ move_ids = [x.id for x in shipment.move_lines]
+ context.update({'active_model': 'stock.move', 'active_id': move_ids[0], 'active_ids': move_ids})
+-
+ !record {model: stock.move.split, id: split_lot_incoming}:
+ line_ids:
+ - name: incoming_lot0
+ quantity: 10
+ - name: incoming_lot1
+ quantity: 10
+ - name: incoming_lot2
+ quantity: 10
+ - name: incoming_lot3
+ quantity: 10
+-
+ !python {model: stock.move.split }: |
+ self.split_lot(cr, uid, [ref('split_lot_incoming')], context=context)
+-
+ I check move lines after splitting.
+-
+ !python {model: stock.move}: |
+ mm = self.browse(cr, uid, ref("incomming_shipment_monitor"))
+ lot = self.pool.get('stock.move.split').browse(cr, uid, ref('split_lot_incoming'), context=context)
+ lot_ids = self.pool.get('stock.production.lot').search(cr, uid, [('name','in',[x.name for x in lot.line_ids])])
+ assert len(lot_ids) == 4, 'lots of incoming shipment are not correspond.'
+ move_ids = self.search(cr, uid, [('location_dest_id','=',ref('location_monitor')),('prodlot_id','in',lot_ids)])
+ assert len(move_ids) == 4, 'move lines are not correspond per production lot after splitting.'
+ for move in self.browse(cr, uid, move_ids, context=context):
+ assert move.prodlot_id.name in ['incoming_lot0', 'incoming_lot1', 'incoming_lot2', 'incoming_lot3'], "lot does not correspond."
+ assert move.product_qty == 10, "qty does not correspond per production lot."
+-
+ I receive 40 units of 15” LCD Monitor.
-
!python {model: stock.partial.picking}: |
context.update({'active_model': 'stock.picking', 'active_id': ref('incomming_shipment'), 'active_ids': [ref('incomming_shipment')]})
-
- !record {model: stock.partial.picking, id: partial_incomming}:
- move_ids:
- - quantity: 40
- product_id: product_icecream
- product_uom: product.product_uom_kgm
- move_id: incomming_shipment_icecream
- location_id: location_convenience_shop
- location_dest_id: location_refrigerator
--
- !python {model: stock.partial.picking }: |
- self.do_partial(cr, uid, [ref('partial_incomming')], context=context)
--
- I check backorder shipment after received partial shipment.
+ !python {model: stock.partial.picking}: |
+ partial = []
+ for move in self.pool.get('stock.picking').browse(cr, uid, ref("incomming_shipment")).move_lines:
+ if move.prodlot_id:
+ partial.append((0, 0, {
+ 'quantity': move.product_qty,
+ 'product_id': move.product_id.id,
+ 'product_uom': move.product_uom.id,
+ 'move_id': move.id,
+ 'location_id': move.location_id.id,
+ 'location_dest_id': move.location_dest_id.id,
+ 'prodlot_id': move.prodlot_id.id,
+ 'cost': move.product_id.standard_price
+ }))
+ partial_id = self.create(cr, uid, {'move_ids': partial}, context=context)
+ self.do_partial(cr, uid, [partial_id], context=context)
+-
+ I check backorder shipment after receiving partial shipment.
-
!python {model: stock.picking}: |
shipment = self.browse(cr, uid, ref("incomming_shipment"))
backorder = shipment.backorder_id
assert backorder, "Backorder should be created after partial shipment."
- assert backorder.state == 'done', "Backorder should be close after received."
+ assert backorder.state == 'done', "Backorder should be closed after received."
+ qty = 0
for move_line in backorder.move_lines:
- assert move_line.product_qty == 40, "Qty in backorder does not correspond."
assert move_line.state == 'done', "Move line of backorder should be closed."
--
- I receive another 10kgm Ice-cream.
--
- !record {model: stock.partial.picking, id: partial_incomming}:
+ qty += move_line.product_qty
+ assert qty == 40, "Qty in backorder does not correspond."
+-
+ I receive another 10 units of 15” LCD Monitor.
+-
+ !record {model: stock.partial.picking, id: partial_incoming}:
move_ids:
- quantity: 10
- product_id: product_icecream
- product_uom: product.product_uom_kgm
- move_id: incomming_shipment_icecream
- location_id: location_convenience_shop
- location_dest_id: location_refrigerator
+ product_id: product_product_6
+ product_uom: product.product_uom_unit
+ move_id: incomming_shipment_monitor
+ location_id: stock_location_3
+ location_dest_id: location_monitor
-
!python {model: stock.partial.picking }: |
- self.do_partial(cr, uid, [ref('partial_incomming')], context=context)
-
+ self.do_partial(cr, uid, [ref('partial_incoming')], context=context)
-
- I check incomming shipment after received.
+ I check incoming shipment after receiving it.
-
!python {model: stock.picking}: |
shipment = self.browse(cr, uid, ref("incomming_shipment"))
- assert shipment.state == 'done', "shipment should be close after received."
+ assert shipment.state == 'done', "shipment should be closed after receiving."
for move_line in shipment.move_lines:
assert move_line.product_qty == 10, "Qty does not correspond."
assert move_line.product_id.virtual_available == 20, "Virtual stock does not correspond."
assert move_line.state == 'done', "Move line should be closed."
-
--
- I return last incomming shipment for 10 kgm Ice-cream.
--
- !record {model: stock.return.picking, id: return_incomming}:
+-
+ I return last incoming shipment for 10 Unit 15” LCD Monitor.
+-
+ !record {model: stock.return.picking, id: return_incoming}:
invoice_state: none
-
!python {model: stock.return.picking }: |
# this work without giving the id of the picking to return, magically, thanks to the context
- self.create_returns(cr, uid, [ref('return_incomming')], context=context)
+ self.create_returns(cr, uid, [ref('return_incoming')], context=context)
-
- I cancel incomming shipment after return it.
+ I cancel incoming shipment after returning it.
-
!python {model: stock.picking}: |
- # the cancel is not on the return, but on the incomming shipment (which now has a quantity of 10, thanks to the
+ # the cancel is not on the return, but on the incoming shipment (which now has a quantity of 10, thanks to the
# backorder). This situation is a little weird as we returned a move that we finally cancelled... As result, only
- # 30Kg from the original 50Kg will be counted in the stock (50 - 10 (cancelled quantity) - 10 (returned quantity))
+ # 30Unit from the original 50Unit will be counted in the stock (50 - 10 (cancelled quantity) - 10 (returned quantity))
self.action_cancel(cr, uid, [ref("incomming_shipment")], context=context)
-
- I make invoice of backorder of incomming shipment.
+ I make invoice of backorder of incoming shipment.
-
!python {model: stock.invoice.onshipping}: |
shipment = self.pool.get('stock.picking').browse(cr, uid, ref("incomming_shipment"))
context.update({'active_model': 'stock.picking', 'active_id': shipment.backorder_id.id, 'active_ids': [shipment.backorder_id.id]})
-
- !record {model: stock.invoice.onshipping, id: invoice_incomming}:
+ !record {model: stock.invoice.onshipping, id: invoice_incoming}:
group: False
-
!python {model: stock.invoice.onshipping }: |
- self.create_invoice(cr, uid, [ref('invoice_incomming')], context=context)
+ self.create_invoice(cr, uid, [ref('invoice_incoming')], context=context)
-
- I check invoice state of backorder of incomming shipment.
+ I check invoice status of backorder of incoming shipment.
-
!python {model: stock.picking}: |
shipment = self.browse(cr, uid, ref("incomming_shipment"))
- assert shipment.backorder_id.invoice_state == 'invoiced', 'Invoice state is not upadted.'
+ assert shipment.backorder_id.invoice_state == 'invoiced', 'Invoice state is not updated.'
-
- I check available stock after received incomming shipping.
+ I check available stock after receiving incoming shipping.
-
!python {model: product.product}: |
- product = self.browse(cr, uid, ref('product_icecream'), context=context)
+ product = self.browse(cr, uid, ref('product_product_6'), context=context)
assert product.qty_available == 140, "Stock does not correspond."
- assert product.virtual_available == 0, "Vitual stock does not correspond."
--
- I split incomming shipment into lots. each lot contain 10 kgm Ice-cream.
--
- !python {model: stock.picking}: |
- shipment = self.browse(cr, uid, ref("incomming_shipment"))
- move_ids = [x.id for x in shipment.backorder_id.move_lines]
- context.update({'active_model': 'stock.move', 'active_id': move_ids[0], 'active_ids': move_ids})
--
- !record {model: stock.move.split, id: split_lot_incomming}:
- line_ids:
- - name: incoming_lot0
- quantity: 10
- - name: incoming_lot1
- quantity: 10
- - name: incoming_lot2
- quantity: 10
- - name: incoming_lot3
- quantity: 10
-
--
- !python {model: stock.move.split }: |
- self.split_lot(cr, uid, [ref('split_lot_incomming')], context=context)
--
- I check move lines after spliting
--
- !python {model: stock.move}: |
- lot = self.pool.get('stock.move.split').browse(cr, uid, ref('split_lot_incomming'), context=context)
- lot_ids = self.pool.get('stock.production.lot').search(cr, uid, [('name','in',[x.name for x in lot.line_ids])])
- assert len(lot_ids) == 4, 'lots of incomming shipment are not correspond.'
- move_ids = self.search(cr, uid, [('location_dest_id','=',ref('location_refrigerator')),('prodlot_id','in',lot_ids)])
- assert len(move_ids) == 4, 'move lines are not correspond per prodcution lot after splited.'
- for move in self.browse(cr, uid, move_ids, context=context):
- assert move.prodlot_id.name in ['incoming_lot0', 'incoming_lot1', 'incoming_lot2', 'incoming_lot3'], "lot does not correspond."
- assert move.product_qty == 10, "qty does not correspond per production lot."
- context.update({'active_model':'stock.move', 'active_id':move_ids[0],'active_ids': move_ids})
+ assert product.virtual_available == 0, "Virtual stock does not correspond."
-
I check the stock valuation account entries.
-
@@ -161,91 +170,90 @@
account_move_ids = self.search(cr, uid, [('ref','=',incomming_shipment.name)])
assert len(account_move_ids), "account move should be created."
account_move = self.browse(cr, uid, account_move_ids[0], context=context)
- assert len(account_move.line_id) == len(incomming_shipment.move_lines) + 1, 'accuont entries are not correspond.'
+ assert len(account_move.line_id) == len(incomming_shipment.move_lines) + 1, 'Accounting entries does not correspond.'
for account_move_line in account_move.line_id:
for stock_move in incomming_shipment.move_lines:
if account_move_line.account_id.id == stock_move.product_id.property_stock_account_input.id:
- assert account_move_line.credit == 800.0, "Credit amount does not correspond."
+ assert account_move_line.credit == 14000.0, "Credit amount does not correspond."
assert account_move_line.debit == 0.0, "Debit amount does not correspond."
else:
assert account_move_line.credit == 0.0, "Credit amount does not correspond."
- assert account_move_line.debit == 800.0, "Debit amount does not correspond."
--
- I consume 1 kgm ice-cream from each incoming lots into internal production.
--
- !record {model: stock.move.consume, id: consume_lot_incomming}:
- product_qty: 1
- location_id: location_refrigerator
--
- !python {model: stock.move.consume}: |
- self.do_move_consume(cr, uid, [ref('consume_lot_incomming')], context=context)
--
- I scrap 10 gm ice-cream from each incoming lots into scrap location.
--
- !record {model: stock.move.scrap, id: scrap_lot_incomming}:
- product_qty: 0.010
--
- !python {model: stock.move.scrap}: |
- self.move_scrap(cr, uid, [ref('scrap_lot_incomming')], context=context)
--
- I check stock in scrap location and refrigerator location.
--
- !python {model: stock.location}: |
- ctx = {'product_id': ref('product_icecream')}
- refrigerator_location = self.pool.get('stock.location').browse(cr, uid, ref('location_refrigerator'), context=ctx)
- assert refrigerator_location.stock_real == 135.96, 'stock does not correspond in refrigerator location.'
- scrapped_location = self.browse(cr, uid, ref('stock_location_scrapped'), context=ctx)
- assert scrapped_location.stock_real == 0.010*4, 'scraped stock does not correspond in scrap location.'
-
--
- I check availabile stock after consumed and scraped.
--
- !python {model: product.product}: |
- product = self.browse(cr, uid, ref('product_icecream'), context=context)
- assert product.qty_available == 135.96, "Stock does not correspond."
- assert round(product.virtual_available, 2) == -4.04, "Vitual stock does not correspond."
+ assert account_move_line.debit == 14000.0, "Debit amount does not correspond."
-
I trace all incoming lots.
-
!python {model: stock.production.lot }: |
- lot = self.pool.get('stock.move.split').browse(cr, uid, ref('split_lot_incomming'), context=context)
+ lot = self.pool.get('stock.move.split').browse(cr, uid, ref('split_lot_incoming'), context=context)
lot_ids = self.search(cr, uid, [('name', 'in', [x.name for x in lot.line_ids])])
self.action_traceability(cr, uid, lot_ids, context=context)
-
- I check outgoing shipment after stock availablity in refrigerator.
+ I check outgoing shipment after stock availability in Chicago shop.
-
!python {model: stock.picking}: |
shipment = self.browse(cr, uid, ref("outgoing_shipment"), context=context)
- self.pool.get('stock.move').action_assign(cr, uid, [x.id for x in shipment.move_lines]) #TOFIX: assignment of move lines should be call before testing assigment otherwise picking never gone in assign state
- #TOFIX: shipment should be assigned if stock available
- #assert shipment.state == "assigned", "Shipment should be assigned."
- #for move_line in shipment.move_lines:
- # assert move_line.state == "assigned", "Move should be assigned."
+ self.pool.get('stock.move').action_assign(cr, uid, [x.id for x in shipment.move_lines])
+ assert shipment.state == "assigned", "Shipment should be assigned."
+ for move_line in shipment.move_lines:
+ assert move_line.state == "assigned", "Move should be assigned."
self.force_assign(cr, uid, [shipment.id])
--
- I deliver 5kgm Ice-cream to customer so I make partial deliver
+ context.update({'active_model':'stock.move', 'active_id':shipment.move_lines[0].id,'active_ids': [shipment.move_lines[0].id]})
+-
+ I scrap 4 units of 15” LCD Monitor into scrap location.
+-
+ !record {model: stock.move.scrap, id: scrap_monitor1}:
+ product_qty: 4
+-
+ !python {model: stock.move.scrap}: |
+ self.move_scrap(cr, uid, [ref('scrap_monitor1')], context=context)
+-
+ I consume 4 units of 15” LCD Monitor.
+-
+ !record {model: stock.move.consume, id: consume_monitor1}:
+ product_qty: 4
+ location_id: location_monitor
+-
+ !python {model: stock.move.consume}: |
+ self.do_move_consume(cr, uid, [ref('consume_monitor1')], context=context)
+-
+ I check stock in scrap location and stock location.
+-
+ !python {model: stock.location}: |
+ ctx = {'product_id': ref('product_product_6')}
+ monitor_location = self.pool.get('stock.location').browse(cr, uid, ref('location_monitor'), context=ctx)
+ assert monitor_location.stock_real == 132.0, 'stock does not correspond in stock location shop0.'
+ scrapped_location = self.browse(cr, uid, ref('stock_location_scrapped'), context=ctx)
+ assert scrapped_location.stock_real == 4, 'scraped stock does not correspond in scrap location.'
+-
+ I check available stock after consumed and scraped move.
+-
+ !python {model: product.product}: |
+ product = self.browse(cr, uid, ref('product_product_6'), context=context)
+ assert product.qty_available == 132.0, "Stock does not correspond."
+ assert round(product.virtual_available, 2) == -4.00, "Virtual stock does not correspond."
+-
+ I deliver 5 Unit 15” LCD Monitor to customer partially.
-
!python {model: stock.partial.move}: |
- context.update({'active_model': 'stock.move', 'active_id': ref('outgoing_shipment_icecream'), 'active_ids': [ref('outgoing_shipment_icecream')]})
+ context.update({'active_model': 'stock.move', 'active_id': ref('outgoing_shipment_monitor'), 'active_ids': [ref('outgoing_shipment_monitor')]})
-
- !record {model: stock.partial.move, id: partial_outgoing_icecream}:
+ !record {model: stock.partial.move, id: partial_outgoing_monitor}:
move_ids:
- quantity: 5
- product_id: product_icecream
- product_uom: product.product_uom_kgm
- move_id: outgoing_shipment_icecream
- location_id: location_refrigerator
- location_dest_id: location_delivery_counter
+ product_id: product_product_6
+ product_uom: product.product_uom_unit
+ move_id: outgoing_shipment_monitor
+ location_id: location_monitor
+ location_dest_id: stock_location_output
-
!python {model: stock.partial.move }: |
- self.do_partial(cr, uid, [ref('partial_outgoing_icecream')], context=context)
+ self.do_partial(cr, uid, [ref('partial_outgoing_monitor')], context=context)
-
- I packing outgoing shipment into box per 10kgm with unique tracking lot.
+ I pack outgoing shipment into box of 10 Unit with unique tracking lot.
-
!python {model: stock.move}: |
stock_split = self.pool.get('stock.split.into')
- move = self.browse(cr, uid, ref('outgoing_shipment_icecream'), context=context)
+ move = self.browse(cr, uid, ref('outgoing_shipment_monitor'), context=context)
context.update({'active_model': 'stock.move', 'active_id': move.id, 'active_ids': [move.id]})
total_qty = move.product_qty
split_qty = 10
@@ -254,7 +262,7 @@
stock_split.split(cr, uid, [split_id], context=context)
total_qty -= split_qty
-
- I deliver outgoing shipment.
+ I deliver the outgoing shipment.
-
!python {model: stock.partial.picking}: |
context.update({'active_model': 'stock.picking', 'active_id': ref('outgoing_shipment'), 'active_ids': [ref('outgoing_shipment')]})
@@ -266,7 +274,7 @@
self.do_partial(cr, uid, [ref('partial_outgoing')], context=context)
-
- I check outgoing shipment after deliver.
+ I check outgoing shipment after delivery.
-
!python {model: stock.picking}: |
shipment = self.browse(cr, uid, ref("outgoing_shipment"), context=context)
@@ -274,9 +282,9 @@
for move_line in shipment.move_lines:
assert move_line.state == "done", "Move should be closed."
-
- I check availaible stock after deliver.
+ I check available stock after delivery.
-
!python {model: product.product}: |
- product = self.browse(cr, uid, ref('product_icecream'), context=context)
- assert round(product.qty_available, 2) == 5.96, "Stock does not correspond."
- assert round(product.virtual_available, 2) == -4.04, "Vitual stock does not correspond."
+ product = self.browse(cr, uid, ref('product_product_6'), context=context)
+ assert round(product.qty_available, 2) == 6, "Stock does not correspond."
+ assert round(product.virtual_available, 2) == -4.00, "Virtual stock does not correspond."
=== modified file 'stock/test/stock_report.yml'
--- stock/test/stock_report.yml 2011-12-21 11:38:22 +0000
+++ stock/test/stock_report.yml 2014-04-04 13:10:02 +0000
@@ -1,9 +1,14 @@
-
+ Stock user can print all reports related to stock, so let's check data with giving the access rights of user.
+-
+ !context
+ uid: 'res_users_stock_user'
+-
I print a stock overview report of location.
-
!python {model: stock.location}: |
import netsvc, tools, os
- (data, format) = netsvc.LocalService('report.lot.stock.overview').create(cr, uid, [ref('location_refrigerator')], {}, {})
+ (data, format) = netsvc.LocalService('report.lot.stock.overview').create(cr, uid, [ref('location_monitor')], {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'stock-overview'+format), 'wb+').write(data)
-
@@ -11,7 +16,7 @@
-
!python {model: stock.location}: |
import netsvc, tools, os
- (data, format) = netsvc.LocalService('report.lot.stock.overview_all').create(cr, uid, [ref('location_refrigerator')], {}, {})
+ (data, format) = netsvc.LocalService('report.lot.stock.overview_all').create(cr, uid, [ref('location_monitor')], {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'stock-overviewall'+format), 'wb+').write(data)
-
@@ -19,7 +24,7 @@
-
!python {model: stock.inventory}: |
import netsvc, tools, os
- (data, format) = netsvc.LocalService('report.stock.inventory.move').create(cr, uid, [ref('stock_inventory_icecream')], {}, {})
+ (data, format) = netsvc.LocalService('report.stock.inventory.move').create(cr, uid, [ref('stock_inventory_0')], {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'stock-stock_inventory_move.'+format), 'wb+').write(data)
-
@@ -35,7 +40,7 @@
-
!python {model: product.product}: |
import netsvc, tools, os
- (data, format) = netsvc.LocalService('report.stock.product.history').create(cr, uid, [ref('product_icecream')], {}, {})
+ (data, format) = netsvc.LocalService('report.stock.product.history').create(cr, uid, [ref('product_product_6')], {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'stock-product_stock_report.'+format), 'wb+').write(data)
=== added file 'stock/test/stock_users.yml'
--- stock/test/stock_users.yml 1970-01-01 00:00:00 +0000
+++ stock/test/stock_users.yml 2014-04-04 13:10:02 +0000
@@ -0,0 +1,30 @@
+-
+ Create a user as 'Stock Manager'
+-
+ !record {model: res.users, id: res_users_stock_manager}:
+ company_id: base.main_company
+ name: Stock Manager
+ login: sam
+ password: sam
+ email: stockmanager@xxxxxxxxxxxxxxx
+-
+ I added groups for Stock Manager.
+-
+ !record {model: res.users, id: res_users_stock_manager}:
+ groups_id:
+ - stock.group_stock_manager
+-
+ Create a user as 'Stock User'
+-
+ !record {model: res.users, id: res_users_stock_user}:
+ company_id: base.main_company
+ name: Stock User
+ login: sau
+ password: sau
+ email: stockuser@xxxxxxxxxxxxxxx
+-
+ I added groups for Stock User.
+-
+ !record {model: res.users, id: res_users_stock_user}:
+ groups_id:
+ - stock.group_stock_user
Follow ups