summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwan <wan@odoo.com>2019-06-14 12:49:47 +0000
committerwan <wan@odoo.com>2019-07-19 08:54:03 +0000
commit4b66aa58b9daf83bd72b0e1830d25fcf074320c6 (patch)
tree9548e2e73a769dd02aaef51aac9aeb83a2c091c9
parente0b16b22e8a1e6cdf55a8656042db5ae356de15d (diff)
[ADD] account: skip the transient to upload an invoice
Task 2007561 We want to avoid this intermediate screen; Instead, directly open the selection files window... Done from dashboard button + vendor bill list view & customer invoice list view.
-rw-r--r--addons/account/static/src/js/bills_tree_upload.js125
-rw-r--r--addons/account/static/src/xml/bills_tree_upload_views.xml19
-rw-r--r--addons/account/views/account_journal_dashboard_view.xml4
-rw-r--r--addons/account/wizard/account_invoice_import.py7
4 files changed, 119 insertions, 36 deletions
diff --git a/addons/account/static/src/js/bills_tree_upload.js b/addons/account/static/src/js/bills_tree_upload.js
index 5171051bb97..835dc42b7d9 100644
--- a/addons/account/static/src/js/bills_tree_upload.js
+++ b/addons/account/static/src/js/bills_tree_upload.js
@@ -1,37 +1,86 @@
+odoo.define('account.upload.bill.mixin', function (require) {
+"use strict";
+
+ var core = require('web.core');
+ var _t = core._t;
+
+ var qweb = core.qweb;
+
+ var UploadBillMixin = {
+
+ start: function () {
+ // define a unique uploadId and a callback method
+ this.fileUploadID = _.uniqueId('account_bill_file_upload');
+ $(window).on(this.fileUploadID, this._onFileUploaded.bind(this));
+ return this._super.apply(this, arguments);
+ },
+
+ _onAddAttachment: function (ev) {
+ // Auto submit form once we've selected an attachment
+ var $input = $(ev.currentTarget).find('input.o_input_file');
+ if ($input.val() !== '') {
+ var $binaryForm = this.$('.o_vendor_bill_upload form.o_form_binary_form');
+ $binaryForm.submit();
+ }
+ },
+
+ _onFileUploaded: function () {
+ // Callback once attachment have been created, create a bill with attachment ids
+ var self = this;
+ var attachments = Array.prototype.slice.call(arguments, 1);
+ // Get id from result
+ var attachent_ids = attachments.reduce(function(filtered, record) {
+ if (record.id) {
+ filtered.push(record.id);
+ }
+ return filtered;
+ }, []);
+ if (!attachent_ids.length) {
+ return self.do_notify(_t("Error"), _t("An error occurred during the upload"));
+ }
+ return this._rpc({
+ model: 'account.invoice.import.wizard',
+ method: 'create_invoices',
+ args: ["", attachent_ids],
+ context: this.initialState.context,
+ }).then(function(result) {
+ self.do_action(result);
+ });
+ },
+
+ _onUpload: function (event) {
+ var self = this;
+ if (!this.initialState.context.journal_type) {
+ this.initialState.context.journal_type = event.currentTarget.attributes['journal_type'].value;
+ }
+ // If hidden upload form don't exists, create it
+ var $formContainer = this.$('.o_content').find('.o_vendor_bill_upload');
+ if (!$formContainer.length) {
+ $formContainer = $(qweb.render('account.BillsHiddenUploadForm', {widget: this}));
+ $formContainer.appendTo(this.$('.o_content'));
+ }
+ // Trigger the input to select a file
+ this.$('.o_vendor_bill_upload .o_input_file').click();
+ },
+ }
+ return UploadBillMixin;
+});
+
+
odoo.define('account.bills.tree', function (require) {
"use strict";
var core = require('web.core');
var ListController = require('web.ListController');
var ListView = require('web.ListView');
+ var UploadBillMixin = require('account.upload.bill.mixin');
var viewRegistry = require('web.view_registry');
- var qweb = core.qweb;
-
- var BillsListController = ListController.extend({
+ var BillsListController = ListController.extend(UploadBillMixin, {
buttons_template: 'BillsListView.buttons',
- /**
- * Extends the renderButtons function of ListView by adding an event listener
- * on the bill upload button.
- *
- * @override
- */
- renderButtons: function () {
- this._super.apply(this, arguments); // Possibly sets this.$buttons
- if (this.$buttons) {
- var self = this;
- this.$buttons.on('click', '.o_button_upload_bill', function () {
- var state = self.model.get(self.handle, {raw: true});
- var context = state.getContext()
- self.do_action({
- type: 'ir.actions.act_window',
- res_model: 'account.invoice.import.wizard',
- target: 'new',
- views: [[false, 'form']],
- context: context,
- });
- });
- }
- }
+ events: _.extend({}, ListController.prototype.events, {
+ 'click .o_button_upload_bill': '_onUpload',
+ 'change .o_vendor_bill_upload .o_form_binary_form': '_onAddAttachment',
+ }),
});
var BillsListView = ListView.extend({
@@ -42,3 +91,27 @@ odoo.define('account.bills.tree', function (require) {
viewRegistry.add('account_tree', BillsListView);
});
+
+odoo.define('account.dashboard.kanban', function (require) {
+"use strict";
+ var core = require('web.core');
+ var KanbanController = require('web.KanbanController');
+ var KanbanView = require('web.KanbanView');
+ var UploadBillMixin = require('account.upload.bill.mixin');
+ var viewRegistry = require('web.view_registry');
+
+ var DashboardKanbanController = KanbanController.extend(UploadBillMixin, {
+ events: _.extend({}, KanbanController.prototype.events, {
+ 'click .o_button_upload_bill': '_onUpload',
+ 'change .o_vendor_bill_upload .o_form_binary_form': '_onAddAttachment',
+ }),
+ });
+
+ var DashboardKanbanView = KanbanView.extend({
+ config: _.extend({}, KanbanView.prototype.config, {
+ Controller: DashboardKanbanController,
+ }),
+ });
+
+ viewRegistry.add('account_dashboard_kanban', DashboardKanbanView);
+});
diff --git a/addons/account/static/src/xml/bills_tree_upload_views.xml b/addons/account/static/src/xml/bills_tree_upload_views.xml
index 449f3da8c38..af9385a5780 100644
--- a/addons/account/static/src/xml/bills_tree_upload_views.xml
+++ b/addons/account/static/src/xml/bills_tree_upload_views.xml
@@ -1,10 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates>
- <t t-name="BillsListView.upload_button">
- <button type="button" class="btn btn-secondary o_button_upload_bill">
- Upload
- </button>
+ <t t-name="account.BillsHiddenUploadForm">
+ <div class="d-none o_vendor_bill_upload">
+ <t t-call="HiddenInputFile">
+ <t t-set="fileupload_id" t-value="widget.fileUploadID"/>
+ <t t-set="fileupload_action" t-translation="off">/web/binary/upload_attachment</t>
+ <input type="hidden" name="model" t-att-value="'account.move'"/>
+ <input type="hidden" name="id" t-att-value="0"/>
+ </t>
+ </div>
</t>
<t t-extend="ListView.buttons" t-name="BillsListView.buttons">
@@ -14,7 +19,11 @@
r.push(context.engine.tools.call(context, 'ImportView.import_button', dict));
};
</t>
- <t t-call="BillsListView.upload_button"/>
+ <t t-if="widget.initialState.context.journal_type === 'purchase'">
+ <button type="button" class="btn btn-secondary o_button_upload_bill">
+ Upload
+ </button>
+ </t>
</t>
</t>
</templates> \ No newline at end of file
diff --git a/addons/account/views/account_journal_dashboard_view.xml b/addons/account/views/account_journal_dashboard_view.xml
index 27776d09637..ee9abde452a 100644
--- a/addons/account/views/account_journal_dashboard_view.xml
+++ b/addons/account/views/account_journal_dashboard_view.xml
@@ -3,7 +3,7 @@
<field name="name">account.journal.dashboard.kanban</field>
<field name="model">account.journal</field>
<field name="arch" type="xml">
- <kanban create="false" class="oe_background_grey o_kanban_dashboard o_account_kanban" banner_route="/account/account_dashboard_onboarding">
+ <kanban create="false" class="oe_background_grey o_kanban_dashboard o_account_kanban" banner_route="/account/account_dashboard_onboarding" js_class="account_dashboard_kanban">
<field name="id"/>
<field name="name"/>
<field name="type"/>
@@ -296,7 +296,7 @@
</button>
</t>
<t t-if="journal_type == 'purchase'">
- <button type="action" name="%(account_invoice_import_wizard_action)d" class="btn btn-primary">
+ <button class="btn btn-primary o_button_upload_bill" journal_type="purchase">
<span>Upload Bills</span>
</button>
</t>
diff --git a/addons/account/wizard/account_invoice_import.py b/addons/account/wizard/account_invoice_import.py
index 3de4672ef0a..4ce6675bc81 100644
--- a/addons/account/wizard/account_invoice_import.py
+++ b/addons/account/wizard/account_invoice_import.py
@@ -19,15 +19,16 @@ class ImportInvoiceImportWizard(models.TransientModel):
def _create_invoice(self, attachment):
return self._create_invoice_from_file(attachment)
- def create_invoices(self):
+ def create_invoices(self, attachment_ids=[]):
''' Create the invoices from files.
:return: A action redirecting to account.invoice tree/form view.
'''
- if not self.attachment_ids:
+ attachments = self.attachment_ids or self.env['ir.attachment'].browse(attachment_ids)
+ if not attachments:
raise UserError(_("No attachment was provided"))
invoices = self.env['account.move']
- for attachment in self.attachment_ids:
+ for attachment in attachments:
invoices += self._create_invoice(attachment)
action_vals = {