[MERGE] lp:~openerp-dev/openobject-addons/trunk-pos-fva

bzr revid: stw@openerp.com-20120504131853-rip17dks4fjxzwbp
This commit is contained in:
Stephane Wirtel 2012-05-04 15:18:53 +02:00
commit 0f8529cb36
21 changed files with 8459 additions and 606 deletions

View File

@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:35+0000\n"
"PO-Revision-Date: 2012-04-28 01:14+0000\n"
"PO-Revision-Date: 2012-05-02 18:40+0000\n"
"Last-Translator: Akira Hiyama <Unknown>\n"
"Language-Team: Japanese <ja@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-04-29 04:45+0000\n"
"X-Generator: Launchpad (build 15149)\n"
"X-Launchpad-Export-Date: 2012-05-03 05:26+0000\n"
"X-Generator: Launchpad (build 15185)\n"
#. module: account
#: view:account.invoice.report:0
@ -8071,7 +8071,7 @@ msgstr "税金はパーセンテージタイプのため、0から1の間の%比
#. module: account
#: view:account.analytic.account:0
msgid "Current Accounts"
msgstr "現在のアカウント"
msgstr "当座預金"
#. module: account
#: view:account.invoice.report:0

View File

@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 00:35+0000\n"
"PO-Revision-Date: 2012-03-27 01:25+0000\n"
"PO-Revision-Date: 2012-05-03 02:11+0000\n"
"Last-Translator: Jeff Wang <wjfonhand@hotmail.com>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-03-28 04:45+0000\n"
"X-Generator: Launchpad (build 15027)\n"
"X-Launchpad-Export-Date: 2012-05-03 05:26+0000\n"
"X-Generator: Launchpad (build 15185)\n"
#. module: account
#: view:account.invoice.report:0
@ -1811,7 +1811,7 @@ msgstr "基于"
#: field:account.invoice,move_id:0
#: field:account.invoice,move_name:0
msgid "Journal Entry"
msgstr "账簿的分录"
msgstr "会计凭证"
#. module: account
#: view:account.tax:0
@ -4663,7 +4663,7 @@ msgstr "税适用"
#: model:ir.ui.menu,name:account.menu_eaction_account_moves_sale
#, python-format
msgid "Journal Items"
msgstr "账簿明细"
msgstr "会计凭证行"
#. module: account
#: code:addons/account/account.py:1088
@ -6492,7 +6492,7 @@ msgstr "当前期间凭证列表"
msgid ""
"Check this box if you want to allow the cancellation the entries related to "
"this journal or of the invoice related to this journal"
msgstr "勾选这里,则此凭证簿下的亏即凭证或发票可以被作废。"
msgstr "勾选这里,则此凭证簿下的会计凭证或发票可以被作废。"
#. module: account
#: view:account.fiscalyear.close:0
@ -6614,7 +6614,7 @@ msgstr "如果你选择了按日期或期间筛选,可以用这个字段按所
#: model:ir.ui.menu,name:account.menu_action_move_journal_line_form
#: model:ir.ui.menu,name:account.menu_finance_entries
msgid "Journal Entries"
msgstr "账簿的分录"
msgstr "会计凭证"
#. module: account
#: help:account.partner.ledger,page_split:0
@ -7588,7 +7588,7 @@ msgstr "销售科目类型"
#. module: account
#: help:account.invoice,move_id:0
msgid "Link to the automatically generated Journal Items."
msgstr "链接到自动生成的账簿明细。"
msgstr "链接到自动生成的会计凭证行"
#. module: account
#: selection:account.installer,period:0

View File

@ -0,0 +1,793 @@
# Finnish translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 01:37+0100\n"
"PO-Revision-Date: 2012-04-30 07:58+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Finnish <fi@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-01 05:29+0000\n"
"X-Generator: Launchpad (build 15171)\n"
#. module: account_asset
#: view:account.asset.asset:0
msgid "Assets in draft and open states"
msgstr ""
#. module: account_asset
#: field:account.asset.category,method_end:0
#: field:account.asset.history,method_end:0 field:asset.modify,method_end:0
msgid "Ending date"
msgstr ""
#. module: account_asset
#: field:account.asset.asset,value_residual:0
msgid "Residual Value"
msgstr ""
#. module: account_asset
#: field:account.asset.category,account_expense_depreciation_id:0
msgid "Depr. Expense Account"
msgstr ""
#. module: account_asset
#: view:asset.depreciation.confirmation.wizard:0
msgid "Compute Asset"
msgstr ""
#. module: account_asset
#: view:asset.asset.report:0
msgid "Group By..."
msgstr ""
#. module: account_asset
#: field:asset.asset.report,gross_value:0
msgid "Gross Amount"
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0 field:account.asset.asset,name:0
#: field:account.asset.depreciation.line,asset_id:0
#: field:account.asset.history,asset_id:0 field:account.move.line,asset_id:0
#: view:asset.asset.report:0 field:asset.asset.report,asset_id:0
#: model:ir.model,name:account_asset.model_account_asset_asset
msgid "Asset"
msgstr ""
#. module: account_asset
#: help:account.asset.asset,prorata:0 help:account.asset.category,prorata:0
msgid ""
"Indicates that the first depreciation entry for this asset have to be done "
"from the purchase date instead of the first January"
msgstr ""
#. module: account_asset
#: field:account.asset.history,name:0
msgid "History name"
msgstr ""
#. module: account_asset
#: field:account.asset.asset,company_id:0
#: field:account.asset.category,company_id:0 view:asset.asset.report:0
#: field:asset.asset.report,company_id:0
msgid "Company"
msgstr ""
#. module: account_asset
#: view:asset.modify:0
msgid "Modify"
msgstr ""
#. module: account_asset
#: selection:account.asset.asset,state:0 view:asset.asset.report:0
#: selection:asset.asset.report,state:0
msgid "Running"
msgstr ""
#. module: account_asset
#: field:account.asset.depreciation.line,amount:0
msgid "Depreciation Amount"
msgstr ""
#. module: account_asset
#: view:asset.asset.report:0
#: model:ir.actions.act_window,name:account_asset.action_asset_asset_report
#: model:ir.model,name:account_asset.model_asset_asset_report
#: model:ir.ui.menu,name:account_asset.menu_action_asset_asset_report
msgid "Assets Analysis"
msgstr ""
#. module: account_asset
#: field:asset.modify,name:0
msgid "Reason"
msgstr ""
#. module: account_asset
#: field:account.asset.asset,method_progress_factor:0
#: field:account.asset.category,method_progress_factor:0
msgid "Degressive Factor"
msgstr ""
#. module: account_asset
#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_list_normal
#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_list_normal
msgid "Asset Categories"
msgstr ""
#. module: account_asset
#: view:asset.depreciation.confirmation.wizard:0
msgid ""
"This wizard will post the depreciation lines of running assets that belong "
"to the selected period."
msgstr ""
#. module: account_asset
#: field:account.asset.asset,account_move_line_ids:0
#: field:account.move.line,entry_ids:0
#: model:ir.actions.act_window,name:account_asset.act_entries_open
msgid "Entries"
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0
#: field:account.asset.asset,depreciation_line_ids:0
msgid "Depreciation Lines"
msgstr ""
#. module: account_asset
#: help:account.asset.asset,salvage_value:0
msgid "It is the amount you plan to have that you cannot depreciate."
msgstr ""
#. module: account_asset
#: field:account.asset.depreciation.line,depreciation_date:0
#: view:asset.asset.report:0 field:asset.asset.report,depreciation_date:0
msgid "Depreciation Date"
msgstr ""
#. module: account_asset
#: field:account.asset.category,account_asset_id:0
msgid "Asset Account"
msgstr ""
#. module: account_asset
#: field:asset.asset.report,posted_value:0
msgid "Posted Amount"
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0 view:asset.asset.report:0
#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_form
#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_form
#: model:ir.ui.menu,name:account_asset.menu_finance_assets
#: model:ir.ui.menu,name:account_asset.menu_finance_config_assets
msgid "Assets"
msgstr ""
#. module: account_asset
#: field:account.asset.category,account_depreciation_id:0
msgid "Depreciation Account"
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0 view:account.asset.category:0
#: view:account.asset.history:0 view:asset.modify:0 field:asset.modify,note:0
msgid "Notes"
msgstr ""
#. module: account_asset
#: field:account.asset.depreciation.line,move_id:0
msgid "Depreciation Entry"
msgstr ""
#. module: account_asset
#: sql_constraint:account.move.line:0
msgid "Wrong credit or debit value in accounting entry !"
msgstr ""
#. module: account_asset
#: view:asset.asset.report:0 field:asset.asset.report,nbr:0
msgid "# of Depreciation Lines"
msgstr ""
#. module: account_asset
#: view:asset.asset.report:0
msgid "Assets in draft state"
msgstr ""
#. module: account_asset
#: field:account.asset.asset,method_end:0
#: selection:account.asset.asset,method_time:0
#: selection:account.asset.category,method_time:0
#: selection:account.asset.history,method_time:0
msgid "Ending Date"
msgstr ""
#. module: account_asset
#: field:account.asset.asset,code:0
msgid "Reference"
msgstr ""
#. module: account_asset
#: constraint:account.invoice:0
msgid "Invalid BBA Structured Communication !"
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0
msgid "Account Asset"
msgstr ""
#. module: account_asset
#: model:ir.actions.act_window,name:account_asset.action_asset_depreciation_confirmation_wizard
#: model:ir.ui.menu,name:account_asset.menu_asset_depreciation_confirmation_wizard
msgid "Compute Assets"
msgstr ""
#. module: account_asset
#: field:account.asset.depreciation.line,sequence:0
msgid "Sequence of the depreciation"
msgstr ""
#. module: account_asset
#: field:account.asset.asset,method_period:0
#: field:account.asset.category,method_period:0
#: field:account.asset.history,method_period:0
#: field:asset.modify,method_period:0
msgid "Period Length"
msgstr ""
#. module: account_asset
#: selection:account.asset.asset,state:0 view:asset.asset.report:0
#: selection:asset.asset.report,state:0
msgid "Draft"
msgstr ""
#. module: account_asset
#: view:asset.asset.report:0
msgid "Date of asset purchase"
msgstr ""
#. module: account_asset
#: help:account.asset.asset,method_number:0
msgid "Calculates Depreciation within specified interval"
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0
msgid "Change Duration"
msgstr ""
#. module: account_asset
#: field:account.asset.category,account_analytic_id:0
msgid "Analytic account"
msgstr ""
#. module: account_asset
#: field:account.asset.asset,method:0 field:account.asset.category,method:0
msgid "Computation Method"
msgstr ""
#. module: account_asset
#: help:account.asset.asset,method_period:0
msgid "State here the time during 2 depreciations, in months"
msgstr ""
#. module: account_asset
#: constraint:account.asset.asset:0
msgid ""
"Prorata temporis can be applied only for time method \"number of "
"depreciations\"."
msgstr ""
#. module: account_asset
#: help:account.asset.history,method_time:0
msgid ""
"The method to use to compute the dates and number of depreciation lines.\n"
"Number of Depreciations: Fix the number of depreciation lines and the time "
"between 2 depreciations.\n"
"Ending Date: Choose the time between 2 depreciations and the date the "
"depreciations won't go beyond."
msgstr ""
#. module: account_asset
#: field:account.asset.asset,purchase_value:0
msgid "Gross value "
msgstr ""
#. module: account_asset
#: constraint:account.asset.asset:0
msgid "Error ! You can not create recursive assets."
msgstr ""
#. module: account_asset
#: help:account.asset.history,method_period:0
msgid "Time in month between two depreciations"
msgstr ""
#. module: account_asset
#: view:asset.asset.report:0 field:asset.asset.report,name:0
msgid "Year"
msgstr "Vuosi"
#. module: account_asset
#: view:asset.modify:0
#: model:ir.actions.act_window,name:account_asset.action_asset_modify
#: model:ir.model,name:account_asset.model_asset_modify
msgid "Modify Asset"
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0
msgid "Other Information"
msgstr "Lisätiedot"
#. module: account_asset
#: field:account.asset.asset,salvage_value:0
msgid "Salvage Value"
msgstr ""
#. module: account_asset
#: field:account.invoice.line,asset_category_id:0 view:asset.asset.report:0
msgid "Asset Category"
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0
msgid "Set to Close"
msgstr ""
#. module: account_asset
#: model:ir.actions.wizard,name:account_asset.wizard_asset_compute
msgid "Compute assets"
msgstr ""
#. module: account_asset
#: model:ir.actions.wizard,name:account_asset.wizard_asset_modify
msgid "Modify asset"
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0
msgid "Assets in closed state"
msgstr ""
#. module: account_asset
#: field:account.asset.asset,parent_id:0
msgid "Parent Asset"
msgstr ""
#. module: account_asset
#: view:account.asset.history:0
#: model:ir.model,name:account_asset.model_account_asset_history
msgid "Asset history"
msgstr ""
#. module: account_asset
#: view:asset.asset.report:0
msgid "Assets purchased in current year"
msgstr ""
#. module: account_asset
#: field:account.asset.asset,state:0 field:asset.asset.report,state:0
msgid "State"
msgstr ""
#. module: account_asset
#: model:ir.model,name:account_asset.model_account_invoice_line
msgid "Invoice Line"
msgstr ""
#. module: account_asset
#: constraint:account.move.line:0
msgid ""
"The selected account of your Journal Entry forces to provide a secondary "
"currency. You should remove the secondary currency on the account or select "
"a multi-currency view on the journal."
msgstr ""
#. module: account_asset
#: view:asset.asset.report:0
msgid "Month"
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0
msgid "Depreciation Board"
msgstr ""
#. module: account_asset
#: model:ir.model,name:account_asset.model_account_move_line
msgid "Journal Items"
msgstr ""
#. module: account_asset
#: field:asset.asset.report,unposted_value:0
msgid "Unposted Amount"
msgstr ""
#. module: account_asset
#: field:account.asset.asset,method_time:0
#: field:account.asset.category,method_time:0
#: field:account.asset.history,method_time:0
msgid "Time Method"
msgstr ""
#. module: account_asset
#: view:account.asset.category:0
msgid "Analytic information"
msgstr ""
#. module: account_asset
#: view:asset.modify:0
msgid "Asset durations to modify"
msgstr ""
#. module: account_asset
#: constraint:account.move.line:0
msgid ""
"The date of your Journal Entry is not in the defined period! You should "
"change the date or remove this constraint from the journal."
msgstr ""
#. module: account_asset
#: field:account.asset.asset,note:0 field:account.asset.category,note:0
#: field:account.asset.history,note:0
msgid "Note"
msgstr ""
#. module: account_asset
#: help:account.asset.asset,method:0 help:account.asset.category,method:0
msgid ""
"Choose the method to use to compute the amount of depreciation lines.\n"
" * Linear: Calculated on basis of: Gross Value / Number of Depreciations\n"
" * Degressive: Calculated on basis of: Remaining Value * Degressive Factor"
msgstr ""
#. module: account_asset
#: help:account.asset.asset,method_time:0
#: help:account.asset.category,method_time:0
msgid ""
"Choose the method to use to compute the dates and number of depreciation "
"lines.\n"
" * Number of Depreciations: Fix the number of depreciation lines and the "
"time between 2 depreciations.\n"
" * Ending Date: Choose the time between 2 depreciations and the date the "
"depreciations won't go beyond."
msgstr ""
#. module: account_asset
#: view:asset.asset.report:0
msgid "Assets in running state"
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0
msgid "Closed"
msgstr ""
#. module: account_asset
#: field:account.asset.asset,partner_id:0
#: field:asset.asset.report,partner_id:0
msgid "Partner"
msgstr ""
#. module: account_asset
#: view:asset.asset.report:0 field:asset.asset.report,depreciation_value:0
msgid "Amount of Depreciation Lines"
msgstr ""
#. module: account_asset
#: view:asset.asset.report:0
msgid "Posted depreciation lines"
msgstr ""
#. module: account_asset
#: constraint:account.move.line:0
msgid "Company must be the same for its related account and period."
msgstr ""
#. module: account_asset
#: field:account.asset.asset,child_ids:0
msgid "Children Assets"
msgstr ""
#. module: account_asset
#: view:asset.asset.report:0
msgid "Date of depreciation"
msgstr ""
#. module: account_asset
#: field:account.asset.history,user_id:0
msgid "User"
msgstr ""
#. module: account_asset
#: field:account.asset.history,date:0
msgid "Date"
msgstr ""
#. module: account_asset
#: view:asset.asset.report:0
msgid "Assets purchased in current month"
msgstr ""
#. module: account_asset
#: constraint:account.move.line:0
msgid "You can not create journal items on an account of type view."
msgstr ""
#. module: account_asset
#: view:asset.asset.report:0
msgid "Extended Filters..."
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0 view:asset.depreciation.confirmation.wizard:0
msgid "Compute"
msgstr ""
#. module: account_asset
#: view:account.asset.category:0
msgid "Search Asset Category"
msgstr ""
#. module: account_asset
#: model:ir.model,name:account_asset.model_asset_depreciation_confirmation_wizard
msgid "asset.depreciation.confirmation.wizard"
msgstr ""
#. module: account_asset
#: field:account.asset.asset,active:0
msgid "Active"
msgstr ""
#. module: account_asset
#: model:ir.actions.wizard,name:account_asset.wizard_asset_close
msgid "Close asset"
msgstr ""
#. module: account_asset
#: field:account.asset.depreciation.line,parent_state:0
msgid "State of Asset"
msgstr ""
#. module: account_asset
#: field:account.asset.depreciation.line,name:0
msgid "Depreciation Name"
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0 field:account.asset.asset,history_ids:0
msgid "History"
msgstr ""
#. module: account_asset
#: sql_constraint:account.invoice:0
msgid "Invoice Number must be unique per Company!"
msgstr ""
#. module: account_asset
#: field:asset.depreciation.confirmation.wizard,period_id:0
msgid "Period"
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0
msgid "General"
msgstr ""
#. module: account_asset
#: field:account.asset.asset,prorata:0 field:account.asset.category,prorata:0
msgid "Prorata Temporis"
msgstr ""
#. module: account_asset
#: view:account.asset.category:0
msgid "Accounting information"
msgstr ""
#. module: account_asset
#: model:ir.model,name:account_asset.model_account_invoice
msgid "Invoice"
msgstr ""
#. module: account_asset
#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_form_normal
msgid "Review Asset Categories"
msgstr ""
#. module: account_asset
#: view:asset.depreciation.confirmation.wizard:0 view:asset.modify:0
msgid "Cancel"
msgstr ""
#. module: account_asset
#: selection:account.asset.asset,state:0 selection:asset.asset.report,state:0
msgid "Close"
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0 view:account.asset.category:0
msgid "Depreciation Method"
msgstr ""
#. module: account_asset
#: field:account.asset.asset,purchase_date:0 view:asset.asset.report:0
#: field:asset.asset.report,purchase_date:0
msgid "Purchase Date"
msgstr ""
#. module: account_asset
#: selection:account.asset.asset,method:0
#: selection:account.asset.category,method:0
msgid "Degressive"
msgstr ""
#. module: account_asset
#: help:asset.depreciation.confirmation.wizard,period_id:0
msgid ""
"Choose the period for which you want to automatically post the depreciation "
"lines of running assets"
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0
msgid "Current"
msgstr ""
#. module: account_asset
#: field:account.asset.depreciation.line,remaining_value:0
msgid "Amount to Depreciate"
msgstr ""
#. module: account_asset
#: field:account.asset.category,open_asset:0
msgid "Skip Draft State"
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0 view:account.asset.category:0
#: view:account.asset.history:0
msgid "Depreciation Dates"
msgstr ""
#. module: account_asset
#: field:account.asset.asset,currency_id:0
msgid "Currency"
msgstr ""
#. module: account_asset
#: field:account.asset.category,journal_id:0
msgid "Journal"
msgstr ""
#. module: account_asset
#: field:account.asset.depreciation.line,depreciated_value:0
msgid "Amount Already Depreciated"
msgstr ""
#. module: account_asset
#: field:account.asset.depreciation.line,move_check:0
#: view:asset.asset.report:0 field:asset.asset.report,move_check:0
msgid "Posted"
msgstr ""
#. module: account_asset
#: help:account.asset.asset,state:0
msgid ""
"When an asset is created, the state is 'Draft'.\n"
"If the asset is confirmed, the state goes in 'Running' and the depreciation "
"lines can be posted in the accounting.\n"
"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 state."
msgstr ""
#. module: account_asset
#: field:account.asset.category,name:0
msgid "Name"
msgstr ""
#. module: account_asset
#: help:account.asset.category,open_asset:0
msgid ""
"Check this if you want to automatically confirm the assets of this category "
"when created by invoices."
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0
msgid "Set to Draft"
msgstr ""
#. module: account_asset
#: selection:account.asset.asset,method:0
#: selection:account.asset.category,method:0
msgid "Linear"
msgstr ""
#. module: account_asset
#: view:asset.asset.report:0
msgid "Month-1"
msgstr ""
#. module: account_asset
#: model:ir.model,name:account_asset.model_account_asset_depreciation_line
msgid "Asset depreciation line"
msgstr ""
#. module: account_asset
#: field:account.asset.asset,category_id:0 view:account.asset.category:0
#: field:asset.asset.report,asset_category_id:0
#: model:ir.model,name:account_asset.model_account_asset_category
msgid "Asset category"
msgstr ""
#. module: account_asset
#: view:asset.asset.report:0
msgid "Assets purchased in last month"
msgstr ""
#. module: account_asset
#: code:addons/account_asset/wizard/wizard_asset_compute.py:49
#, python-format
msgid "Created Asset Moves"
msgstr ""
#. module: account_asset
#: constraint:account.move.line:0
msgid "You can not create journal items on closed account."
msgstr ""
#. module: account_asset
#: model:ir.actions.act_window,help:account_asset.action_asset_asset_report
msgid ""
"From this report, you can have an overview on all depreciation. The tool "
"search can also be used to personalise your Assets reports and so, match "
"this analysis to your needs;"
msgstr ""
#. module: account_asset
#: help:account.asset.category,method_period:0
msgid "State here the time between 2 depreciations, in months"
msgstr ""
#. module: account_asset
#: field:account.asset.asset,method_number:0
#: selection:account.asset.asset,method_time:0
#: field:account.asset.category,method_number:0
#: selection:account.asset.category,method_time:0
#: field:account.asset.history,method_number:0
#: selection:account.asset.history,method_time:0
#: field:asset.modify,method_number:0
msgid "Number of Depreciations"
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0
msgid "Create Move"
msgstr ""
#. module: account_asset
#: view:asset.depreciation.confirmation.wizard:0
msgid "Post Depreciation Lines"
msgstr ""
#. module: account_asset
#: view:account.asset.asset:0
msgid "Confirm Asset"
msgstr ""
#. module: account_asset
#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_tree
#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_tree
msgid "Asset Hierarchy"
msgstr ""

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,355 @@
# Japanese translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:35+0000\n"
"PO-Revision-Date: 2012-05-02 03:38+0000\n"
"Last-Translator: Tomomi Mengelberg <tomomi.mengelberg@aquasys.co.jp>\n"
"Language-Team: Japanese <ja@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-03 05:26+0000\n"
"X-Generator: Launchpad (build 15185)\n"
#. module: account_invoice_layout
#: selection:account.invoice.line,state:0
msgid "Sub Total"
msgstr "小計"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Note:"
msgstr "備考:"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Cancelled Invoice"
msgstr "請求書をキャンセルする。"
#. module: account_invoice_layout
#: selection:account.invoice.line,state:0
#: field:notify.message,name:0
msgid "Title"
msgstr "タイトル"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Disc. (%)"
msgstr "割引. (%)"
#. module: account_invoice_layout
#: selection:account.invoice.line,state:0
msgid "Note"
msgstr "備考"
#. module: account_invoice_layout
#: view:account.invoice.special.msg:0
msgid "Print"
msgstr "印刷"
#. module: account_invoice_layout
#: help:notify.message,msg:0
msgid ""
"This notification will appear at the bottom of the Invoices when printed."
msgstr ""
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Unit Price"
msgstr "単価"
#. module: account_invoice_layout
#: model:ir.model,name:account_invoice_layout.model_notify_message
msgid "Notify By Messages"
msgstr ""
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "VAT :"
msgstr "消費税:"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Tel. :"
msgstr "TEL"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "PRO-FORMA"
msgstr ""
#. module: account_invoice_layout
#: field:account.invoice,abstract_line_ids:0
msgid "Invoice Lines"
msgstr ""
#. module: account_invoice_layout
#: view:account.invoice.line:0
msgid "Seq."
msgstr ""
#. module: account_invoice_layout
#: model:ir.ui.menu,name:account_invoice_layout.menu_finan_config_notify_message
msgid "Notification Message"
msgstr ""
#. module: account_invoice_layout
#: report:account.invoice.layout:0
msgid "Customer Code"
msgstr "顧客コード"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Description"
msgstr "詳細"
#. module: account_invoice_layout
#: help:account.invoice.line,sequence:0
msgid "Gives the sequence order when displaying a list of invoice lines."
msgstr ""
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Price"
msgstr "価格"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Invoice Date"
msgstr "請求日"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
msgid "Taxes:"
msgstr ""
#. module: account_invoice_layout
#: field:account.invoice.line,functional_field:0
msgid "Source Account"
msgstr ""
#. module: account_invoice_layout
#: model:ir.actions.act_window,name:account_invoice_layout.notify_mesage_tree_form
msgid "Write Messages"
msgstr ""
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Base"
msgstr ""
#. module: account_invoice_layout
#: selection:account.invoice.line,state:0
msgid "Page Break"
msgstr ""
#. module: account_invoice_layout
#: view:notify.message:0
#: field:notify.message,msg:0
msgid "Special Message"
msgstr ""
#. module: account_invoice_layout
#: help:account.invoice.special.msg,message:0
msgid "Message to Print at the bottom of report"
msgstr ""
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Quantity"
msgstr "数量"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Refund"
msgstr "返金"
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Fax :"
msgstr ""
#. module: account_invoice_layout
#: report:account.invoice.layout:0
msgid "Total:"
msgstr ""
#. module: account_invoice_layout
#: view:account.invoice.special.msg:0
msgid "Select Message"
msgstr ""
#. module: account_invoice_layout
#: view:notify.message:0
msgid "Messages"
msgstr ""
#. module: account_invoice_layout
#: selection:account.invoice.line,state:0
msgid "Product"
msgstr ""
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Description / Taxes"
msgstr ""
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Amount"
msgstr ""
#. module: account_invoice_layout
#: model:notify.message,msg:account_invoice_layout.demo_message1
msgid "ERP & CRM Solutions..."
msgstr ""
#. module: account_invoice_layout
#: report:notify_account.invoice:0
msgid "Net Total :"
msgstr ""
#. module: account_invoice_layout
#: report:notify_account.invoice:0
msgid "Total :"
msgstr ""
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Draft Invoice"
msgstr ""
#. module: account_invoice_layout
#: field:account.invoice.line,sequence:0
msgid "Sequence Number"
msgstr ""
#. module: account_invoice_layout
#: model:ir.model,name:account_invoice_layout.model_account_invoice_special_msg
msgid "Account Invoice Special Message"
msgstr ""
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Origin"
msgstr ""
#. module: account_invoice_layout
#: sql_constraint:account.invoice:0
msgid "Invoice Number must be unique per Company!"
msgstr ""
#. module: account_invoice_layout
#: selection:account.invoice.line,state:0
msgid "Separator Line"
msgstr ""
#. module: account_invoice_layout
#: report:notify_account.invoice:0
msgid "Your Reference"
msgstr ""
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Supplier Invoice"
msgstr ""
#. module: account_invoice_layout
#: model:ir.actions.report.xml,name:account_invoice_layout.account_invoices_1
msgid "Invoices"
msgstr ""
#. module: account_invoice_layout
#: constraint:account.invoice:0
msgid "Invalid BBA Structured Communication !"
msgstr ""
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Tax"
msgstr ""
#. module: account_invoice_layout
#: model:ir.model,name:account_invoice_layout.model_account_invoice_line
msgid "Invoice Line"
msgstr ""
#. module: account_invoice_layout
#: report:account.invoice.layout:0
msgid "Net Total:"
msgstr ""
#. module: account_invoice_layout
#: model:ir.actions.act_window,name:account_invoice_layout.action_account_invoice_special_msg
#: model:ir.actions.report.xml,name:account_invoice_layout.account_invoices_layout_message
msgid "Invoices and Message"
msgstr ""
#. module: account_invoice_layout
#: field:account.invoice.line,state:0
msgid "Type"
msgstr ""
#. module: account_invoice_layout
#: view:notify.message:0
msgid "Write a notification or a wishful message."
msgstr ""
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: model:ir.model,name:account_invoice_layout.model_account_invoice
#: report:notify_account.invoice:0
msgid "Invoice"
msgstr ""
#. module: account_invoice_layout
#: view:account.invoice.special.msg:0
msgid "Cancel"
msgstr ""
#. module: account_invoice_layout
#: report:account.invoice.layout:0
#: report:notify_account.invoice:0
msgid "Supplier Refund"
msgstr ""
#. module: account_invoice_layout
#: field:account.invoice.special.msg,message:0
msgid "Message"
msgstr ""
#. module: account_invoice_layout
#: report:notify_account.invoice:0
msgid "Taxes :"
msgstr ""
#. module: account_invoice_layout
#: model:ir.ui.menu,name:account_invoice_layout.menu_notify_mesage_tree_form
msgid "All Notification Messages"
msgstr ""

View File

@ -28,55 +28,7 @@ from osv import fields, osv
from tools.translate import _
from lxml import etree
#Migrate data from another application Conf wiz
class migrade_application_installer_modules(osv.osv_memory):
_name = 'migrade.application.installer.modules'
_inherit = 'res.config.installer'
_columns = {
'import_saleforce': fields.boolean('Import Saleforce',
help="For Import Saleforce"),
'import_sugarcrm': fields.boolean('Import Sugarcrm',
help="For Import Sugarcrm"),
'sync_google_contact': fields.boolean('Sync Google Contact',
help="For Sync Google Contact"),
'quickbooks_ippids': fields.boolean('Quickbooks Ippids',
help="For Quickbooks Ippids"),
}
class product_installer(osv.osv_memory):
_name = 'product.installer'
_inherit = 'res.config'
_columns = {
'customers': fields.selection([('create','Create'), ('import','Import')], 'Customers', size=32, required=True, help="Import or create customers"),
}
_defaults = {
'customers': 'create',
}
def execute(self, cr, uid, ids, context=None):
if context is None:
context = {}
data_obj = self.pool.get('ir.model.data')
val = self.browse(cr, uid, ids, context=context)[0]
if val.customers == 'create':
id2 = data_obj._get_id(cr, uid, 'base', 'view_partner_form')
if id2:
id2 = data_obj.browse(cr, uid, id2, context=context).res_id
return {
'view_type': 'form',
'view_mode': 'form',
'res_model': 'res.partner',
'views': [(id2, 'form')],
'type': 'ir.actions.act_window',
'target': 'current',
'nodestroy':False,
}
if val.customers == 'import':
return {'type': 'ir.actions.act_window'}
# Define users preferences for new users (ir.values)
def _lang_get(self, cr, uid, context=None):
obj = self.pool.get('res.lang')
ids = obj.search(cr, uid, [('translatable','=',True)])
@ -130,8 +82,7 @@ class user_preferences_config(osv.osv_memory):
ir_values_obj.set(cr, uid, 'default', False, 'menu_tips', ['res.users'], o.menu_tips)
return {}
# Specify Your Terminology
# Specify Your Terminology will move to 'partner' module
class specify_partner_terminology(osv.osv_memory):
_name = 'base.setup.terminology'
_inherit = 'res.config'
@ -201,12 +152,9 @@ class specify_partner_terminology(osv.osv_memory):
self.make_translations(cr, uid, ids, act_ref, 'model', act_id.help, _case_insensitive_replace(act_id.help,'Customer',o.partner), res_id=act_id.id, context=context)
return {}
# Preferences wizard for Sales & CRM.
# It is defined here because it is inherited independently in modules sale, crm,
# plugin_outlook and plugin_thunderbird.
#
class sale_config_settings(osv.osv_memory):
_name = 'sale.config.settings'
_inherit = 'res.config.settings'

View File

@ -1,6 +1,5 @@
<openerp>
<data>
<!-- Define default users preferences-->
<record id="view_user_preferences_config_form" model="ir.ui.view">
<field name="name">Set default users preferences</field>
@ -48,22 +47,6 @@
<field name="type">once</field>
</record>
<!-- Create Additional Users -->
<record id="action_config_access_other_user" model="ir.actions.act_window">
<field name="name">Create Additional Users</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.users</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" eval="False"/>
</record>
<record id="config_wizard_action_config_user_form" model="ir.actions.todo">
<field name="action_id" ref="action_config_access_other_user"/>
<field name="category_id" ref="base.category_administration_config"/>
<field name="sequence">1000</field>
</record>
<!-- Specify Your Terminology Config Wiz-->
<record id="base_setup_terminology_form" model="ir.ui.view">
<field name="name">Specify Your Terminology</field>
@ -102,13 +85,6 @@
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<!--
<record id="config_action_partner_terminology_config_form" model="ir.actions.todo">
<field name="action_id" ref="action_partner_terminology_config_form"/>
<field name="category_id" ref="base.category_administration_config"/>
<field name="type">once</field>
</record>
-->
<!-- Company config -->
<record id="action_base_setup_company" model="ir.actions.act_window">
@ -140,7 +116,6 @@
<sheet layout="auto">
<group>
<group name="config_sale" colspan="4"/>
<!-- this part is necessary to allow the plugins to extend the view -->
<field name="module_crm" invisible="1"/>
<group name="config_fetchmail" colspan="4" attrs="{'invisible': [('module_crm','=',False)]}">
@ -157,6 +132,7 @@
</field>
</record>
<!-- Sale config wizard -->
<record id="base.action_sale_config" model="ir.actions.act_window">
<field name="name">Configure Sales</field>
<field name="type">ir.actions.act_window</field>

View File

@ -0,0 +1,202 @@
# Gujarati translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
"PO-Revision-Date: 2012-05-02 19:35+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Gujarati <gu@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-03 05:26+0000\n"
"X-Generator: Launchpad (build 15185)\n"
#. module: crm_profiling
#: view:crm_profiling.questionnaire:0
msgid "Questions List"
msgstr ""
#. module: crm_profiling
#: model:ir.actions.act_window,help:crm_profiling.open_questionnaires
msgid ""
"You can create specific topic-related questionnaires to guide your team(s) "
"in the sales cycle by helping them to ask the right questions. The "
"segmentation tool allows you to automatically assign a partner to a category "
"according to his answers to the different questionnaires."
msgstr ""
#. module: crm_profiling
#: field:crm_profiling.answer,question_id:0
#: field:crm_profiling.question,name:0
#: model:ir.model,name:crm_profiling.model_crm_profiling_question
#: field:open.questionnaire.line,question_id:0
msgid "Question"
msgstr "પ્રશ્ન"
#. module: crm_profiling
#: model:ir.actions.act_window,name:crm_profiling.action_open_questionnaire
#: view:open.questionnaire:0
msgid "Open Questionnaire"
msgstr ""
#. module: crm_profiling
#: field:crm.segmentation,child_ids:0
msgid "Child Profiles"
msgstr ""
#. module: crm_profiling
#: view:crm.segmentation:0
msgid "Partner Segmentations"
msgstr ""
#. module: crm_profiling
#: field:crm_profiling.answer,name:0
#: model:ir.model,name:crm_profiling.model_crm_profiling_answer
#: field:open.questionnaire.line,answer_id:0
msgid "Answer"
msgstr "જવાબ"
#. module: crm_profiling
#: model:ir.model,name:crm_profiling.model_open_questionnaire_line
msgid "open.questionnaire.line"
msgstr ""
#. module: crm_profiling
#: model:ir.model,name:crm_profiling.model_crm_segmentation
msgid "Partner Segmentation"
msgstr ""
#. module: crm_profiling
#: view:res.partner:0
msgid "Profiling"
msgstr ""
#. module: crm_profiling
#: view:crm_profiling.questionnaire:0
#: field:crm_profiling.questionnaire,description:0
msgid "Description"
msgstr "વર્ણન"
#. module: crm_profiling
#: field:crm.segmentation,answer_no:0
msgid "Excluded Answers"
msgstr ""
#. module: crm_profiling
#: view:crm_profiling.answer:0
#: view:crm_profiling.question:0
#: field:res.partner,answers_ids:0
msgid "Answers"
msgstr ""
#. module: crm_profiling
#: model:ir.model,name:crm_profiling.model_open_questionnaire
msgid "open.questionnaire"
msgstr ""
#. module: crm_profiling
#: field:open.questionnaire,questionnaire_id:0
msgid "Questionnaire name"
msgstr ""
#. module: crm_profiling
#: view:res.partner:0
msgid "Use a questionnaire"
msgstr ""
#. module: crm_profiling
#: view:open.questionnaire:0
msgid "_Cancel"
msgstr "રદ કરો (_C)"
#. module: crm_profiling
#: field:open.questionnaire,question_ans_ids:0
msgid "Question / Answers"
msgstr ""
#. module: crm_profiling
#: view:crm_profiling.questionnaire:0
#: model:ir.actions.act_window,name:crm_profiling.open_questionnaires
#: model:ir.ui.menu,name:crm_profiling.menu_segm_questionnaire
#: view:open.questionnaire:0
msgid "Questionnaires"
msgstr ""
#. module: crm_profiling
#: help:crm.segmentation,profiling_active:0
msgid ""
"Check this box if you want to use this tab as "
"part of the segmentation rule. If not checked, "
"the criteria beneath will be ignored"
msgstr ""
#. module: crm_profiling
#: constraint:crm.segmentation:0
msgid "Error ! You can not create recursive profiles."
msgstr ""
#. module: crm_profiling
#: field:crm.segmentation,profiling_active:0
msgid "Use The Profiling Rules"
msgstr ""
#. module: crm_profiling
#: constraint:res.partner:0
msgid "Error ! You cannot create recursive associated members."
msgstr "ભૂલ! તમે પાસાના સંકળાયેલ સભ્યો નહિં બનાવી શકો."
#. module: crm_profiling
#: view:crm_profiling.question:0
#: field:crm_profiling.question,answers_ids:0
msgid "Avalaible answers"
msgstr ""
#. module: crm_profiling
#: field:crm.segmentation,answer_yes:0
msgid "Included Answers"
msgstr ""
#. module: crm_profiling
#: view:crm_profiling.question:0
#: field:crm_profiling.questionnaire,questions_ids:0
#: model:ir.actions.act_window,name:crm_profiling.open_questions
#: model:ir.ui.menu,name:crm_profiling.menu_segm_answer
msgid "Questions"
msgstr "પ્રશ્નો"
#. module: crm_profiling
#: field:crm.segmentation,parent_id:0
msgid "Parent Profile"
msgstr ""
#. module: crm_profiling
#: view:open.questionnaire:0
msgid "Cancel"
msgstr "રદ કરો"
#. module: crm_profiling
#: model:ir.model,name:crm_profiling.model_res_partner
msgid "Partner"
msgstr "ભાગીદાર"
#. module: crm_profiling
#: code:addons/crm_profiling/wizard/open_questionnaire.py:77
#: field:crm_profiling.questionnaire,name:0
#: model:ir.model,name:crm_profiling.model_crm_profiling_questionnaire
#: view:open.questionnaire:0
#: view:open.questionnaire.line:0
#: field:open.questionnaire.line,wizard_id:0
#, python-format
msgid "Questionnaire"
msgstr ""
#. module: crm_profiling
#: view:open.questionnaire:0
msgid "Save Data"
msgstr ""

View File

@ -0,0 +1,270 @@
# Gujarati translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
"PO-Revision-Date: 2012-05-02 19:34+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Gujarati <gu@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-03 05:26+0000\n"
"X-Generator: Launchpad (build 15185)\n"
#. module: hr_contract
#: field:hr.contract,wage:0
msgid "Wage"
msgstr ""
#. module: hr_contract
#: view:hr.contract:0
msgid "Information"
msgstr "માહિતી"
#. module: hr_contract
#: view:hr.contract:0
msgid "Trial Period"
msgstr ""
#. module: hr_contract
#: field:hr.contract,trial_date_start:0
msgid "Trial Start Date"
msgstr ""
#. module: hr_contract
#: view:hr.employee:0
msgid "Medical Examination"
msgstr ""
#. module: hr_contract
#: field:hr.employee,vehicle:0
msgid "Company Vehicle"
msgstr ""
#. module: hr_contract
#: view:hr.employee:0
msgid "Miscellaneous"
msgstr "પરચૂરણ"
#. module: hr_contract
#: view:hr.contract:0
msgid "Current"
msgstr "વર્તમાન"
#. module: hr_contract
#: view:hr.contract:0
msgid "Group By..."
msgstr "ગ્રુપ દ્વારા..."
#. module: hr_contract
#: field:hr.contract,department_id:0
msgid "Department"
msgstr "વિભાગ"
#. module: hr_contract
#: view:hr.contract:0
msgid "Overpassed"
msgstr ""
#. module: hr_contract
#: view:hr.contract:0
#: field:hr.contract,employee_id:0
#: model:ir.model,name:hr_contract.model_hr_employee
msgid "Employee"
msgstr "કર્મચારી"
#. module: hr_contract
#: view:hr.contract:0
msgid "Search Contract"
msgstr ""
#. module: hr_contract
#: view:hr.contract:0
msgid "Contracts in progress"
msgstr "ચાલુ કરારો"
#. module: hr_contract
#: field:hr.employee,vehicle_distance:0
msgid "Home-Work Distance"
msgstr ""
#. module: hr_contract
#: view:hr.contract:0
#: field:hr.employee,contract_ids:0
#: model:ir.actions.act_window,name:hr_contract.act_hr_employee_2_hr_contract
#: model:ir.actions.act_window,name:hr_contract.action_hr_contract
#: model:ir.ui.menu,name:hr_contract.hr_menu_contract
msgid "Contracts"
msgstr "કરારો"
#. module: hr_contract
#: view:hr.employee:0
msgid "Personal Info"
msgstr "ખાનગી જાણકારી"
#. module: hr_contract
#: view:hr.contract:0
msgid "Contracts whose end date already passed"
msgstr ""
#. module: hr_contract
#: help:hr.employee,contract_id:0
msgid "Latest contract of the employee"
msgstr ""
#. module: hr_contract
#: view:hr.contract:0
msgid "Job"
msgstr "કાર્ય"
#. module: hr_contract
#: view:hr.contract:0
#: field:hr.contract,advantages:0
msgid "Advantages"
msgstr ""
#. module: hr_contract
#: view:hr.contract:0
msgid "Valid for"
msgstr ""
#. module: hr_contract
#: view:hr.contract:0
msgid "Work Permit"
msgstr ""
#. module: hr_contract
#: field:hr.employee,children:0
msgid "Number of Children"
msgstr ""
#. module: hr_contract
#: model:ir.actions.act_window,name:hr_contract.action_hr_contract_type
#: model:ir.ui.menu,name:hr_contract.hr_menu_contract_type
msgid "Contract Types"
msgstr ""
#. module: hr_contract
#: constraint:hr.employee:0
msgid "Error ! You cannot create recursive Hierarchy of Employees."
msgstr ""
#. module: hr_contract
#: field:hr.contract,date_end:0
msgid "End Date"
msgstr "અંતિમ તારીખ"
#. module: hr_contract
#: help:hr.contract,wage:0
msgid "Basic Salary of the employee"
msgstr ""
#. module: hr_contract
#: field:hr.contract,name:0
msgid "Contract Reference"
msgstr ""
#. module: hr_contract
#: help:hr.employee,vehicle_distance:0
msgid "In kilometers"
msgstr ""
#. module: hr_contract
#: view:hr.contract:0
#: field:hr.contract,notes:0
msgid "Notes"
msgstr "નોંધ"
#. module: hr_contract
#: field:hr.contract,permit_no:0
msgid "Work Permit No"
msgstr ""
#. module: hr_contract
#: view:hr.contract:0
#: field:hr.employee,contract_id:0
#: model:ir.model,name:hr_contract.model_hr_contract
#: model:ir.ui.menu,name:hr_contract.next_id_56
msgid "Contract"
msgstr "કરાર"
#. module: hr_contract
#: view:hr.contract:0
#: field:hr.contract,type_id:0
#: view:hr.contract.type:0
#: field:hr.contract.type,name:0
#: model:ir.model,name:hr_contract.model_hr_contract_type
msgid "Contract Type"
msgstr ""
#. module: hr_contract
#: view:hr.contract:0
#: field:hr.contract,working_hours:0
msgid "Working Schedule"
msgstr ""
#. module: hr_contract
#: view:hr.employee:0
msgid "Job Info"
msgstr ""
#. module: hr_contract
#: field:hr.contract,visa_expire:0
msgid "Visa Expire Date"
msgstr ""
#. module: hr_contract
#: field:hr.contract,job_id:0
msgid "Job Title"
msgstr "નોકરી શીર્ષક"
#. module: hr_contract
#: field:hr.employee,manager:0
msgid "Is a Manager"
msgstr ""
#. module: hr_contract
#: field:hr.contract,date_start:0
msgid "Start Date"
msgstr "શરુઆતની તારીખ"
#. module: hr_contract
#: constraint:hr.contract:0
msgid "Error! contract start-date must be lower then contract end-date."
msgstr ""
#. module: hr_contract
#: field:hr.contract,visa_no:0
msgid "Visa No"
msgstr ""
#. module: hr_contract
#: field:hr.employee,place_of_birth:0
msgid "Place of Birth"
msgstr "જન્મનું સ્થાન"
#. module: hr_contract
#: view:hr.contract:0
msgid "Duration"
msgstr "સમયગાળો"
#. module: hr_contract
#: field:hr.employee,medic_exam:0
msgid "Medical Examination Date"
msgstr ""
#. module: hr_contract
#: field:hr.contract,trial_date_end:0
msgid "Trial End Date"
msgstr ""
#. module: hr_contract
#: view:hr.contract.type:0
msgid "Search Contract Type"
msgstr ""

View File

@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
"PO-Revision-Date: 2012-04-18 07:31+0000\n"
"PO-Revision-Date: 2012-05-02 02:17+0000\n"
"Last-Translator: Tomomi Mengelberg <tomomi.mengelberg@aquasys.co.jp>\n"
"Language-Team: Japanese <ja@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-04-19 04:38+0000\n"
"X-Generator: Launchpad (build 15108)\n"
"X-Launchpad-Export-Date: 2012-05-03 05:26+0000\n"
"X-Generator: Launchpad (build 15185)\n"
#. module: import_sugarcrm
#: code:addons/import_sugarcrm/import_sugarcrm.py:1105
@ -94,7 +94,7 @@ msgstr ""
#: code:addons/import_sugarcrm/sugarsoap_services.py:23
#, python-format
msgid "Please install SOAP for python - ZSI-2.0-rc3.tar.gz - python-zci"
msgstr "python SOAPをインストールしてください。"
msgstr "Python SOAPをインストールしてください。- ZSI-2.0-rc3.tar.gz - python-zci"
#. module: import_sugarcrm
#: view:import.sugarcrm:0
@ -240,6 +240,8 @@ msgid ""
"Please install SOAP for python - ZSI-2.0-rc3.tar.gz from "
"http://pypi.python.org/pypi/ZSI/"
msgstr ""
"Python SOAPをインストールしてください。- ZSI-2.0-rc3.tar.gz from "
"http://pypi.python.org/pypi/ZSI/"
#. module: import_sugarcrm
#: help:import.sugarcrm,project:0

View File

@ -0,0 +1,38 @@
# Japanese translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
"PO-Revision-Date: 2012-05-02 02:53+0000\n"
"Last-Translator: Tomomi Mengelberg <tomomi.mengelberg@aquasys.co.jp>\n"
"Language-Team: Japanese <ja@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-03 05:26+0000\n"
"X-Generator: Launchpad (build 15185)\n"
#. module: pad_project
#: constraint:project.task:0
msgid "Error ! Task end-date must be greater then task start-date"
msgstr "エラーです。 タスクの終了日は開始日以降の日付に設定しなければなりません。"
#. module: pad_project
#: model:ir.model,name:pad_project.model_project_task
msgid "Task"
msgstr "タスク"
#. module: pad_project
#: view:project.task:0
msgid "Pad"
msgstr "パッド"
#. module: pad_project
#: constraint:project.task:0
msgid "Error ! You cannot create recursive tasks."
msgstr "エラーです。 再帰的なタスクを作成することはできません。"

View File

@ -0,0 +1,74 @@
# Japanese translation for openobject-addons
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-02-09 00:36+0000\n"
"PO-Revision-Date: 2012-05-02 03:10+0000\n"
"Last-Translator: Tomomi Mengelberg <tomomi.mengelberg@aquasys.co.jp>\n"
"Language-Team: Japanese <ja@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-05-03 05:26+0000\n"
"X-Generator: Launchpad (build 15185)\n"
#. module: plugin_outlook
#: view:outlook.installer:0
msgid ""
"This plug-in allows you to create and link outlook emails with openerp "
"objects."
msgstr "このプラグインは、OpenERP オブジェストを使用してOutlookのメールを作成しリンクすることができます。"
#. module: plugin_outlook
#: field:outlook.installer,name:0
msgid "Outlook Plug-in"
msgstr "Outlook プラグイン"
#. module: plugin_outlook
#: model:ir.actions.act_window,name:plugin_outlook.action_outlook_installer
#: model:ir.actions.act_window,name:plugin_outlook.action_outlook_wizard
#: model:ir.ui.menu,name:plugin_outlook.menu_base_config_plugins_outlook
#: view:outlook.installer:0
msgid "Install Outlook Plug-In"
msgstr "Outlook プラグインをインストールする。"
#. module: plugin_outlook
#: field:outlook.installer,config_logo:0
msgid "Image"
msgstr "画像"
#. module: plugin_outlook
#: view:outlook.installer:0
msgid "title"
msgstr "タイトル"
#. module: plugin_outlook
#: model:ir.model,name:plugin_outlook.model_outlook_installer
msgid "outlook.installer"
msgstr "outlook.installer"
#. module: plugin_outlook
#: view:outlook.installer:0
msgid "_Close"
msgstr "閉じる(_C)"
#. module: plugin_outlook
#: view:outlook.installer:0
msgid "Installation and Configuration Steps"
msgstr "インストールと構成の手順"
#. module: plugin_outlook
#: help:outlook.installer,name:0
msgid ""
"outlook plug-in file. Save as this file and install this plug-in in outlook."
msgstr "outlook プラグインファイル. outlookでこのファイルを保存し、プラグインをインストールします。"
#. module: plugin_outlook
#: field:outlook.installer,description:0
msgid "Description"
msgstr "説明"

View File

@ -86,6 +86,7 @@ Main features :
'static/src/js/pos_models.js',
'static/src/js/pos_widgets.js',
'static/src/js/pos_devices.js',
'static/src/js/pos_screens.js',
'static/src/js/pos_main.js'
],
'css': ['static/src/css/pos.css'],

View File

@ -510,7 +510,7 @@ body{
list-style: none;
}
.point-of-sale .pos-actionbar-left-region{
.point-of-sale .pos-actionbar-left-pane{
height: 100%;
width: 434px;
margin: 0px;
@ -520,7 +520,7 @@ body{
float: left;
}
.point-of-sale .pos-actionbar-right-region{
.point-of-sale .pos-actionbar-button-list{
height: 100%;
margin: 0px;
padding-left:3px;
@ -534,8 +534,6 @@ body{
text-align:center;
margin:3px;
margin-top:6px;
//line-height: 90px;
//vertical-align:center;
float:left;
font-size: 14px;

View File

@ -1,14 +1,145 @@
function openerp_pos_devices(module, instance){ //module is instance.point_of_sale
window.debug_devices = new (instance.web.Class.extend({
payment_status: 'waiting_for_payment',
weight: 0,
accept_payment: function(){ this.payment_status = 'payment_accepted'; },
reject_payment: function(){ this.payment_status = 'payment_rejected'; },
delay_payment: function(){ this.payment_status = 'waiting_for_payment'; },
}))();
// this object interfaces with the local proxy to communicate to the various hardware devices
// connected to the Point of Sale. As the communication only goes from the POS to the proxy,
// methods are used both to signal an event, and to fetch information.
module.ProxyDevice = instance.web.Class.extend({
//a product has been scanned and recognized with success
scan_item_succes: function(){
console.log('PROXY: scan item success');
},
//a product has been scanned but not recognized
scan_item_error_unrecognized: function(){
console.log('PROXY: scan item error');
},
//the client is asking for help
help_needed: function(){
console.log('PROXY: help needed');
},
//the client does not need help anymore
help_canceled: function(){
console.log('PROXY: help canceled');
},
//the client is starting to weight
weighting_start: function(){
console.log('PROXY: weighting start');
},
//returns the weight on the scale.
// is called at regular interval (up to 10x/sec) between a weighting_start()
// and a weighting_end()
weighting_read_kg: function(){
console.log('PROXY: weighting read');
//return Math.random() + 0.1;
return window.debug_devices.weight;
},
// the client has finished weighting products
weighting_end: function(){
console.log('PROXY: weighting end');
},
// the pos asks the client to pay 'price' units
// method: 'mastercard' | 'cash' | ... ? TBD
// info: 'extra information to display on the payment terminal' ... ? TBD
payment_request: function(price, method, info){
console.log('PROXY: payment request:',price,method,info);
},
// is called at regular interval after a payment request to see if the client
// has paid the required money
// returns 'waiting_for_payment' | 'payment_accepted' | 'payment_rejected'
is_payment_accepted: function(){
console.log('PROXY: is payment accepted ?');
//return 'waiting_for_payment'; // 'payment_accepted' | 'payment_rejected'
return window.debug_devices.payment_status;
},
// the client cancels his payment
payment_canceled: function(){
console.log('PROXY: payment canceled by client');
},
// called when the client logs in or starts to scan product
transation_start: function(){
console.log('PROXY: transaction start');
},
// called when the clients has finished his interaction with the machine
transaction_end: function(){
console.log('PROXY: transaction end');
},
// called when the POS turns to cashier mode
cashier_mode_activated: function(){
console.log('PROXY:');
},
// called when the POS turns to client mode
cashier_mode_deactivated: function(){
console.log('PROXY:');
},
});
// this module interfaces with the barcode reader. It assumes the barcode reader
// is set-up to act like a keyboard. Use connect() and disconnect() to activate
// and deactivate the barcode reader. Use set_action_callbacks to tell it
// what to do when it reads a barcode.
module.BarcodeReader = instance.web.Class.extend({
init: function(attributes){
this.pos = attributes.pos;
this.connect();
this.action_callbacks = {
'product': undefined,
'cashier': undefined,
'client': undefined,
'discount': undefined,
};
},
// when an ean is scanned and parsed, the callback corresponding
// to its type is called with the parsed_ean as a parameter.
// (parsed_ean is the result of parse_ean(ean))
//
// callbacks is a Map of 'actions' : callback(parsed_ean)
// that sets the callback for each action. if a callback for the
// specified action already exists, it is replaced.
//
// possible actions include :
// 'product' | 'cashier' | 'client' | 'discount'
set_action_callbacks: function(callbacks){
for(action in callbacks){
this.action_callbacks[action] = callbacks[action];
}
},
// returns true if the code is a valid EAN codebar number by checking the control digit.
checkEan: function(code){
//remove all action callbacks
reset_action_callbacks: function(){
for(action in this.action_callbacks){
this.action_callbacks[action] = undefined;
}
},
// returns true if the ean is a valid EAN codebar number by checking the control digit.
// ean must be a string
check_ean: function(ean){
var code = ean.split('');
var st1 = code.slice();
var st2 = st1.slice(0,st1.length-1).reverse();
// some EAN13 barcodes have a length of 12, as they start by 0
@ -36,42 +167,112 @@ function openerp_pos_devices(module, instance){ //module is instance.point_of_sa
var cd = (10 - (st5%10)) % 10;
return code[code.length-1] === cd;
},
// attempts to interpret an ean (string encoding an ean)
// it will check its validity then return an object containing various
// information about the ean.
// most importantly :
// - ean : the ean
// - type : the type of the ean:
// 'price' | 'weight' | 'unit' | 'cashier' | 'client' | 'discount' | 'error'
//
// - prefix : the prefix that has ben used to determine the type
// - id : the part of the ean that identifies something
// - value : if the id encodes a numerical value, it will be put there
// - unit : if the encoded value has a unit, it will be put there.
// not to be confused with the 'unit' type, which represent an unit of a
// unique product
parse_ean: function(ean){
var parse_result = {
type:'unknown', //
prefix:'',
ean:ean,
id:'',
value: 0,
unit: 'none',
};
var prefix2 = ean.substring(0,2);
if(!this.check_ean(ean)){
parse_result.type = 'error';
}else if (prefix2 in {'02':'', '22':'', '24':'', '26':'', '28':''}){
parse_result.type = 'price';
parse_result.prefix = prefix2;
parse_result.id = ean.substring(0,7);
parse_result.value = Number(ean.substring(7,12))/100.0;
parse_result.unit = 'euro';
} else if (prefix2 in {'21':'','23':'','27':'','29':'','25':''}) {
parse_result.type = 'weight';
parse_result.prefix = prefix2;
prase_result.id = ean.substring(0,7);
parse_result.value = Number(ean.substring(7,12))/1000.0;
parse_result.unit = 'Kg';
}else{
parse_result.type = 'unit';
parse_result.prefix = '';
parse_result.id = ean;
}
return parse_result;
},
// returns a product that has a packaging with an EAN matching to provided ean string.
// returns undefined if no such product is found.
getProductByEAN: function(ean) {
get_product_by_ean: function(ean) {
var allProducts = this.pos.get('product_list');
var allPackages = this.pos.get('product.packaging');
var prefix = ean.substring(0,2);
var scannedProductModel = undefined;
var parse_result = this.parse_ean(ean);
if (prefix in {'02':'', '22':'', '24':'', '26':'', '28':''}) {
// PRICE barcode
var itemCode = ean.substring(0,7);
if (parse_result.type === 'price') {
var itemCode = parse_result.id;
var scannedPackaging = _.detect(allPackages, function(pack) { return pack.ean !== undefined && pack.ean.substring(0,7) === itemCode;});
if (scannedPackaging !== undefined) {
scannedProductModel = _.detect(allProducts, function(pc) { return pc.id === scannedPackaging.product_id[0];});
scannedProductModel.list_price = Number(ean.substring(7,12))/100;
scannedProductModel.list_price = parse_result.value;
}
} else if (prefix in {'21':'','23':'','27':'','29':'','25':''}) {
// WEIGHT barcode
var weight = Number(barcode.substring(7,12))/1000;
var itemCode = ean.substring(0,7);
} else if (parse_result.type === 'weight') {
var weight = parse_result.value;
var itemCode = parse_result.id;
var scannedPackaging = _.detect(allPackages, function(pack) { return pack.ean !== undefined && pack.ean.substring(0,7) === itemCode;});
if (scannedPackaging !== undefined) {
scannedProductModel = _.detect(allProducts, function(pc) { return pc.id === scannedPackaging.product_id[0];});
scannedProductModel.list_price *= weight;
scannedProductModel.name += ' - ' + weight + ' Kg.';
}
} else {
// UNIT barcode
} else if(parse_result.type === 'unit'){
scannedProductModel = _.detect(allProducts, function(pc) { return pc.ean13 === ean;}); //TODO DOES NOT SCALE
}
return scannedProductModel;
},
// a default callback for the 'product' action. It will select the product
// corresponding to the ean and add it to the current order.
scan_product_callback: function(parse_result){
var selectedOrder = self.pos.get('selectedOrder');
var scannedProductModel = self.get_product_by_ean(parse_result.ean);
if (scannedProductModel === undefined) {
// product not recognized, raise warning
$(QWeb.render('pos-scan-warning')).dialog({
resizable: false,
height:220,
modal: true,
title: "Warning",
/*
buttons: {
"OK": function() {
$( this ).dialog( "close" );
return;
},
}*/
});
} else {
selectedOrder.addProduct(new module.Product(scannedProductModel));
}
},
// starts catching keyboard events and tries to interpret codebar
// calling the callbacks when needed.
connect: function(){
var self = this;
var codeNumbers = [];
@ -99,37 +300,24 @@ function openerp_pos_devices(module, instance){ //module is instance.point_of_sa
codeNumbers.push(e.keyCode - 48);
lastTimeStamp = new Date().getTime();
if (codeNumbers.length == 13) {
//console.log('found code:', codeNumbers.join(''));
//We have found what seems to be a valid codebar
var parse_result = this.parse_ean(codeNumbers.join(''));
// a barcode reader
if (!self.checkEan(codeNumbers)) {
// barcode read error, raise warning
if (parse_result.type === 'error') { //most likely a checksum error, raise warning
$(QWeb.render('pos-scan-warning')).dialog({
resizable: false,
height:220,
modal: true,
title: "Warning",
});
}
var selectedOrder = self.pos.get('selectedOrder');
var scannedProductModel = self.getProductByEAN(codeNumbers.join(''),allPackages,allProducts);
if (scannedProductModel === undefined) {
// product not recognized, raise warning
$(QWeb.render('pos-scan-warning')).dialog({
resizable: false,
height:220,
modal: true,
title: "Warning",
/*
buttons: {
"OK": function() {
$( this ).dialog( "close" );
return;
},
}*/
});
} else {
selectedOrder.addProduct(new module.Product(scannedProductModel));
}else if(parse_result.type in {'unit':'', 'weight':'', 'price':''}){ //ean is associated to a product
if(this.action_callback['product']){
this.action_callback['product'](parse_result);
}
}else{
if(this.action_callback[parse_result.type]){
this.action_callback[parse_result.type](parse_result);
}
}
codeNumbers = [];
@ -146,4 +334,5 @@ function openerp_pos_devices(module, instance){ //module is instance.point_of_sa
$('body').undelegate('', 'keyup')
},
});
}

View File

@ -6,6 +6,8 @@ openerp.point_of_sale = function(instance) {
var module = instance.point_of_sale;
openerp_pos_models(module,instance); // import pos_models.js
openerp_pos_screens(module,instance); // import pos_screens.js
openerp_pos_widgets(module,instance); // import pos_widgets.js

View File

@ -57,6 +57,8 @@ function openerp_pos_models(module, instance){ //module is instance.point_of_sal
this.build_tree = _.bind(this.build_tree, this);
this.session = session;
this.categories = {};
this.barcode_reader = new module.BarcodeReader({'pos': this});
this.proxy = new module.ProxyDevice({'pos': this});
this.set({
'nbr_pending_operations': 0,
'currency': {symbol: '$', position: 'after'},
@ -396,7 +398,8 @@ function openerp_pos_models(module, instance){ //module is instance.point_of_sal
},
validatedChanged: function() {
if (this.get("validated") && !this.previous("validated")) {
this.set({'step': 'receipt'});
this.pos.screen_selector.set_current_screen('receipt');
//this.set({'screen': 'receipt'});
}
},
generateUniqueId: function() {

View File

@ -0,0 +1,618 @@
// this file contains the screens definitions. Screens are the
// content of the right pane of the pos, containing the main functionalities.
// screens are contained in the PosWidget, in pos_widget.js
// all screens are present in the dom at all time, but only one is shown at the
// same time.
//
// transition between screens is made possible by the use of the screen_selector,
// which is responsible of hiding and showing the screens, as well as maintaining
// the state of the screens between different orders.
//
// all screens inherit from ScreenWidget. the only addition from the base widgets
// are show() and hide() which shows and hides the screen but are also used to
// bind and unbind actions on widgets and devices. The screen_selector guarantees
// that only one screen is shown at the same time and that show() is called after all
// hide()s
function openerp_pos_screens(module, instance){ //module is instance.point_of_sale
var QWeb = instance.web.qweb;
var qweb_template = function(template,pos){
return function(ctx){
if(!pos){ //this is a huge hack that needs to be removed ... TODO
var HackPosModel = Backbone.Model.extend({
initialize:function(){
this.set({
'currency': {symbol: '$', position: 'after'},
});
},
});
pos = new HackPosModel();
}
return QWeb.render(template, _.extend({}, ctx,{
'currency': pos.get('currency'),
'format_amount': function(amount) {
if (pos.get('currency').position == 'after') {
return amount + ' ' + pos.get('currency').symbol;
} else {
return pos.get('currency').symbol + ' ' + amount;
}
},
}));
};
};
module.ScreenSelector = instance.web.Class.extend({
init: function(options){
this.pos = options.pos;
this.screen_set = options.screen_set || {};
this.default_client_screen = options.default_client_screen;
this.default_cashier_screen = options.default_cashier_screen;
this.current_client_screen = this.screen_set[this.default_client_screen];
this.current_cashier_screen = this.screen_set[this.default_client_screen];
this.default_mode = options.default_mode || 'client';
this.current_mode = this.default_mode;
this.current_screen = this.current_mode === 'client' ?
this.current_client_screen:
this.current_cashier_screen;
var current = null;
for(screen_name in this.screen_set){
var screen = this.screen_set[screen_name];
if(screen === this.current_screen){
current = screen;
}else{
screen.hide();
}
}
if(current){
current.show();
}
this.selected_order = this.pos.get('selectedOrder');
this.selected_order.set({
user_mode : this.current_mode,
client_screen: this.default_client_screen,
cashier_screen: this.default_cashier_screen,
});
this.pos.bind('change:selectedOrder', this.load_saved_screen, this);
},
add_screen: function(screen_name, screen){
screen.hide();
this.screen_set[screen_name] = screen;
return this;
},
load_saved_screen: function(){
console.log('load_saved_screen');
if(true || this.selected_order != this.pos.get('selectedOrder')){
var selectedOrder = this.pos.get('selectedOrder');
var user_mode = selectedOrder.get('user_mode');
console.log('user mode:',user_mode);
if(user_mode === 'client'){
this.current_mode = 'client';
this.set_current_screen(selectedOrder.get('client_screen') || this.default_client_screen);
}else if(user_mode === 'cashier'){
this.current_mode = 'cashier';
console.log('default_cashier_screen:',this.default_cashier_screen);
this.set_current_screen(selectedOrder.get('cashier_screen') || this.default_cashier_screen);
}else{
this.current_mode = this.default_mode;
selectedOrder.set({ user_mode: this.current_mode });
if(this.current_mode === 'client'){
this.set_current_screen(this.default_client_screen);
}else{
this.set_current_screen(this.default_cashier_screen);
}
}
this.selected_order = selectedOrder;
// var screen = this.pos.get('selectedOrder').get('screen') || this.default_screen;
// this.selected_order = this.pos.get('selectedOrder');
// this.set_current_screen(screen);
}
},
set_user_mode: function(user_mode){
console.log('set user mode:',user_mode);
if(user_mode !== this.current_mode){
this.current_mode = user_mode;
this.pos.get('selectedOrder').set({ user_mode : this.current_mode });
this.load_saved_screen();
}
},
set_current_screen: function(screen_name){
var screen = this.screen_set[screen_name];
var selectedOrder = this.pos.get('selectedOrder');
if(this.current_mode === 'client'){
selectedOrder.set({'client_screen': screen_name});
}else{
selectedOrder.set({'cashier_screen': screen_name});
}
console.log('Set Current Screen: '+screen_name+' :',screen,'old:',this.current_screen, 'mode:',this.current_mode);
if(screen && screen !== this.current_screen){
if(this.current_screen){
this.current_screen.hide();
}
this.current_screen = screen;
this.current_screen.show();
}
},
});
module.ScreenWidget = instance.web.Widget.extend({
init: function(parent, options){
this._super(parent, options);
options = options || {};
this.pos = options.pos;
this.pos_widget = options.pos_widget;
},
show: function(){
if(this.$element){
this.$element.show();
}
},
hide: function(){
if(this.$element){
this.$element.hide();
}
if(this.pos.barcode_reader){
this.pos.barcode_reader.reset_action_callbacks();
}
if(this.pos_widget.action_bar){
this.pos_widget.action_bar.destroy_buttons();
}
},
});
module.ScaleInviteScreenWidget = module.ScreenWidget.extend({
template:'ScaleInviteScreenWidget',
show: function(){
this._super();
var self = this;
this.pos_widget.set_numpad_visible(false);
this.pos_widget.set_leftpane_visible(true);
this.pos_widget.set_cashier_controls_visible(false);
self.pos.proxy.weighting_start();
this.intervalID = setInterval(function(){
var weight = self.pos.proxy.weighting_read_kg();
if(weight > 0.001){
clearInterval(intervalID);
self.pos.screen_selector.set_current_screen('scale_product');
}
},500);
this.pos_widget.action_bar.add_new_button(
{
label: 'back',
click: function(){ //TODO Go to ask for weighting screen
clearInterval(this.intervalID);
self.pos.proxy.weighting_end();
self.pos.screen_selector.set_current_screen('scan');
}
}
);
},
hide: function(){
this._super();
clearInterval(this.intervalID);
},
});
module.ScaleProductScreenWidget = module.ScreenWidget.extend({
template:'ScaleProductSelectionScreenWidget',
start: function(){
this.product_categories_widget = new module.ProductCategoriesWidget(null,{
pos:this.pos,
});
this.product_categories_widget.replace($('.placeholder-ProductCategoriesWidget'));
this.product_list_widget = new module.ProductListWidget(null,{
pos:this.pos,
});
this.product_list_widget.replace($('.placeholder-ProductListWidget'));
},
show: function(){
this._super();
var self = this;
this.pos_widget.set_numpad_visible(false);
this.pos_widget.set_leftpane_visible(true);
this.pos_widget.set_cashier_controls_visible(false);
this.pos_widget.orderView.setNumpadState(this.pos_widget.numpadView.state);
this.pos_widget.action_bar.add_new_button(
{
label: 'back',
click: function(){
self.pos.screen_selector.set_current_screen('scan');
}
}
);
this.pos.barcode_reader.set_action_callbacks({
'cashier': function(ean){
//TODO 'switch to cashier mode'
self.proxy.cashier_mode_activated();
},
});
},
hide: function(){
this._super();
this.pos_widget.orderView.setNumpadState(null);
this.pos_widget.payment_screen.setNumpadState(null);
},
});
module.ClientPaymentScreenWidget = module.ScreenWidget.extend({
template:'ClientPaymentScreenWidget',
show: function(){
this._super();
var self = this;
this.pos_widget.set_numpad_visible(false);
this.pos_widget.set_leftpane_visible(true);
this.pos_widget.set_cashier_controls_visible(false);
this.pos.proxy.payment_request(0,'card','info'); //TODO TOTAL
var intervalID = setInterval(function(){
var payment = self.pos.proxy.is_payment_accepted();
if(payment === 'payment_accepted'){
clearInterval(intervalID);
//TODO process the payment stuff
self.pos.proxy.transaction_end();
self.pos.screen_selector.set_current_screen('welcome');
}else if(payment === 'payment_rejected'){
clearInterval(intervalID);
//TODO show a tryagain thingie ?
}
},500);
this.pos_widget.action_bar.add_new_button(
{
label: 'back',
click: function(){ //TODO Go to ask for weighting screen
clearInterval(intervalID);
self.pos.proxy.payment_canceled();
self.pos.screen_selector.set_current_screen('scan');
}
}
);
this.pos.barcode_reader.set_action_callbacks({
'cashier': function(ean){
//TODO 'switch to cashier mode'
clearInterval(intervalID);
self.proxy.cashier_mode_activated();
self.pos.screen_selector.set_current_screen('products');
},
});
},
});
module.WelcomeScreenWidget = module.ScreenWidget.extend({
template:'WelcomeScreenWidget',
show: function(){
this._super();
var self = this;
this.pos_widget.set_numpad_visible(false);
this.pos_widget.set_leftpane_visible(false);
this.pos_widget.set_cashier_controls_visible(false);
this.pos_widget.action_bar.add_new_button(
{
label:'scan',
click: function(){
self.pos.screen_selector.set_current_screen('scan');
}
},{
label: 'peser',
click: function(){ //TODO Go to ask for weighting screen
self.pos.screen_selector.set_current_screen('scale_invite');
}
}
);
this.pos.barcode_reader.set_action_callbacks({
'product': function(ean){
self.proxy.transaction_start();
self.pos.barcode_reader.scan_product_callback(ean);
self.pos.screen_selector.set_current_screen('products');
},
'cashier': function(ean){
//TODO 'switch to cashier mode'
self.proxy.cashier_mode_activated();
self.pos.screen_selector.set_current_screen('products');
},
'client': function(ean){
self.proxy.transaction_start();
//TODO 'log the client'
self.pos.screen_selector.set_current_screen('products');
},
'discount': function(ean){
// TODO : what to do in this case ????
},
});
},
hide: function(){
this._super();
this.pos.barcode_reader.reset_action_callbacks();
this.pos_widget.action_bar.destroy_buttons();
},
});
module.ScanProductScreenWidget = module.ScreenWidget.extend({
template:'ScanProductScreenWidget',
show: function(){
this._super();
var self = this;
this.pos_widget.set_numpad_visible(false);
this.pos_widget.set_leftpane_visible(true);
this.pos_widget.set_cashier_controls_visible(false);
this.pos_widget.action_bar.add_new_button(
{
label: 'weight',
click: function(){ //TODO Go to ask for weighting screen
self.pos.screen_selector.set_current_screen('scale_invite');
}
},{
label: 'pay',
click: function(){
self.pos.screen_selector.set_current_screen('client_payment'); //TODO what stuff ?
}
}
);
this.pos.barcode_reader.set_action_callbacks({
'product': function(ean){
var success = self.pos.barcode_reader.scan_product_callback(ean);
if(success){
self.proxy.scan_item_success();
}else{
self.proxy.scan_item_error_unrecognized();
}
},
'cashier': function(ean){
//TODO 'switch to cashier mode'
self.proxy.cashier_mode_activated();
},
'discount': function(ean){
// TODO : handle the discount
},
});
},
});
module.SearchProductScreenWidget = module.ScreenWidget.extend({
template:'SearchProductScreenWidget',
start: function(){
this.product_categories_widget = new module.ProductCategoriesWidget(null,{
pos:this.pos,
});
this.product_categories_widget.replace($('.placeholder-ProductCategoriesWidget'));
this.product_list_widget = new module.ProductListWidget(null,{
pos:this.pos,
});
this.product_list_widget.replace($('.placeholder-ProductListWidget'));
},
show: function(){
this._super();
var self = this;
this.pos_widget.set_numpad_visible(true);
this.pos_widget.set_leftpane_visible(true);
this.pos_widget.set_cashier_controls_visible(true);
this.pos_widget.orderView.setNumpadState(this.pos_widget.numpadView.state);
this.pos_widget.action_bar.add_new_button(
{
label: 'weight',
click: function(){ //TODO Go to ask for weighting screen
}
},{
label: 'pay',
click: function(){
self.pos.screen_selector.set_current_screen('payment'); //TODO what stuff ?
}
}
);
this.pos.barcode_reader.set_action_callbacks({
'product': function(ean){
var success = self.pos.barcode_reader.scan_product_callback(ean);
if(success){
self.proxy.scan_item_success();
}else{
self.proxy.scan_item_error_unrecognized();
}
},
'cashier': function(ean){
//TODO 'switch to cashier mode'
self.proxy.cashier_mode_activated();
},
'discount': function(ean){
// TODO : handle the discount
},
});
},
hide: function(){
this._super();
this.pos_widget.orderView.setNumpadState(null);
this.pos_widget.payment_screen.setNumpadState(null);
},
});
module.ReceiptScreenWidget = module.ScreenWidget.extend({
template: 'ReceiptScreenWidget',
init: function(parent, options) {
this._super(parent,options);
this.model = options.model;
this.user = this.pos.get('user');
this.company = this.pos.get('company');
this.shop_obj = this.pos.get('shop');
},
start: function() {
this.pos.bind('change:selectedOrder', this.changeSelectedOrder, this);
this.changeSelectedOrder();
$('button#pos-finish-order', this.$element).click(_.bind(this.finishOrder, this));
$('button#print-the-ticket', this.$element).click(_.bind(this.print, this));
},
show: function(){
this._super();
this.pos_widget.set_numpad_visible(true);
this.pos_widget.set_leftpane_visible(true);
this.pos_widget.set_cashier_controls_visible(true);
},
print: function() {
window.print();
},
finishOrder: function() {
this.pos.get('selectedOrder').destroy();
},
changeSelectedOrder: function() {
if (this.currentOrderLines)
this.currentOrderLines.unbind();
this.currentOrderLines = (this.pos.get('selectedOrder')).get('orderLines');
this.currentOrderLines.bind('add', this.refresh, this);
this.currentOrderLines.bind('change', this.refresh, this);
this.currentOrderLines.bind('remove', this.refresh, this);
if (this.currentPaymentLines)
this.currentPaymentLines.unbind();
this.currentPaymentLines = (this.pos.get('selectedOrder')).get('paymentLines');
this.currentPaymentLines.bind('all', this.refresh, this);
this.refresh();
},
refresh: function() {
this.currentOrder = this.pos.get('selectedOrder');
$('.pos-receipt-container', this.$element).html(qweb_template('pos-ticket')({widget:this}));
},
});
module.PaymentScreenWidget = module.ScreenWidget.extend({
template_fct: qweb_template('PaymentScreenWidget'),
init: function(parent, options) {
this._super(parent,options);
this.model = options.model;
this.pos.bind('change:selectedOrder', this.changeSelectedOrder, this);
this.bindPaymentLineEvents();
this.bindOrderLineEvents();
},
show: function(){
this._super();
this.pos_widget.set_numpad_visible(true);
this.pos_widget.set_leftpane_visible(true);
this.pos_widget.set_cashier_controls_visible(true);
this.setNumpadState(this.pos_widget.numpadView.state);
},
hide: function(){
this._super();
this.pos_widget.orderView.setNumpadState(null);
this.pos_widget.payment_screen.setNumpadState(null);
},
paymentLineList: function() {
return this.$element.find('#paymentlines');
},
back: function() {
console.log('back');
this.pos.screen_selector.set_current_screen('products');
},
validateCurrentOrder: function() {
var callback, currentOrder;
currentOrder = this.pos.get('selectedOrder');
$('button#validate-order', this.$element).attr('disabled', 'disabled');
this.pos.push_order(currentOrder.exportAsJSON()).then(_.bind(function() {
$('button#validate-order', this.$element).removeAttr('disabled');
return currentOrder.set({
validated: true
});
}, this));
},
bindPaymentLineEvents: function() {
this.currentPaymentLines = (this.pos.get('selectedOrder')).get('paymentLines');
this.currentPaymentLines.bind('add', this.addPaymentLine, this);
this.currentPaymentLines.bind('remove', this.renderElement, this);
this.currentPaymentLines.bind('all', this.updatePaymentSummary, this);
},
bindOrderLineEvents: function() {
this.currentOrderLines = (this.pos.get('selectedOrder')).get('orderLines');
this.currentOrderLines.bind('all', this.updatePaymentSummary, this);
},
changeSelectedOrder: function() {
this.currentPaymentLines.unbind();
this.bindPaymentLineEvents();
this.currentOrderLines.unbind();
this.bindOrderLineEvents();
this.renderElement();
},
addPaymentLine: function(newPaymentLine) {
var x = new module.PaymentlineWidget(null, {
model: newPaymentLine
});
x.on_delete.add(_.bind(this.deleteLine, this, x));
x.appendTo(this.paymentLineList());
},
renderElement: function() {
this._super();
this.$element.html(this.template_fct());
this.paymentLineList().empty();
this.currentPaymentLines.each(_.bind( function(paymentLine) {
this.addPaymentLine(paymentLine);
}, this));
this.updatePaymentSummary();
$('button#validate-order', this.$element).click(_.bind(this.validateCurrentOrder, this));
$('.oe-back-to-products', this.$element).click(_.bind(this.back, this));
},
deleteLine: function(lineWidget) {
this.currentPaymentLines.remove([lineWidget.model]);
},
updatePaymentSummary: function() {
var currentOrder, dueTotal, paidTotal, remaining, remainingAmount;
currentOrder = this.pos.get('selectedOrder');
paidTotal = currentOrder.getPaidTotal();
dueTotal = currentOrder.getTotal();
this.$element.find('#payment-due-total').html(dueTotal.toFixed(2));
this.$element.find('#payment-paid-total').html(paidTotal.toFixed(2));
remainingAmount = dueTotal - paidTotal;
remaining = remainingAmount > 0 ? 0 : (-remainingAmount).toFixed(2);
$('#payment-remaining').html(remaining);
},
setNumpadState: function(numpadState) {
if (this.numpadState) {
this.numpadState.unbind('setValue', this.setValue);
this.numpadState.unbind('change:mode', this.setNumpadMode);
}
this.numpadState = numpadState;
if (this.numpadState) {
this.numpadState.bind('setValue', this.setValue, this);
this.numpadState.bind('change:mode', this.setNumpadMode, this);
this.numpadState.reset();
this.setNumpadMode();
}
},
setNumpadMode: function() {
this.numpadState.set({mode: 'payment'});
},
setValue: function(val) {
this.currentPaymentLines.last().set({amount: val});
},
});
}

View File

@ -72,11 +72,11 @@ function openerp_pos_widgets(module, instance){ //module is instance.point_of_sa
this.$element.find('button').click(_.bind(this.performPayment, this));
},
performPayment: function(event) {
if (this.pos.get('selectedOrder').get('step') === 'receipt')
if (this.pos.get('selectedOrder').get('screen') === 'receipt')
return;
var cashRegister, cashRegisterCollection, cashRegisterId;
/* set correct view */
this.pos.get('selectedOrder').set({'step': 'payment'});
this.pos.screen_selector.set_current_screen('payment');
cashRegisterId = event.currentTarget.attributes['cash-register-id'].nodeValue;
cashRegisterCollection = this.pos.get('cashRegisters');
@ -105,37 +105,6 @@ function openerp_pos_widgets(module, instance){ //module is instance.point_of_sa
return this;
}
});
/*
There are 3 steps in a POS workflow:
1. prepare the order (i.e. chose products, quantities etc.)
2. choose payment method(s) and amount(s)
3. validae order and print receipt
It should be possible to go back to any step as long as step 3 hasn't been completed.
Modifying an order after validation shouldn't be allowed.
*/
module.StepSwitcher = instance.web.OldWidget.extend({
init: function(parent, options) {
this._super(parent);
this.pos = options.pos;
this.change_order();
this.pos.bind('change:selectedOrder', this.change_order, this);
},
change_order: function() {
if (this.selected_order) {
this.selected_order.unbind('change:step', this.change_step);
}
this.selected_order = this.pos.get('selectedOrder');
if (this.selected_order) {
this.selected_order.bind('change:step', this.change_step, this);
}
this.change_step();
},
change_step: function() {
var new_step = this.selected_order ? this.selected_order.get('step') : 'products';
$('.step-screen').hide();
$('#' + new_step + '-screen').show();
},
});
// ---------- "Shopping Carts" ----------
@ -262,49 +231,10 @@ function openerp_pos_widgets(module, instance){ //module is instance.point_of_sa
},
});
// ---------- "Products" step. ----------
// ---------- Product Screen ----------
module.CategoryWidget = instance.web.OldWidget.extend({
init: function(parent, options){
this._super(parent,options.element_id);
this.pos = options.pos;
},
start: function() {
this.$element.find(".oe-pos-categories-list a").click(_.bind(this.changeCategory, this));
},
template_fct: qweb_template('pos-category-template'),
renderElement: function() {
var self = this;
var c;
this.$element.html(this.template_fct({
breadcrumb: (function() {
var _i, _len, _results;
_results = [];
for (_i = 0, _len = self.ancestors.length; _i < _len; _i++) {
c = self.ancestors[_i];
_results.push(self.pos.categories[c]);
}
return _results;
})(),
categories: (function() {
var _i, _len, _results;
_results = [];
for (_i = 0, _len = self.children.length; _i < _len; _i++) {
c = self.children[_i];
_results.push(self.pos.categories[c]);
}
return _results;
})()
}));
},
changeCategory: function(a) {
var id = $(a.target).data("category-id");
this.on_change_category(id);
},
on_change_category: function(id) {},
});
module.ProductWidget = instance.web.OldWidget.extend({
module.ProductWidget = instance.web.Widget.extend({
tagName:'li',
template_fct: qweb_template('pos-product-template'),
init: function(parent, options) {
@ -327,26 +257,6 @@ function openerp_pos_widgets(module, instance){ //module is instance.point_of_sa
},
});
module.ProductListWidget = instance.web.OldWidget.extend({
init: function(parent, options) {
this._super(parent);
this.model = options.model;
this.pos = options.pos;
this.pos.get('products').bind('reset', this.renderElement, this);
},
renderElement: function() {
this.$element.empty();
(this.pos.get('products')).each(_.bind( function(product) {
var p = new module.ProductWidget(null, {
model: product,
pos: this.pos
});
p.appendTo(this.$element);
}, this));
return this;
},
});
// ---------- "Payment" step. ----------
module.PaymentlineWidget = instance.web.OldWidget.extend({
@ -384,146 +294,6 @@ function openerp_pos_widgets(module, instance){ //module is instance.point_of_sa
},
});
module.PaymentWidget = instance.web.OldWidget.extend({
init: function(parent, options) {
this._super(parent);
this.model = options.model;
this.pos = options.pos;
this.pos.bind('change:selectedOrder', this.changeSelectedOrder, this);
this.bindPaymentLineEvents();
this.bindOrderLineEvents();
},
paymentLineList: function() {
return this.$element.find('#paymentlines');
},
start: function() {
$('button#validate-order', this.$element).click(_.bind(this.validateCurrentOrder, this));
$('.oe-back-to-products', this.$element).click(_.bind(this.back, this));
},
back: function() {
this.pos.get('selectedOrder').set({"step": "products"});
},
validateCurrentOrder: function() {
var callback, currentOrder;
currentOrder = this.pos.get('selectedOrder');
$('button#validate-order', this.$element).attr('disabled', 'disabled');
this.pos.push_order(currentOrder.exportAsJSON()).then(_.bind(function() {
$('button#validate-order', this.$element).removeAttr('disabled');
return currentOrder.set({
validated: true
});
}, this));
},
bindPaymentLineEvents: function() {
this.currentPaymentLines = (this.pos.get('selectedOrder')).get('paymentLines');
this.currentPaymentLines.bind('add', this.addPaymentLine, this);
this.currentPaymentLines.bind('remove', this.renderElement, this);
this.currentPaymentLines.bind('all', this.updatePaymentSummary, this);
},
bindOrderLineEvents: function() {
this.currentOrderLines = (this.pos.get('selectedOrder')).get('orderLines');
this.currentOrderLines.bind('all', this.updatePaymentSummary, this);
},
changeSelectedOrder: function() {
this.currentPaymentLines.unbind();
this.bindPaymentLineEvents();
this.currentOrderLines.unbind();
this.bindOrderLineEvents();
this.renderElement();
},
addPaymentLine: function(newPaymentLine) {
var x = new module.PaymentlineWidget(null, {
model: newPaymentLine
});
x.on_delete.add(_.bind(this.deleteLine, this, x));
x.appendTo(this.paymentLineList());
},
renderElement: function() {
this.paymentLineList().empty();
this.currentPaymentLines.each(_.bind( function(paymentLine) {
this.addPaymentLine(paymentLine);
}, this));
this.updatePaymentSummary();
},
deleteLine: function(lineWidget) {
this.currentPaymentLines.remove([lineWidget.model]);
},
updatePaymentSummary: function() {
var currentOrder, dueTotal, paidTotal, remaining, remainingAmount;
currentOrder = this.pos.get('selectedOrder');
paidTotal = currentOrder.getPaidTotal();
dueTotal = currentOrder.getTotal();
this.$element.find('#payment-due-total').html(dueTotal.toFixed(2));
this.$element.find('#payment-paid-total').html(paidTotal.toFixed(2));
remainingAmount = dueTotal - paidTotal;
remaining = remainingAmount > 0 ? 0 : (-remainingAmount).toFixed(2);
$('#payment-remaining').html(remaining);
},
setNumpadState: function(numpadState) {
if (this.numpadState) {
this.numpadState.unbind('setValue', this.setValue);
this.numpadState.unbind('change:mode', this.setNumpadMode);
}
this.numpadState = numpadState;
if (this.numpadState) {
this.numpadState.bind('setValue', this.setValue, this);
this.numpadState.bind('change:mode', this.setNumpadMode, this);
this.numpadState.reset();
this.setNumpadMode();
}
},
setNumpadMode: function() {
this.numpadState.set({mode: 'payment'});
},
setValue: function(val) {
this.currentPaymentLines.last().set({amount: val});
},
});
module.ReceiptWidget = instance.web.OldWidget.extend({
init: function(parent, options) {
this._super(parent);
this.model = options.model;
this.pos = options.pos;
this.pos = options.pos;
this.user = this.pos.get('user');
this.company = this.pos.get('company');
this.shop_obj = this.pos.get('shop');
},
start: function() {
this.pos.bind('change:selectedOrder', this.changeSelectedOrder, this);
this.changeSelectedOrder();
},
renderElement: function() {
this.$element.html(qweb_template('pos-receipt-view'));
$('button#pos-finish-order', this.$element).click(_.bind(this.finishOrder, this));
$('button#print-the-ticket', this.$element).click(_.bind(this.print, this));
},
print: function() {
window.print();
},
finishOrder: function() {
this.pos.get('selectedOrder').destroy();
},
changeSelectedOrder: function() {
if (this.currentOrderLines)
this.currentOrderLines.unbind();
this.currentOrderLines = (this.pos.get('selectedOrder')).get('orderLines');
this.currentOrderLines.bind('add', this.refresh, this);
this.currentOrderLines.bind('change', this.refresh, this);
this.currentOrderLines.bind('remove', this.refresh, this);
if (this.currentPaymentLines)
this.currentPaymentLines.unbind();
this.currentPaymentLines = (this.pos.get('selectedOrder')).get('paymentLines');
this.currentPaymentLines.bind('all', this.refresh, this);
this.refresh();
},
refresh: function() {
this.currentOrder = this.pos.get('selectedOrder');
$('.pos-receipt-container', this.$element).html(qweb_template('pos-ticket')({widget:this}));
},
});
module.OrderButtonWidget = instance.web.OldWidget.extend({
tagName: 'li',
template_fct: qweb_template('pos-order-selector-button-template'),
@ -583,60 +353,164 @@ function openerp_pos_widgets(module, instance){ //module is instance.point_of_sa
},
});
module.ActionbarWidget = instance.web.Widget.extend({
template:'pos-actionbar',
module.ActionBarWidget = instance.web.Widget.extend({
template:'ActionBarWidget',
init: function(parent, options){
this._super(parent,options);
this.left_button_list = [];
this.right_button_list = [];
this.button_list = [];
},
start: function(){
console.log('hello world!');
window.actionbarwidget = this;
},
destroyButtons:function(position){
var button_list;
if(position === 'left'){
button_list = this.left_button_list;
this.left_button_list = [];
}else if (position === 'right'){
button_list = this.right_button_list;
this.right_button_list = [];
}else{
return this;
}
for(var i = 0; i < button_list.length; i++){
button_list[i].destroy();
destroy_buttons:function(){
for(var i = 0; i < this.button_list.length; i++){
this.button_list[i].destroy();
}
this.button_list = [];
return this;
},
addNewButton: function(position,button_options){
if(arguments.length == 2){
var button_list;
var $button_list;
if(position === 'left'){
button_list = this.left_button_list;
$button_list = $('.pos-actionbar-left-region');
}else if(position === 'right'){
button_list = this.right_button_list;
$button_list = $('.pos-actionbar-right-region');
}
add_new_button: function(button_options){
if(arguments.length == 1){
var button = new module.ActionButtonWidget(this,button_options);
button_list.push(button);
button.appendTo($button_list);
this.button_list.push(button);
button.appendTo($('.pos-actionbar-button-list'));
}else{
for(var i = 1; i < arguments.length; i++){
this.addNewButton(position,arguments[i]);
for(var i = 0; i < arguments.length; i++){
this.add_new_button(arguments[i]);
}
}
return this;
}
/*
renderElement: function() {
//this.$element.html(this.template_fct());
},*/
});
module.ProductCategoriesWidget = instance.web.Widget.extend({
init: function(parent, options){
this._super(parent);
this.pos = options.pos;
this.on_change_category.add_last(_.bind(this.search_and_categories, this));
this.search_and_categories();
},
start: function() {
this.search_and_categories();
this.$element.find(".oe-pos-categories-list a").click(_.bind(this.changeCategory, this));
},
template_fct: qweb_template('ProductCategoriesWidget'),
template:'ProductCategoriesWidget',
renderElement: function() {
var self = this;
var c;
this.$element.empty();
this.$element.html(QWeb.render(this.template, {
breadcrumb: (function() {
var _i, _len, _results;
_results = [];
for (_i = 0, _len = self.ancestors.length; _i < _len; _i++) {
c = self.ancestors[_i];
_results.push(self.pos.categories[c]);
}
return _results;
})(),
categories: (function() {
var _i, _len, _results;
_results = [];
for (_i = 0, _len = self.children.length; _i < _len; _i++) {
c = self.children[_i];
_results.push(self.pos.categories[c]);
}
return _results;
})()
}));
},
changeCategory: function(a) {
var id = $(a.target).data("category-id");
this.on_change_category(id);
},
search_and_categories: function(id){
var self = this,
c,
product_list,
allProducts,
allPackages;
id = id || 0;
c = this.pos.categories[id];
this.ancestors = c.ancestors;
this.children = c.children;
this.renderElement();
allProducts = this.pos.get('product_list');
allPackages = this.pos.get('product.packaging');
product_list = this.pos.get('product_list').filter( function(p){
var _ref = p.pos_categ_id[0];
return _.indexOf(c.subtree, _ref) >= 0;
});
this.pos.get('products').reset(product_list);
this.$element.find('.searchbox input').keyup(function(){
var results, search_str;
search_str = $(this).val().toLowerCase();
if(search_str){
results = product_list.filter( function(p){
return p.name.toLowerCase().indexOf(search_str) != -1;
});
self.$element.find('.search-clear').fadeIn();
}else{
results = product_list;
self.$element.find('.search-clear').fadeOut();
}
self.pos.get('products').reset(results);
});
this.$element.find('.search-clear').click(function(){
self.pos.get('products').reset(product_list);
self.$element.find('.searchbox input').val('').focus();
self.$element.find('.search-clear').fadeOut();
});
},
on_change_category: function(id) {},
});
module.ProductListWidget = module.ScreenWidget.extend({
template:'ProductListWidget',
init: function(parent, options) {
this._super(parent);
this.model = options.model;
this.pos = options.pos;
this.pos.get('products').bind('reset', this.renderElement, this);
},
renderElement: function() {
var self = this;
this._super();
this.pos.get('products').chain().map(function(product) {
return new module.ProductWidget(this, {
model: product,
pos: self.pos
})
}).invoke('appendTo', this.$element);
return this;
},
});
// ---------- PopUp Widgets ----------
module.PopUp = instance.web.Widget.extend({
close: function(){},
});
module.HelpPopUp = module.PopUp.extend({
});
module.ErrorPopUp = module.PopUp.extend({
});
module.TicketOrInvoicePopUp = module.PopUp.extend({
});
// ---------- OnScreen Keyboard Widget ----------
// A Widget that displays an onscreen keyboard.
// There are two options when creating the widget :
//
@ -832,6 +706,8 @@ function openerp_pos_widgets(module, instance){ //module is instance.point_of_sa
},
});
// ---------- Main Point of Sale Widget ----------
module.SynchNotification = instance.web.OldWidget.extend({
template: "pos-synch-notification",
init: function() {
@ -853,6 +729,10 @@ function openerp_pos_widgets(module, instance){ //module is instance.point_of_sa
init: function() {
this._super.apply(this, arguments);
this.pos = new module.PosModel(this.session);
this.numpad_visible = true;
this.leftpane_visible = true;
this.leftpane_width = '440px';
this.cashier_controls_visible = true;
},
start: function() {
var self = this;
@ -871,14 +751,6 @@ function openerp_pos_widgets(module, instance){ //module is instance.point_of_sa
this.buildWidgets();
//self.pos.app = new module.App(self.$element, self.pos);
//this.shopView = new module.ShopWidget(null, { 'pos': this.pos } );
//this.shopView.$element = self.$element;
//this.shopView.start();
instance.webclient.set_content_full_screen(true);
if (self.pos.get('bank_statements').length === 0)
@ -895,17 +767,60 @@ function openerp_pos_widgets(module, instance){ //module is instance.point_of_sa
return qweb_template("POSWidget")();
},
buildWidgets: function() {
var self = this;
$('button#neworder-button', this.$element).click(_.bind(this.createNewOrder, this));
(this.pos.get('orders')).bind('add', this.orderAdded, this);
(this.pos.get('orders')).add(new module.Order({'pos':this.pos}));
this.productListView = new module.ProductListWidget(null, {
this.search_product_screen = new module.SearchProductScreenWidget(this,{
pos: this.pos,
pos_widget: this,
});
this.productListView.$element = $("#products-screen-ol");
this.productListView.renderElement();
this.productListView.start();
this.search_product_screen.appendTo($('#rightpane'));
this.scan_product_screen = new module.ScanProductScreenWidget(this,{
pos: this.pos,
pos_widget: this,
});
this.scan_product_screen.appendTo($('#rightpane'));
this.receipt_screen = new module.ReceiptScreenWidget(this, {
pos: this.pos,
pos_widget: this,
});
this.receipt_screen.appendTo($('#rightpane'));
this.payment_screen = new module.PaymentScreenWidget(this, {
pos: this.pos,
pos_widget: this,
});
this.payment_screen.appendTo($('#rightpane'));
this.welcome_screen = new module.WelcomeScreenWidget(this,{
pos:this.pos,
pos_widget: this,
});
this.welcome_screen.appendTo($('#rightpane'));
this.client_payment_screen = new module.ClientPaymentScreenWidget(this, {
pos: this.pos,
pos_widget: this,
});
this.client_payment_screen.appendTo($('#rightpane'));
this.scale_invite_screen = new module.ScaleInviteScreenWidget(this, {
pos: this.pos,
pos_widget: this,
});
this.scale_invite_screen.appendTo($('#rightpane'));
this.scale_product_screen = new module.ScaleProductScreenWidget(this, {
pos: this.pos,
pos_widget: this,
});
this.scale_product_screen.appendTo($('#rightpane'));
this.paypadView = new module.PaypadWidget(null, {
pos: this.pos
});
@ -920,53 +835,34 @@ function openerp_pos_widgets(module, instance){ //module is instance.point_of_sa
});
this.orderView.$element = $('#current-order-content');
this.orderView.start();
this.paymentView = new module.PaymentWidget(null, {
pos: this.pos,
});
this.paymentView.$element = $('#payment-screen');
this.paymentView.renderElement();
this.paymentView.start();
this.receiptView = new module.ReceiptWidget(null, {
pos: this.pos,
});
this.receiptView.replace($('#receipt-screen'));
this.stepSwitcher = new module.StepSwitcher(this, {pos: this.pos});
this.pos.bind('change:selectedOrder', this.changedSelectedOrder, this);
this.changedSelectedOrder();
this.categoryView = new module.CategoryWidget(null, {
'element_id': 'products-screen-categories',
'pos': this.pos,
});
this.categoryView.on_change_category.add_last(_.bind(this.search_and_categories, this));
this.search_and_categories();
this.action_bar = new module.ActionBarWidget(null);
this.action_bar.appendTo($(".point-of-sale #content"));
this.onscreenKeyboard = new module.OnscreenKeyboardWidget(null, {
this.onscreen_keyboard = new module.OnscreenKeyboardWidget(null, {
'keyboard_model': 'simple'
});
this.onscreenKeyboard.appendTo($(".point-of-sale #content"));
this.barcodeReader = new module.BarcodeReader({'pos': self.pos });
//this.connection = new instance.web.Connection();
//this.connection.session_bind('http://localhost:8069');
this.connection = new instance.web.BaseConnection();
this.connection.bind('http://localhost:8069');
this.actionBar = new module.ActionbarWidget(null);
this.actionBar.appendTo($(".point-of-sale #content"));
this.actionBar.addNewButton('left',{
label : 'Hello World',
icon : '/point_of_sale/static/src/img/icons/png48/face-monkey.png',
click : function() {
//console.log("Hello World!");
self.connection.rpc("/pos/dispatch", {iface: 'light', status: 1}, function(result) {
console.log(result);
})
}
this.onscreen_keyboard.appendTo($(".point-of-sale #content"));
this.pos.screen_selector = new module.ScreenSelector({
pos: this.pos,
screen_set:{
'products': this.search_product_screen,
'scan': this.scan_product_screen,
'payment' : this.payment_screen,
'client_payment' : this.client_payment_screen,
'scale_invite' : this.scale_invite_screen,
'scale_product' : this.scale_product_screen,
'receipt' : this.receipt_screen,
'welcome' : this.welcome_screen,
},
default_client_screen: 'welcome',
default_cashier_screen: 'products',
default_mode: 'client',
});
window.screen_selector = this.pos.screen_selector;
this.pos.barcode_reader.connect();
},
createNewOrder: function() {
@ -986,75 +882,47 @@ function openerp_pos_widgets(module, instance){ //module is instance.point_of_sa
newOrderButton.appendTo($('#orders'));
newOrderButton.selectOrder();
},
changedSelectedOrder: function() {
if (this.currentOrder) {
this.currentOrder.unbind('change:step', this.changedStep);
}
this.currentOrder = this.pos.get('selectedOrder');
this.currentOrder.bind('change:step', this.changedStep, this);
this.changedStep();
},
changedStep: function() {
var step = this.currentOrder.get('step');
this.orderView.setNumpadState(null);
this.paymentView.setNumpadState(null);
if (step === 'products') {
this.orderView.setNumpadState(this.numpadView.state);
} else if (step === 'payment') {
this.paymentView.setNumpadState(this.numpadView.state);
}
},
search_and_categories: function(id){
var self = this,
c,
product_list,
allProducts,
allPackages;
id = id || 0;
c = this.pos.categories[id];
this.categoryView.ancestors = c.ancestors;
this.categoryView.children = c.children;
this.categoryView.renderElement();
this.categoryView.start();
allProducts = this.pos.get('product_list');
allPackages = this.pos.get('product.packaging');
product_list = this.pos.get('product_list').filter( function(p){
var _ref = p.pos_categ_id[0];
return _.indexOf(c.subtree, _ref) >= 0;
});
this.pos.get('products').reset(product_list);
$('.searchbox input').keyup(function(){
var results, search_str;
search_str = $(this).val().toLowerCase();
if(search_str){
results = product_list.filter( function(p){
return p.name.toLowerCase().indexOf(search_str) != -1;
});
$('.search-clear').fadeIn();
}else{
results = product_list;
$('.search-clear').fadeOut();
}
self.pos.get('products').reset(results);
});
$('.search-clear').click(function(){
self.pos.get('products').reset(product_list);
$('.searchbox input').val('').focus();
$('.search-clear').fadeOut();
});
},
changed_pending_operations: function () {
var self = this;
this.synch_notification.on_change_nbr_pending(self.pos.get('nbr_pending_operations').length);
},
set_numpad_visible: function(visible){
if(visible != this.numpad_visible){
this.numpad_visible = visible;
if(visible){
$('#numpad').show();
$('#paypad').show();
}else{
$('#numpad').hide();
$('#paypad').hide();
}
}
},
set_leftpane_visible: function(visible){
if(visible != this.leftpane_visible){
this.leftpane_visible = visible;
if(visible){
$('#leftpane').show().animate({'width':this.leftpane_width},500,'swing');
$('#rightpane').animate({'left':this.leftpane_width},500,'swing');
}else{
var leftpane = $('#leftpane');
$('#leftpane').animate({'width':'0px'},500,'swing', function(){ leftpane.hide(); });
$('#rightpane').animate({'left':'0px'},500,'swing');
}
}
},
set_cashier_controls_visible: function(visible){
if(visible != this.cashier_controls_visible){
this.cashier_controls_visible = visible;
if(visible){
$('#loggedas').show();
$('#rightheader').show();
}else{
$('#loggedas').hide();
$('#rightheader').hide();
}
}
},
try_close: function() {
var self = this;
self.pos.flush().then(_.bind(function() {
@ -1086,7 +954,7 @@ function openerp_pos_widgets(module, instance){ //module is instance.point_of_sa
}, this));
},
close: function() {
this.barcodeReader.disconnect();
this.pos.barcode_reader.disconnect();
return new instance.web.Model("ir.model.data").get_func("search_read")([['name', '=', 'action_pos_close_statement']], ['res_id']).pipe(
_.bind(function(res) {

View File

@ -79,57 +79,12 @@
</footer>
</div>
<div id="rightpane">
<div id="products-screen" class="step-screen selected-step">
<!-- <div id="products-screen" class="step-screen selected-step">
<div id="products-screen-categories"/>
<ol id="products-screen-ol" class="product-list"></ol>
</div>
<div id="payment-screen" class="step-screen" style="display:none">
<header><h2>Payment</h2></header>
<div class="pos-step-container">
<div class="pos-payment-container">
<br />
<table>
<tr>
<td class="paymentline-type">Total:</td>
<td class="paymentline-amount pos-right-align">
<t t-if="currency.position == 'before'" t-esc="currency.symbol"/>
<span id="payment-due-total"></span>
<t t-if="currency.position == 'after'" t-esc="currency.symbol"/>
</td>
</tr>
</table>
<table id="paymentlines">
</table>
<table>
<tr>
<td class="paymentline-type">Paid:</td>
<td class="paymentline-amount pos-right-align">
<t t-if="currency.position == 'before'" t-esc="currency.symbol"/>
<span id="payment-paid-total"></span>
<t t-if="currency.position == 'after'" t-esc="currency.symbol"/>
</td>
</tr>
<tr>
<td class="paymentline-type">Change:</td>
<td class="paymentline-amount pos-right-align">
<t t-if="currency.position == 'before'" t-esc="currency.symbol"/>
<span id="payment-remaining"></span>
<t t-if="currency.position == 'after'" t-esc="currency.symbol"/>
</td>
</tr>
</table>
</div>
<div class="pos-payment-buttons">
<button class="oe-back-to-products">
<img src="/web/static/src/img/icons/gtk-go-back.png"></img>
Back to Products</button>
<button id="validate-order">
<img src="/web/static/src/img/icons/gtk-apply.png"></img>
Validate</button>
</div>
</div>
</div>
<span id="receipt-screen"></span>
</div> -->
<!-- <div id="payment-screen" class="step-screen" style="display:none"> ... </div> -->
<!-- <span id="receipt-screen"></span> -->
</div>
</div>
</div>
@ -147,7 +102,10 @@
<t t-name="pos-close-warning">
<div>There are pending operations that could not be saved into the database, are you sure you want to exit?</div>
</t>
<t t-name="pos-category-template">
<!-- ************ SEARCH PRODUCT SCREEN ************ -->
<t t-name="ProductCategoriesWidget">
<header>
<ol class="breadcrumb">
<li class="oe-pos-categories-list">
@ -181,6 +139,122 @@
</ol>
</div>
</t>
<t t-name="ProductListWidget">
<ol id="products-screen-ol" class="product-list">
</ol>
</t>
<t t-name="SearchProductScreenWidget">
<div id="products-screen">
<span class="placeholder-ProductCategoriesWidget" />
<span class="placeholder-ProductListWidget" />
</div>
</t>
<!-- ************ PAYMENT SCREEN ************ -->
<t t-name="PaymentScreenWidget">
<div id="payment-screen" class="step-screen">
<header><h2>Payment</h2></header>
<div class="pos-step-container">
<div class="pos-payment-container">
<br />
<table>
<tr>
<td class="paymentline-type">Total:</td>
<td class="paymentline-amount pos-right-align">
<t t-if="currency.position == 'before'" t-esc="currency.symbol"/>
<span id="payment-due-total"></span>
<t t-if="currency.position == 'after'" t-esc="currency.symbol"/>
</td>
</tr>
</table>
<table id="paymentlines">
</table>
<table>
<tr>
<td class="paymentline-type">Paid:</td>
<td class="paymentline-amount pos-right-align">
<t t-if="currency.position == 'before'" t-esc="currency.symbol"/>
<span id="payment-paid-total"></span>
<t t-if="currency.position == 'after'" t-esc="currency.symbol"/>
</td>
</tr>
<tr>
<td class="paymentline-type">Change:</td>
<td class="paymentline-amount pos-right-align">
<t t-if="currency.position == 'before'" t-esc="currency.symbol"/>
<span id="payment-remaining"></span>
<t t-if="currency.position == 'after'" t-esc="currency.symbol"/>
</td>
</tr>
</table>
</div>
<div class="pos-payment-buttons">
<button class="oe-back-to-products">
<img src="/web/static/src/img/icons/gtk-go-back.png"></img>
Back to Products</button>
<button id="validate-order">
<img src="/web/static/src/img/icons/gtk-apply.png"></img>
Validate</button>
</div>
</div>
</div>
</t> <!-- pos-payment-screen -->
<!-- ************ RECEIPT SCREEN ************ -->
<t t-name="ReceiptScreenWidget">
<div id="receipt-screen" class="step-screen" >
<header><h2>Receipt</h2></header>
<div class="pos-step-container">
<div class="pos-receipt-container">
</div>
<div class='receipt-buttons'>
<button id="print-the-ticket">
Print</button>
<button id="pos-finish-order">Next Order</button>
</div>
</div>
</div>
</t>
<t t-name="WelcomeScreenWidget">
<div class="welcome-screen step-screen">
<header><h2>WELCUM</h2></header>
<p> plz scan ur card or thingie </p>
</div>
</t>
<t t-name="ScanProductScreenWidget">
<div class="scan-product-screen step-screen">
<header><h2>SCAN YOUR PRODUCT</h2></header>
<p> please scan another product ! fun !</p>
</div>
</t>
<t t-name="ClientPaymentScreenWidget">
<div class="scan-product-screen step-screen">
<header><h2>GIMME UR MONEY!!!11</h2></header>
<p> It's a rubbery </p>
</div>
</t>
<t t-name="ScaleInviteScreenWidget">
<div class="scale-invite-screen step-screen">
<header><h2>Put ur loot on the scale</h2></header>
<p> Is it worth a ton ? </p>
</div>
</t>
<t t-name="ScaleProductSelectionScreenWidget">
<div class="scale-product-selection-screen">
<span class="placeholder-ProductCategoriesWidget" />
<span class="placeholder-ProductListWidget" />
</div>
</t>
<t t-name="pos-product-template">
<a href="#">
<div class="product-img">
@ -229,20 +303,6 @@
<t t-name="pos-order-selector-button-template">
<button class="select-order"><t t-esc="widget.order.get('creationDate').toString('t')"/></button>
</t>
<t t-name="pos-receipt-view">
<div id="receipt-screen" class="step-screen" style="display:none">
<header><h2>Receipt</h2></header>
<div class="pos-step-container">
<div class="pos-receipt-container">
</div>
<div class='receipt-buttons'>
<button id="print-the-ticket">
Print</button>
<button id="pos-finish-order">Next Order</button>
</div>
</div>
</div>
</t>
<t t-name="pos-ticket">
<div class="pos-sale-ticket">
<div class="pos-right-align"><t t-esc="new Date().toString(Date.CultureInfo.formatPatterns.shortDate + ' ' +
@ -294,15 +354,17 @@
</table>
</div>
</t>
<t t-name="pos-actionbar">
<t t-name="ActionBarWidget">
<div class="pos-actionbar">
<ul class="pos-actionbar-left-region">
<!-- <li class="button">yoyo</li>
<li class="button">foo</li>
<li class="button rightalign">bar</li> -->
</ul>
<ul class="pos-actionbar-right-region">
<div class="pos-actionbar-left-pane">
<div class="button help-button">
Help
</div>
<p class="total">
Total: <span class="value"> 1234 </span>
</p>
</div>
<ul class="pos-actionbar-button-list">
<!-- <li class="button">BUTTOOON</li>
<li class="button">JEEENKIINS</li>
<li class="button rightalign">ARGH</li> -->

1710
addons/survey/i18n/fi.po Normal file

File diff suppressed because it is too large Load Diff