diff --git a/dev/scripts/create_product.py b/dev/scripts/create_product.py new file mode 100644 index 00000000..ccb109e2 --- /dev/null +++ b/dev/scripts/create_product.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +import odoorpc + +host = 'localhost' +port = 8080 +db = 'tz-austria_1' +user = 'admin' +pw = 'x' + +odoo = odoorpc.ODOO(host, port=port) +odoo.login(db, user, pw) + +values = { + "default_code": "02", + "name": "Produktname", + "length": 45.01, + "width": 13.45, + "thickness": 33.44, + "surface": "m", + "weight": 80.45, + "is_interneal": True, + "xcat_id": "xcat_1", + "notes": "notes", + "material_type_id": "material_1", + "intrastat_id": "Code", + "sale_ok": True, + "assembly_line_ids": ["L1", "L2"], + "list_price": 50.00 +} + +product_obj = odoo.env['product.template'] + +result = product_obj.create_product(values) + +print(result) diff --git a/dev/scripts/pg_create_company.py b/dev/scripts/pg_create_company.py new file mode 100644 index 00000000..fdb5f612 --- /dev/null +++ b/dev/scripts/pg_create_company.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +import odoorpc + +host = 'localhost' +port = 8080 +db = 'tz-austria_1' +user = 'admin' +pw = 'x' + +odoo = odoorpc.ODOO(host, port=port) +odoo.login(db, user, pw) + +values = { + "name": "Company", + "street": "Elterleinplatz 11", + "zip": 1170, + "city": "Wien", + "country_id": "AT", + "fax": "+43 55567051", + "phone": "+43 5556705", + "endkunde": True, + "portal_id": "111111", + "email": "company@test.at", + "opt_out": True, + "ref": "A144S3", + "partner_sector_id": "Test", + "comment": "comment", + "vat": False, + "lang": "de", + "line_ids": ["L1", "L2"] +} + +res_partner_obj = odoo.env['res.partner'] + +result = res_partner_obj.pg_create_company(values) + +print(result) diff --git a/dev/scripts/pg_create_quotation.py b/dev/scripts/pg_create_quotation.py new file mode 100644 index 00000000..2c369215 --- /dev/null +++ b/dev/scripts/pg_create_quotation.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +import odoorpc + +host = 'localhost' +port = 8080 +db = 'tz-austria_1' +user = 'admin' +pw = 'x' + +odoo = odoorpc.ODOO(host, port=port) +odoo.login(db, user, pw) + +values = { + "origin": "", + "client_order_ref": "", + "note": "note", + "date_order": "2017-11-21", + "assembled": True, + "line_id": "L1", + "portal_id": "111111", + "portal_delivery_id": "222222", + "delivery_firstname": "Ahmed", + "delivery_lastname": "Aly", + "delivery_midname": False, + "delivery_street": "Zeilergasse 7-11", + "delivery_street2": False, + "delivery_zip": "1170", + "delivery_city": "Wien", + "delivery_country_id": "AT", + "delivery_fax": False, + "delivery_phone": False, + "delivery_mobile": "+43 676 5765575", + "delivery_company": False, + "attachment_ids": [{ + "filename": "logo.png", + "binary": "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" + }], + "order_lines": [{ + "product_id": "01", + "price_unit": 50.00, + "product_uom_qty": 4.0, + "lot_id": { + "name": "AAA012", + "notes": "notes", + "attachment_ids": [{ + "filename": "logo.gif", + "binary": "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" + }] + } + }] +} + +sale_order_obj = odoo.env['sale.order'] + +result = sale_order_obj.pg_create_quotation(values) + +print(result) diff --git a/dev/scripts/pg_get_orders.py b/dev/scripts/pg_get_orders.py new file mode 100644 index 00000000..8635c47f --- /dev/null +++ b/dev/scripts/pg_get_orders.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +import odoorpc + +host = 'localhost' +port = 8080 +db = 'tz-austria_1' +user = 'admin' +pw = 'x' + +odoo = odoorpc.ODOO(host, port=port) +odoo.login(db, user, pw) + +values = { + "line": "L1", + "state": "approved", + "limit": 8 +} + +sale_order_obj = odoo.env['sale.order'] + +result = sale_order_obj.pg_get_orders("L1", "approved", 8) + +print(result) diff --git a/dev/scripts/portal_create_partner.py b/dev/scripts/portal_create_partner.py new file mode 100644 index 00000000..33a8f84e --- /dev/null +++ b/dev/scripts/portal_create_partner.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +import odoorpc + +host = 'localhost' +port = 8080 +db = 'tz-austria_1' +user = 'admin' +pw = 'x' + +odoo = odoorpc.ODOO(host, port=port) +odoo.login(db, user, pw) + +values = { + "name": "Max Musterman", + "street": "Strasse 11", + "zip": "1145", + "city": "Wien", + "country_id": "AT", + "fax": "+43 456546", + "phone": "+43 564564", + "endkunde": True, + "portal_id": "111111", + "email": "max@musterman.at", + "opt_out": True, + "ref": "A88S", + "partner_sector_id": "Test", + "comment": "comment", + "vat": False, + "lang": "de" +} + +res_partner_obj = odoo.env['res.partner'] + + +result = res_partner_obj.portal_create_partner(values) + +print(result) diff --git a/ext/custom-addons/dp_changelogs/static/src/js/user_menu.js b/ext/custom-addons/dp_changelogs/static/src/js/user_menu.js index f782feba..07d25aac 100644 --- a/ext/custom-addons/dp_changelogs/static/src/js/user_menu.js +++ b/ext/custom-addons/dp_changelogs/static/src/js/user_menu.js @@ -6,8 +6,7 @@ odoo.define('dp_changelog.UserMenu', function (require) { UserMenu.include({ /** - * calls the action of the changlog if the menu changelog is clicked - * @return {undefined} + * @private */ _onMenuChangelogs: function () { var self = this; diff --git a/ext/custom-addons/dp_custom/__manifest__.py b/ext/custom-addons/dp_custom/__manifest__.py index 3cdce637..033fbd75 100644 --- a/ext/custom-addons/dp_custom/__manifest__.py +++ b/ext/custom-addons/dp_custom/__manifest__.py @@ -39,6 +39,12 @@ 'data/glaser_company_data.xml', 'data/tz_austria_company_data.xml', 'views/dp_custom_views.xml', + 'views/res_line_views.xml', + 'views/res_partner_views.xml', + 'views/stock_views.xml', + 'views/sale_views.xml', + 'views/material_type_views.xml', + 'views/product_views.xml', 'security/ir.model.access.csv', ], 'installable': True, diff --git a/ext/custom-addons/dp_custom/i18n/de.po b/ext/custom-addons/dp_custom/i18n/de.po index 4b660859..5ace5c3f 100644 --- a/ext/custom-addons/dp_custom/i18n/de.po +++ b/ext/custom-addons/dp_custom/i18n/de.po @@ -24,4 +24,3 @@ msgstr "" #: model:ir.model.fields,field_description:partner_second_lastname.field_res_users_lastname2 msgid "Midname" msgstr "Midname" - diff --git a/ext/custom-addons/dp_custom/models/__init__.py b/ext/custom-addons/dp_custom/models/__init__.py index a65b0f2d..4d297f47 100644 --- a/ext/custom-addons/dp_custom/models/__init__.py +++ b/ext/custom-addons/dp_custom/models/__init__.py @@ -19,6 +19,12 @@ # ############################################################################## +from . import dp_custom from . import ir_ui_menu from . import res_partner from . import res_company +from . import res_line +from . import stock +from . import sale +from . import material_type +from . import product diff --git a/ext/custom-addons/dp_custom/models/dp_custom.py b/ext/custom-addons/dp_custom/models/dp_custom.py new file mode 100644 index 00000000..600b9f8b --- /dev/null +++ b/ext/custom-addons/dp_custom/models/dp_custom.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# datenpol gmbh +# Copyright (C) 2013-TODAY datenpol gmbh () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from odoo import models, api, _ +from odoo.exceptions import ValidationError + + +class AbstractHelper(models.AbstractModel): + _name = 'dp_custom.helper' + _description = 'Abstract Helper' + + @api.model + def remove_not_specified_fields(self, vals): + specified_fields = self._get_specified_fields() + remove_fields = [] + for key in list(vals.keys()): + if key not in specified_fields: + remove_fields.append(key) + for key in remove_fields: + del vals[key] + return vals + + @api.model + def correct_values(self, vals): + return vals + + @api.model + def _get_specified_fields(self): + raise ValidationError( + _('Method \'%s\' isn\'t Implemented in model \'%s\'', (self._get_specified_fields.__name__, self._name))) diff --git a/ext/custom-addons/dp_custom/models/material_type.py b/ext/custom-addons/dp_custom/models/material_type.py new file mode 100644 index 00000000..6f95d4bd --- /dev/null +++ b/ext/custom-addons/dp_custom/models/material_type.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# datenpol gmbh +# Copyright (C) 2013-TODAY datenpol gmbh () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from odoo import fields, models + + +class MaterialType(models.Model): + _name = 'material.type' + _description = 'Materialtyp' + _order = 'name' + + name = fields.Char(string='Bezeichnung', required=True) + print_default_code = fields.Boolean(string='Drucke Artikelnummer', required=True, help='Definiert, ob die Artikelnummer gedruckt wird') + + _sql_constraints = [ + ('name_uniq', 'unique(name)', 'Die Bezeichnung muss eindeutig sein') + ] diff --git a/ext/custom-addons/dp_custom/models/product.py b/ext/custom-addons/dp_custom/models/product.py new file mode 100644 index 00000000..b28eca33 --- /dev/null +++ b/ext/custom-addons/dp_custom/models/product.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# datenpol gmbh +# Copyright (C) 2013-TODAY datenpol gmbh () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from odoo import fields, models, api, _ +from odoo.exceptions import ValidationError + + +class ProductXCategory(models.Model): + _name = 'product.xcategory' + _description = 'X-Kategorie' + _order = 'name' + + name = fields.Char(string='Bezaichnung', required=True) + + _sql_constraints = [ + ('name_uniq', 'unique(name)', 'Die Bezeichnung muss eindeutig sein') + ] + + +class ProductTemplate(models.Model): + _name = 'product.template' + _inherit = ['product.template', 'dp_custom.helper'] + + SURFACE_OPTIONS = [ + ('m', 'Maserrichtung'), + ('u', 'Einfärbig') + ] + + length = fields.Float(string='Länge in mm') + width = fields.Float(string='Breite in mm') + thickness = fields.Float(string='Ficke in mm', help='Echte Dicke in mm') + surface = fields.Selection(SURFACE_OPTIONS, string='Oberfläche') + is_internal = fields.Boolean() + xcat_id = fields.Many2one(comodel_name='product.xcategory', string='X-Kategorie') + material_type_id = fields.Many2one(comodel_name='material.type', string='Materialtyp') + assembly_line_ids = fields.Many2many(comodel_name='res.line', string='Produktionslinien') + + @api.model + def create_product(self, vals): + vals = self.remove_not_specified_fields(vals) + vals = self.correct_values(vals) + product_template = self.with_context(active_test=False).search([('default_code', '=', vals['default_code'])]) + if product_template: + product_template.write(vals) + else: + self.create(vals) + return True + + @api.model + def correct_values(self, vals): + if vals.get('xcat_id', False): + xcat = self.env['product.xcategory'].search([('name', '=', vals['xcat_id'])]) + if xcat: + vals['xcat_id'] = xcat.id + else: + raise ValidationError( + _("X-Kategorie \'%s\' kann nicht zugeordnet werden" % vals['xcat_id'])) + + if vals.get('material_type_id', False): + material_type = self.env['material.type'].search([('name', '=', vals['material_type_id'])]) + if material_type: + vals['material_type_id'] = material_type.id + else: + raise ValidationError( + _("Materialtyp \'%s\' kann nicht zugeordnet werden" % vals['material_type_id'])) + + if vals.get('intrastat_id', False): + intrastat = self.env['report.intrastat.code'].search([('name', '=', vals['intrastat_id'])]) + if intrastat: + vals['intrastat_id'] = intrastat.id + else: + raise ValidationError( + _("Intrastat-Code \'%s\' kann nicht zugeordnet werden" % vals['intrastat_id'])) + + if vals.get('assembly_line_ids', False): + assembly_line_ids = [] + for assembly_line_code in vals['assembly_line_ids']: + assembly_line = self.env['res.line'].search([('name', '=', assembly_line_code)]) + if assembly_line: + assembly_line_ids.append(assembly_line.id) + else: + raise ValidationError( + _("Produktionslinie \'%s\' kann nicht zugeordnet werden" % assembly_line_code)) + vals['assembly_line_ids'] = [(6, 0, assembly_line_ids)] + + return vals + + @api.model + def _get_specified_fields(self): + return ['default_code', 'name', 'length', 'width', 'thickness', 'surface', 'active', 'weight', 'is_internal', + 'xcat_id', 'notes', 'material_type_id', 'intrastat_id', 'sale_ok', 'assembly_line_ids', 'list_price'] diff --git a/ext/custom-addons/dp_custom/models/res_company.py b/ext/custom-addons/dp_custom/models/res_company.py index 6be7cf00..0086c5a9 100644 --- a/ext/custom-addons/dp_custom/models/res_company.py +++ b/ext/custom-addons/dp_custom/models/res_company.py @@ -21,7 +21,7 @@ import os import base64 -from odoo import fields, models, api +from odoo import models, api class Company(models.Model): diff --git a/ext/custom-addons/dp_custom/models/res_line.py b/ext/custom-addons/dp_custom/models/res_line.py new file mode 100644 index 00000000..a372a4f5 --- /dev/null +++ b/ext/custom-addons/dp_custom/models/res_line.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# datenpol gmbh +# Copyright (C) 2013-TODAY datenpol gmbh () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from odoo import fields, models + + +class ResLine(models.Model): + _name = 'res.line' + _description = 'Produktionslinie' + _order = 'name' + + name = fields.Char(string='Code', required=True) + description = fields.Char(string="Beschreibung", required=True) + + _sql_constraints = [ + ('name_uniq', 'unique(name)', 'Der Code muss eindeutig sein') + ] diff --git a/ext/custom-addons/dp_custom/models/res_partner.py b/ext/custom-addons/dp_custom/models/res_partner.py index c297c343..2bf35751 100644 --- a/ext/custom-addons/dp_custom/models/res_partner.py +++ b/ext/custom-addons/dp_custom/models/res_partner.py @@ -19,10 +19,108 @@ # ############################################################################## -from odoo import fields, models +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError class Partner(models.Model): - _inherit = 'res.partner' + _name = 'res.partner' + _inherit = ['res.partner', 'dp_custom.helper'] lastname2 = fields.Char(string='Midname') + company = fields.Char(string='Unternehmen') + info_kundennr = fields.Char(string='Info-Kundennr.') + info_uid = fields.Char(string='Info-UID') + endkunde = fields.Boolean(string='Endkunde', help='Beschreibt, ob es ein Endkunde ist') + line_ids = fields.Many2many(comodel_name='res.line', string='Produktionslinien') + portal_id = fields.Char(string='Portal-ID') + partner_sector_id = fields.Many2one(comodel_name='res.partner.sector', string='Branche') + dat_vat_check = fields.Date(string='Datum letzte UID-Prüfung') + active = fields.Boolean(track_visibility='onchange') + + _sql_constraints = [ + ('ref_uniq', 'unique(ref)', 'Die Interne Referenz muss eindeutig sein') + ] + + @api.model + def portal_create_partner(self, vals): + vals = self.remove_not_specified_fields(vals) + vals = self.correct_values(vals) + if not vals.get('active', False): + vals['active'] = False + return self.create(vals) + + @api.model + def pg_create_company(self, vals): + vals = self.remove_not_specified_fields(vals) + vals = self.correct_values(vals) + partner = self.with_context(active_test=False).search([('ref', '=', vals['ref'])]) + if partner: + if not partner.is_company: + raise ValidationError(_("Der Partner mit der Internen Referenz '%s' ist kein Unternehmen" % vals['ref'])) + partner = self.write(vals) + else: + if not vals.get('is_company', False): + vals['is_company'] = True + partner = self.create(vals) + partner.property_account_fiscal_position = self.env['account.fiscal.position'].get_fiscal_position( + partner.id) + return partner + + @api.model + def correct_values(self, vals): + if vals.get('country_id', False): + country = self.env['res.country'].search([('code', '=', vals['country_id'])]) + if country: + vals['country_id'] = country.id + else: + raise ValidationError( + _("Das Land mit dem ISO-Code \'%s\' kann nicht zugeordnet werden" % vals['country_id'])) + + if vals.get('line_ids', False): + line_ids = self.env['res.line'].search([('name', 'in', vals['line_ids'])]) + if line_ids: + vals['line_ids'] = [(6, 0, line_ids.ids)] + else: + raise ValidationError( + _("Die Produktionslinie mit dem Code \'%s\' kann nicht zugeordnet werden", vals['line_ids'])) + + if vals.get('lang', False): + temp = vals['lang'] + vals['lang'] = False + for selection in self.fields_get('lang')['lang']['selection']: + if selection[0].startswith(temp): + vals['lang'] = selection[0] + break + if not vals['lang']: + raise ValidationError(_("Die Sprache mit dem Code \'%s\' kann nicht zugeordnet werden" % temp)) + + if vals.get('partner_sector_id', False): + branche = self.env['res.partner.sector'].search( + [('name', '=', vals['partner_sector_id'])]) + if branche: + vals['partner_sector_id'] = branche.id + else: + raise ValidationError(_("Die Branche \'%s\' kann nicht zugeordnet werden" % vals['partner_sector_id'])) + + return vals + + @api.model + def _get_specified_fields(self): + return ['name', 'firstname', 'lastname', 'street', 'street2', 'zip', 'city', 'country_id', 'tax', 'phone', 'mobile', + 'endkunde', 'line_ids', 'lang', 'portal_id', 'email', 'opt_out', 'ref', + 'partner_sector_id', 'comment', 'vat', 'property_payment_term_id', + 'property_pricelist_id', 'date_vat_check', 'active'] + + +class PartnerSector(models.Model): + _name = 'res.partner.sector' + _description = 'Branche' + _order = 'id,name' + + name = fields.Char(string='Beteichnung', required=True) + sequence = fields.Integer(string='Sequenz') + + _sql_constraints = [ + ('name_uniq', 'unique(name)', 'Die Bezeichnung muss eindeutig sein') + ] diff --git a/ext/custom-addons/dp_custom/models/sale.py b/ext/custom-addons/dp_custom/models/sale.py new file mode 100644 index 00000000..81851e16 --- /dev/null +++ b/ext/custom-addons/dp_custom/models/sale.py @@ -0,0 +1,192 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# datenpol gmbh +# Copyright (C) 2013-TODAY datenpol gmbh () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError + + +class SaleOrder(models.Model): + _name = 'sale.order' + _inherit = ['sale.order', 'dp_custom.helper'] + + ASSEMBLY_STATES = [('approved', 'Produktionsfreigabe'), + ('started', 'Produktion begonnen'), + ('done', 'Produktions fertig'), + ('packed', 'Verpackt'), + ('delivered', 'Geliefert')] + + assembled = fields.Boolean(string='Zusammengebaut') + line_id = fields.Many2one(comodel_name='res.line', string='Produktionslinie') + assembly_state = fields.Selection(ASSEMBLY_STATES, string="Status PG") + internal_notes = fields.Text() + assembly_notes = fields.Text() + + @api.model + def pg_get_orders(self, line, state, limit): + line_id = self.env['res.line'].search([('name', '=', line)]) + orders = self.search([('line_id', '=', line_id.id), ('assembly_state', '=', state)], order='id ASC', + limit=limit) + order_list = [] + for order in orders: + attachmets = self.env['ir.attachment'].search([('res_model', '=', 'sale.order'), ('res_id', '=', order.id)]) + attachment_list = [] + for attachment in attachmets: + attachment_list.append({ + 'filename': attachment.name, + 'binary': attachment.datas.decode() + }) + order_list.append({ + 'id': order.id, + 'name': order.name, + 'attachments': attachment_list, + 'internal_notes': order.internal_notes, + 'assembly_notes': order.assembly_notes + }) + return order_list + + @api.model + def pg_create_quotation(self, vals): + if not vals.get('portal_id', False): + raise ValidationError( + _("Der Kunde mit der Portal-ID \'%s\' kann nicht zugeordnet werden" % vals['portal_id'])) + partner = self.env['res.partner'].search([('portal_id', '=', vals['portal_id'])]) + if not partner: + raise ValidationError( + _("Der Kunde mit der Portal-ID \'%s\' kann nicht zugeordnet werden" % vals['portal_id'])) + delivery_partner = self.env['res.partner'] + delivery_vals = {} + if vals.get('portal_delivery_id', False): + delivery_partner = self.env['res.partner'].search([('portal_id', '=', vals['portal_delivery_id'])]) + delivery_vals['portal_id'] = vals['portal_delivery_id'] + for key in list(vals.keys()): + if key.startswith('delivery_'): + delivery_vals[key.replace('delivery_', '')] = vals[key] + + delivery_vals = delivery_partner.remove_not_specified_fields(delivery_vals) + delivery_vals = delivery_partner.correct_values(delivery_vals) + delivery_vals['parent_id'] = partner.id + + if delivery_partner: + delivery_partner.write(delivery_vals) + else: + if not delivery_vals.get('type', False): + delivery_vals['type'] = 'delivery' + delivery_partner = delivery_partner.create(delivery_vals) + + attachment_vals = vals.get('attachment_ids', False) + order_line_vals = vals.get('order_lines', False) + vals = self.remove_not_specified_fields(vals) + vals = self.correct_values(vals) + vals.update({ + 'partner_id': partner.id, + 'fiscal_position_id': partner.property_account_position_id.id, + 'user_id': partner.user_id.id, + 'payment_term_id': partner.property_payment_term_id.id, + 'partner_shipping_id': delivery_partner.id, + 'partner_invoice_id': partner.id + }) + order_id = self.create(vals) + if attachment_vals: + order_id.pg_create_sale_order_attachments(attachment_vals) + if attachment_vals: + order_id.pg_create_order_lines(order_line_vals) + return {'id': order_id.id, 'name': order_id.name} + + @api.multi + def pg_create_sale_order_attachments(self, values): + self.ensure_one() + if isinstance(values, list): + for vals in values: + self.create_attachment(self, vals) + else: + self.create_attachment(self, values) + + @api.multi + def pg_create_order_lines(self, values): + order_lines = [] + for vals in values: + vals = self.env['sale.order.line'].correct_values(vals) + + lot_id = False + if vals.get('lot_id', False): + if vals['lot_id'].get('attachment_ids', False): + lot_attachment_values = vals['lot_id']['attachment_ids'] + else: + lot_attachment_values = [] + lot = self.env['stock.production.lot'].create({ + 'name': vals['lot_id']['name'], + 'product_id': vals['product_id'], + 'notes': vals['lot_id']['notes'] + }) + for lot_attachment_vals in lot_attachment_values: + self.create_attachment(lot, lot_attachment_vals) + lot_id = lot.id + order_lines.append(self.env['sale.order.line'].create({ + 'order_id': self.id, + 'product_id': vals['product_id'], + 'price_unit': vals['price_unit'], + 'product_uom_qty': vals['product_uom_qty'], + 'lot_id': lot_id + })) + return order_lines + + @api.model + def create_attachment(self, record, vals): + attachment_vals = { + 'name': vals['filename'], + 'datas': vals['binary'], + 'datas_fname': vals['filename'], + 'res_model': record._name, + 'res_id': record.id, + } + self.env['ir.attachment'].create(attachment_vals) + + @api.model + def correct_values(self, vals): + if vals.get('line_id', False): + line_id = self.env['res.line'].search([('name', '=', vals['line_id'])]) + if line_id: + vals['line_id'] = line_id.id + else: + raise ValidationError( + _("Produktionslinie \'%s\' kann nicht zugeordnet werden" % vals['line_id'])) + return vals + + @api.model + def _get_specified_fields(self): + return ['origin', 'client_order_ref', 'note', 'date_order', 'assembled', 'line_id', 'partner_id', + 'fiscal_position_id', 'user_id', 'payment_term_id', 'partner_delivery_id', 'partner_invoice_id'] + + +class SaleOrderLine(models.Model): + _inherit = 'sale.order.line' + + lot_id = fields.Many2one(comodel_name='stock.production.lot', string='Lot') + + @api.model + def correct_values(self, vals): + if vals.get('product_id', False): + product_id = self.env['product.product'].search([('default_code', '=', vals['product_id'])]) + if product_id: + vals['product_id'] = product_id.id + else: + raise ValidationError( + _("Produkt \'%s\' kann nicht zugeordnet werden" % vals['product_id'])) + return vals diff --git a/ext/custom-addons/dp_custom/models/stock.py b/ext/custom-addons/dp_custom/models/stock.py new file mode 100644 index 00000000..9cd7e24e --- /dev/null +++ b/ext/custom-addons/dp_custom/models/stock.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# datenpol gmbh +# Copyright (C) 2013-TODAY datenpol gmbh () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from odoo import fields, models + + +class StockProductionLot(models.Model): + _inherit = 'stock.production.lot' + + notes = fields.Text() diff --git a/ext/custom-addons/dp_custom/security/ir.model.access.csv b/ext/custom-addons/dp_custom/security/ir.model.access.csv index 08145a00..83891079 100644 --- a/ext/custom-addons/dp_custom/security/ir.model.access.csv +++ b/ext/custom-addons/dp_custom/security/ir.model.access.csv @@ -1,2 +1,9 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink - +access_res_line_user,access_res_line_user,model_res_line,base.group_user,1,0,0,0 +access_res_line_sales_manager,access_res_line_sales_manager,model_res_line,sales_team.group_sale_manager,1,1,1,1 +access_res_partner_sector_user,access_res_partner_sector_user,model_res_partner_sector,base.group_user,1,0,0,0 +access_res_partner_sector_sales_manager,access_res_partner_sector_sales_manager,model_res_partner_sector,sales_team.group_sale_manager,1,1,1,1 +access_material_type_user,access_material_type_user,model_material_type,base.group_user,1,0,0,0 +access_material_type_sales_manager,access_material_type_sales_manager,model_material_type,sales_team.group_sale_manager,1,1,1,1 +access_product_xcategory_user,access_product_xcategory_user,model_product_xcategory,base.group_user,1,0,0,0 +access_product_xcategory_sales_manager,access_product_xcategory_sales_manager,model_product_xcategory,sales_team.group_sale_manager,1,1,1,1 diff --git a/ext/custom-addons/dp_custom/views/material_type_views.xml b/ext/custom-addons/dp_custom/views/material_type_views.xml new file mode 100644 index 00000000..adb1fc84 --- /dev/null +++ b/ext/custom-addons/dp_custom/views/material_type_views.xml @@ -0,0 +1,43 @@ + + + + + material_type_form_view + material.type + +
+ + + + +
+
+
+ + + material_type_tree_view + material.type + + + + + + + + + + Materialtypen + ir.actions.act_window + material.type + current + form + tree,form + + + + + +
diff --git a/ext/custom-addons/dp_custom/views/product_views.xml b/ext/custom-addons/dp_custom/views/product_views.xml new file mode 100644 index 00000000..1e434d2a --- /dev/null +++ b/ext/custom-addons/dp_custom/views/product_views.xml @@ -0,0 +1,63 @@ + + + + product_template_form_view + product.template + + +
+ + + + +
+ + + + + + + + + +
+ + + + product_xcategory_form_view + product.xcategory + +
+ + + +
+
+
+ + + product_xcategory_tree_view + product.xcategory + + + + + + + + + X-Kategorien + ir.actions.act_window + product.xcategory + current + form + tree,form + + + + + +
diff --git a/ext/custom-addons/dp_custom/views/res_line_views.xml b/ext/custom-addons/dp_custom/views/res_line_views.xml new file mode 100644 index 00000000..856b00b5 --- /dev/null +++ b/ext/custom-addons/dp_custom/views/res_line_views.xml @@ -0,0 +1,43 @@ + + + + + res_line_form_view + res.line + +
+ + + + +
+
+
+ + + res_line_tree_view + res.line + + + + + + + + + + Produktionslinien + ir.actions.act_window + res.line + current + form + tree,form + + + + + +
diff --git a/ext/custom-addons/dp_custom/views/res_partner_views.xml b/ext/custom-addons/dp_custom/views/res_partner_views.xml new file mode 100644 index 00000000..d56bc261 --- /dev/null +++ b/ext/custom-addons/dp_custom/views/res_partner_views.xml @@ -0,0 +1,101 @@ + + + + + view_partner_address_form + res.partner + + + + + + + + + + view_partner_form + res.partner + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Neue Portalkunden + ir.actions.act_window + res.partner + [('active','=',False), ('portal_id','!=',False), ('is_company','=',False)] + current + form + tree,form + + + + + + res_partner_sector_form_view + res.partner.sector + +
+ + + + +
+
+
+ + + res_partner_sector_tree_view + res.partner.sector + + + + + + + + + + Branchen + ir.actions.act_window + res.partner.sector + current + form + tree,form + + + + + +
diff --git a/ext/custom-addons/dp_custom/views/sale_views.xml b/ext/custom-addons/dp_custom/views/sale_views.xml new file mode 100644 index 00000000..072f60f8 --- /dev/null +++ b/ext/custom-addons/dp_custom/views/sale_views.xml @@ -0,0 +1,32 @@ + + + + + sale_order_form_view + sale.order + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ext/custom-addons/dp_custom/views/stock_views.xml b/ext/custom-addons/dp_custom/views/stock_views.xml new file mode 100644 index 00000000..27bb2490 --- /dev/null +++ b/ext/custom-addons/dp_custom/views/stock_views.xml @@ -0,0 +1,15 @@ + + + + + stock_production_lot_view + stock.production.lot + + + + + + + + + diff --git a/ext/custom-addons/dp_dmi/__init__.py b/ext/custom-addons/dp_dmi/__init__.py index 49a09e55..aa7ed683 100755 --- a/ext/custom-addons/dp_dmi/__init__.py +++ b/ext/custom-addons/dp_dmi/__init__.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- ############################################################################## # -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). +# datenpol gmbh +# Copyright (C) 2013-TODAY datenpol gmbh () # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -18,6 +18,3 @@ # along with this program. If not, see . # ############################################################################## - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: - diff --git a/ext/custom-addons/dp_dmi/__manifest__.py b/ext/custom-addons/dp_dmi/__manifest__.py index d9a1e851..1f473a04 100755 --- a/ext/custom-addons/dp_dmi/__manifest__.py +++ b/ext/custom-addons/dp_dmi/__manifest__.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- ############################################################################## # -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). +# datenpol gmbh +# Copyright (C) 2013-TODAY datenpol gmbh () # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -20,10 +20,11 @@ ############################################################################## +# noinspection PyStatementEffect { 'name': 'Datenübernahme', 'category': 'Custom', - 'version': '1.0', + 'version': '11.0.1.0.0', 'description': """Datenübernahme""", 'author': 'datenpol GmbH', 'website': 'http://www.datenpol.at', @@ -35,5 +36,3 @@ 'installable': True, 'auto_install': False, } - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/ext/custom-addons/dp_dmi/material.type.csv b/ext/custom-addons/dp_dmi/material.type.csv new file mode 100644 index 00000000..7b2f62d6 --- /dev/null +++ b/ext/custom-addons/dp_dmi/material.type.csv @@ -0,0 +1,2 @@ +"xmlid","name","print_default_code" +"dp_dmi.unique_material_id","Material Name","True" diff --git a/ext/custom-addons/dp_dmi/product.xcategory.csv b/ext/custom-addons/dp_dmi/product.xcategory.csv new file mode 100644 index 00000000..6acf5e57 --- /dev/null +++ b/ext/custom-addons/dp_dmi/product.xcategory.csv @@ -0,0 +1,2 @@ +"xmlid","name" +"dp_dmi.unique_xcategory_id","XCategory Name" diff --git a/ext/custom-addons/dp_dmi/report.intrastat.code.csv b/ext/custom-addons/dp_dmi/report.intrastat.code.csv new file mode 100644 index 00000000..0d6e53b6 --- /dev/null +++ b/ext/custom-addons/dp_dmi/report.intrastat.code.csv @@ -0,0 +1,2 @@ +"xmlid","name","description" +"dp_dmi.unique_intrastat_id","Intrastat name","Intrastat Description" diff --git a/ext/custom-addons/dp_dmi/res.line.csv b/ext/custom-addons/dp_dmi/res.line.csv index f1521a81..7f9c6e8c 100644 --- a/ext/custom-addons/dp_dmi/res.line.csv +++ b/ext/custom-addons/dp_dmi/res.line.csv @@ -1,2 +1,2 @@ -"name","description" -"1234","Produktionslinie 1" \ No newline at end of file +"xmlid","name","description" +"dp_dmi.unique_line_id","1234","Produktionslinie 1" diff --git a/ext/custom-addons/dp_dmi/res.partner.sector.csv b/ext/custom-addons/dp_dmi/res.partner.sector.csv new file mode 100644 index 00000000..9b14dcf8 --- /dev/null +++ b/ext/custom-addons/dp_dmi/res.partner.sector.csv @@ -0,0 +1,2 @@ +"xmlid","name","sequence" +"dp_dmi.unique_partner_sector_id","Partner Sector name","0" diff --git a/ext/custom-addons/dp_dmi/res.users.csv b/ext/custom-addons/dp_dmi/res.users.csv index ad16983a..b3e25959 100644 --- a/ext/custom-addons/dp_dmi/res.users.csv +++ b/ext/custom-addons/dp_dmi/res.users.csv @@ -1,2 +1,2 @@ -"id","name","login","password","email","groups_id/id","tz","mobile","phone","function" -"p_xxx","Max Mustermann","mustermann@max.at","x","mustermann@max.at","base.group_sale_salesman_all_leads,account.group_account_invoice,base.group_erp_manager,stock.group_stock_user,purchase.group_purchase_user","Europe/Vienna",,, +"xmlid","name","login","password","email","groups_id/id","tz","mobile","phone","function" +"dp_dmi.unique_user_id","Max Mustermann","mustermann@max.at","x","mustermann@max.at","base.group_sale_salesman_all_leads,account.group_account_invoice,base.group_erp_manager,stock.group_stock_user,purchase.group_purchase_user","Europe/Vienna",,, diff --git a/ext/custom-addons/dp_reports_account/models/report_helper.py b/ext/custom-addons/dp_reports_account/models/report_helper.py index 434a53ec..3ab6c807 100644 --- a/ext/custom-addons/dp_reports_account/models/report_helper.py +++ b/ext/custom-addons/dp_reports_account/models/report_helper.py @@ -1,4 +1,4 @@ - +# -*- coding: utf-8 -*- from odoo import api, models diff --git a/ext/custom-addons/dp_reports_purchase/models/report_helper.py b/ext/custom-addons/dp_reports_purchase/models/report_helper.py index d3888efe..6d427e2f 100644 --- a/ext/custom-addons/dp_reports_purchase/models/report_helper.py +++ b/ext/custom-addons/dp_reports_purchase/models/report_helper.py @@ -1,4 +1,4 @@ - +# -*- coding: utf-8 -*- from odoo import api, models diff --git a/ext/custom-addons/dp_reports_purchase/reports/purchase.xml b/ext/custom-addons/dp_reports_purchase/reports/purchase.xml index 1cb93d32..9a89be19 100644 --- a/ext/custom-addons/dp_reports_purchase/reports/purchase.xml +++ b/ext/custom-addons/dp_reports_purchase/reports/purchase.xml @@ -26,7 +26,7 @@ style="padding-right:2px;"> Bestelldatum: + t-options='{"format": "dd.MM.yyyy"}'/>
Lieferantenreferenz: @@ -35,7 +35,7 @@
Geplantes Lieferdatum: + t-options='{"format": "dd.MM.yyyy"}'/>
Ansprechpartner: diff --git a/ext/custom-addons/dp_reports_sale/models/report_helper.py b/ext/custom-addons/dp_reports_sale/models/report_helper.py index 4f729e2a..5ae379e8 100644 --- a/ext/custom-addons/dp_reports_sale/models/report_helper.py +++ b/ext/custom-addons/dp_reports_sale/models/report_helper.py @@ -1,4 +1,4 @@ - +# -*- coding: utf-8 -*- from odoo import api, models diff --git a/ext/custom-addons/dp_reports_sale/reports/sale.xml b/ext/custom-addons/dp_reports_sale/reports/sale.xml index c44cdb84..74b1df3a 100644 --- a/ext/custom-addons/dp_reports_sale/reports/sale.xml +++ b/ext/custom-addons/dp_reports_sale/reports/sale.xml @@ -38,19 +38,19 @@ style="padding-right:2px;"> Angebotsdatum: + t-options='{"format": "dd.MM.yyyy"}'/>
Gültig bis: + t-options='{"format": "dd.MM.yyyy"}'/>
Bestelldatum: + t-options='{"format": "dd.MM.yyyy"}'/>
Ansprechpartner: diff --git a/ext/custom-addons/dp_rest_to_rpc/__init__.py b/ext/custom-addons/dp_rest_to_rpc/__init__.py new file mode 100644 index 00000000..f55a7281 --- /dev/null +++ b/ext/custom-addons/dp_rest_to_rpc/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# datenpol gmbh +# Copyright (C) 2013-TODAY datenpol gmbh () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from . import controllers diff --git a/ext/custom-addons/dp_rest_to_rpc/__manifest__.py b/ext/custom-addons/dp_rest_to_rpc/__manifest__.py new file mode 100644 index 00000000..da6d6bbd --- /dev/null +++ b/ext/custom-addons/dp_rest_to_rpc/__manifest__.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# datenpol gmbh +# Copyright (C) 2013-TODAY datenpol gmbh () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +# noinspection PyStatementEffect +{ + 'name': 'datenpol Rest to RPC', + 'category': 'Custom', + 'version': '11.0.1.0.0', + 'description': """ + datenpol Rest to RPC. Wird als Mockup verwendet für die OdooRPC oder XMLRpc Aufrufe + """, + 'author': 'datenpol gmbh', + 'website': 'http://www.datenpol.at/', + 'depends': [], + 'data': [], + 'installable': True, + 'auto_install': False, +} diff --git a/ext/custom-addons/dp_rest_to_rpc/controllers/__init__.py b/ext/custom-addons/dp_rest_to_rpc/controllers/__init__.py new file mode 100644 index 00000000..1180b385 --- /dev/null +++ b/ext/custom-addons/dp_rest_to_rpc/controllers/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# datenpol gmbh +# Copyright (C) 2013-TODAY datenpol gmbh () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from . import main diff --git a/ext/custom-addons/dp_rest_to_rpc/controllers/main.py b/ext/custom-addons/dp_rest_to_rpc/controllers/main.py new file mode 100644 index 00000000..eaa248a2 --- /dev/null +++ b/ext/custom-addons/dp_rest_to_rpc/controllers/main.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# datenpol gmbh +# Copyright (C) 2013-TODAY datenpol gmbh () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from odoo import http +from odoo.http import request + + +class MyController(http.Controller): + @http.route('/portal_create_partner', type='json', auth='none', methods=['POST']) + def handle_portal_create_partner(self, **post): + values = request.jsonrequest + partner_obj = request.env['res.partner'].sudo() + try: + partner_id = partner_obj.portal_create_partner(values) + except Exception as e: + return e.args[0] + return partner_id + + @http.route('/pg_create_company', type='json', auth='none', methods=['POST']) + def handle_pg_create_company(self, **post): + values = request.jsonrequest + partner_obj = request.env['res.partner'].sudo() + try: + partner_id = partner_obj.pg_create_company(values) + except Exception as e: + return e.args[0] + return partner_id + + @http.route('/pg_get_orders', type='json', auth='none', methods=['POST']) + def handle_pg_get_orders(self, **post): + values = request.jsonrequest + sale_order_obj = request.env['sale.order'].sudo() + try: + sale_order_id = sale_order_obj.pg_get_orders(values['line'], values['state'], values['limit']) + except Exception as e: + return e.args[0] + return sale_order_id + + @http.route('/create_product', type='json', auth='none', methods=['POST']) + def handle_create_product(self, **post): + values = request.jsonrequest + product_obj = request.env['product.template'].sudo() + try: + product_id = product_obj.create_product(values) + except Exception as e: + return e.args[0] + return product_id + + @http.route('/pg_create_quotation', type='json', auth='none', methods=['POST']) + def handle_pg_create_quotation(self, **post): + values = request.jsonrequest + sale_order_obj = request.env['sale.order'].sudo() + try: + sale_order_id = sale_order_obj.pg_create_quotation(values) + except Exception as e: + return e.args[0] + return sale_order_id diff --git a/ext/custom-addons/dp_rest_to_rpc/static/description/icon.png b/ext/custom-addons/dp_rest_to_rpc/static/description/icon.png new file mode 100644 index 00000000..8387d765 Binary files /dev/null and b/ext/custom-addons/dp_rest_to_rpc/static/description/icon.png differ diff --git a/ext/custom-addons/dp_rest_to_rpc/static/src/img/favicon.ico b/ext/custom-addons/dp_rest_to_rpc/static/src/img/favicon.ico new file mode 100644 index 00000000..3c33e99b Binary files /dev/null and b/ext/custom-addons/dp_rest_to_rpc/static/src/img/favicon.ico differ diff --git a/ext/custom-addons/dp_rest_to_rpc/static/src/img/logo.png b/ext/custom-addons/dp_rest_to_rpc/static/src/img/logo.png new file mode 100644 index 00000000..32c1481d Binary files /dev/null and b/ext/custom-addons/dp_rest_to_rpc/static/src/img/logo.png differ