multi-company setup
parent
d207a9eac2
commit
b0dc2570d2
|
|
@ -1,4 +1,4 @@
|
|||
from . import cli
|
||||
from . import config_at
|
||||
from . import config
|
||||
from . import environments
|
||||
from . import functions
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
import sys
|
||||
from urllib.parse import urlparse
|
||||
|
||||
from .config_at import Config
|
||||
from .config import Config
|
||||
from .environments import ENVIRONMENTS, Environment
|
||||
from .functions import DatenpolFunctions
|
||||
|
||||
|
|
@ -31,7 +31,6 @@ def main():
|
|||
sys.exit(3)
|
||||
|
||||
argv = sys.argv[1:]
|
||||
config = Config()
|
||||
|
||||
if not argv:
|
||||
_usage()
|
||||
|
|
@ -70,6 +69,10 @@ def main():
|
|||
print('Unbekannte Umgebung')
|
||||
_usage()
|
||||
|
||||
if env.config:
|
||||
config = env.config
|
||||
else:
|
||||
config = Config()
|
||||
instance = DatenpolFunctions(env, config)
|
||||
|
||||
methods = None
|
||||
|
|
@ -108,9 +111,9 @@ def main():
|
|||
#'stock_set_cost_method',
|
||||
#'set_incoterms',
|
||||
'set_company',
|
||||
#'set_taxes',
|
||||
'set_uom',
|
||||
#'set_fiscal_position',
|
||||
'set_taxes',
|
||||
'set_fiscal_position',
|
||||
#'setup_journals',
|
||||
'set_decimal_price',
|
||||
'set_default_values',
|
||||
|
|
@ -122,7 +125,7 @@ def main():
|
|||
'set_password_for_admin_users',
|
||||
'set_sys_params',
|
||||
#'setup_reports',
|
||||
'consume_tours',
|
||||
#'consume_tours',
|
||||
'disable_planners',
|
||||
'set_admin_rights',
|
||||
]
|
||||
|
|
|
|||
|
|
@ -6,31 +6,11 @@ class Config():
|
|||
|
||||
self.module_name = None
|
||||
self.lang = 'de_DE' # de_DE, en_US
|
||||
self.chart_of_accounts = 'l10n_at'
|
||||
self.sales_tax = '20% MwSt'
|
||||
self.purchase_tax = '20% VSt'
|
||||
self.chart_template_id = 2 # Austrian Chart of Account
|
||||
self.default_sales_tax = 'Mehrwertsteuer 20%'
|
||||
self.default_supplier_tax = 'Vorsteuer 20%'
|
||||
self.price_decimals = 2 # Nachkommastellen Preis
|
||||
self.uom_decimals = 3 # Nachkommastellen Mengeneinheiten
|
||||
|
||||
self.company_data = {
|
||||
'name': 'TZ Tischlerzentrum GesmbH',
|
||||
'street': 'Neugasse 36',
|
||||
'street2': False,
|
||||
'city': 'Spannberg',
|
||||
'zip': '2244',
|
||||
'phone': '+43 2538/8628 – 0',
|
||||
'email': 'office@tzaustria.com',
|
||||
'website': 'https://www.tzaustria.com/',
|
||||
'company_registry': 'FN 224119m',
|
||||
'country_id': 'at', # 'de' für Deutschland
|
||||
'vat': 'ATU 54619104',
|
||||
'vat_check_vies': True,
|
||||
'logo': '../ext/custom-addons/dp_custom/static/src/img/logo.png',
|
||||
#'favicon_backend': '../ext/custom-addons/dp_custom/static/src/img/favicon.ico',
|
||||
#'favicon_backend_mimetype': 'image/x-icon'
|
||||
}
|
||||
|
||||
self.mail_server = {
|
||||
'name': 'test',
|
||||
'sequence': 0,
|
||||
|
|
@ -41,24 +21,12 @@ class Config():
|
|||
'smtp_pass': 'test',
|
||||
}
|
||||
|
||||
# Nur für Lager
|
||||
# Wenn nicht gesetzt, dann wird der Firmenname genommen
|
||||
self.warehouse_name = 'TZA'
|
||||
self.warehouse_code = 'TZA'
|
||||
|
||||
# Anzahl der Schritte beim Ausliefern
|
||||
# [ship_only] Direkt vom Lager liefern
|
||||
# [pick_ship] Liefere vor Auslieferung zuerst in Versandlager (Pick + Ship)
|
||||
# [pick_pack_ship] Verpacken Sie die Produkte an einer Pack-Station bevor Sie den Versand vornehmen
|
||||
self.delivery_steps = 'ship_only'
|
||||
|
||||
self.valid_taxes = [
|
||||
'20% MwSt',
|
||||
'10% MwSt',
|
||||
'20% VSt',
|
||||
'10% VSt',
|
||||
]
|
||||
|
||||
# Aktive Steuerzuordnungen
|
||||
self.valid_fiscal_positions = [
|
||||
#'Lieferant EU (ohne Ust-ID)',
|
||||
|
|
@ -86,7 +54,7 @@ class Config():
|
|||
'group_sale_delivery_address': True, # Verschiedene Adressen für Rechnung und Lieferung
|
||||
'group_warning_sale': False,
|
||||
'auto_done_setting': False,
|
||||
'module_delivery': False,
|
||||
'module_delivery': True, # Für Intrastat benötigt
|
||||
'group_display_incoterm': True,
|
||||
'module_sale_order_dates': False,
|
||||
'group_route_so_lines': False,
|
||||
|
|
@ -118,54 +86,6 @@ class Config():
|
|||
self.removal_strategy = 'fifo' #[fifo], [lifo], [fefo]
|
||||
self.stock_cost_method = 'standard' # [standard], [average], [real]
|
||||
|
||||
self.sequences = {
|
||||
'sale.order': {
|
||||
# 'number_next_actual': 1,
|
||||
'prefix': '%(y)s',
|
||||
'padding': 4,
|
||||
'use_date_range': True,
|
||||
'monthly_date_range': False
|
||||
},
|
||||
'account.invoice': {
|
||||
# 'number_next_actual': 0001,
|
||||
'prefix': '%(y)s%(month)s',
|
||||
'padding': 4,
|
||||
'use_date_range': True,
|
||||
'monthly_date_range': False
|
||||
},
|
||||
# Wenn 'account.invoice_refund' auskommentiert ist, dann wird
|
||||
# für die Gutschrift der selbe Nummernkreis verwendet
|
||||
'account.invoice_refund': {
|
||||
# 'number_next_actual': 0001,
|
||||
'name': 'Gutschriften',
|
||||
'implementation': 'no_gap',
|
||||
'prefix': '%(y)s',
|
||||
'padding': 4,
|
||||
'use_date_range': True,
|
||||
'monthly_date_range': False
|
||||
},
|
||||
# 'picking.out': {
|
||||
# # 'number_next_actual': 1,
|
||||
# 'prefix': 'LS-',
|
||||
# 'padding': 5,
|
||||
# },
|
||||
# 'picking.in': {
|
||||
# #'number_next_actual': 1,
|
||||
# 'prefix': 'LS/IN/',
|
||||
# 'padding': 4,
|
||||
# },
|
||||
# 'picking.int': {
|
||||
# #'number_next_actual': 1,
|
||||
# 'prefix': 'LS/INT/',
|
||||
# 'padding': 4,
|
||||
# },
|
||||
# 'purchase.order': {
|
||||
# 'number_next_actual': 1,
|
||||
# 'prefix': 'B-',
|
||||
# 'padding': 5,
|
||||
# },
|
||||
}
|
||||
|
||||
self.active_uoms = {
|
||||
'product.product_uom_unit': 'Stk.',
|
||||
'product.product_uom_kgm': 'kg',
|
||||
|
|
@ -198,7 +118,12 @@ class Config():
|
|||
# 'dp_reports_stock',
|
||||
'account_cancel',
|
||||
'stock',
|
||||
'dp_changelogs'
|
||||
'dp_changelogs',
|
||||
'web_responsive',
|
||||
'web_environment_ribbon',
|
||||
'web_no_bubble',
|
||||
'report_intrastat',
|
||||
|
||||
]
|
||||
|
||||
# Setze das Feld "Attachment" im Report (wenn gesetzt wird das PDF in den Anhängen gespeichert)
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from .config import Config
|
||||
|
||||
class ConfigGlaser(Config):
|
||||
def __init__(self):
|
||||
super(ConfigGlaser, self).__init__()
|
||||
|
||||
self.company_xmlid = 'dp_custom.glaser_and_co_company'
|
||||
|
||||
self.company_data = {
|
||||
'name': 'Glaser & Co.',
|
||||
'street': 'Neugasse 36',
|
||||
'street2': False,
|
||||
'city': 'Spannberg',
|
||||
'zip': '2244',
|
||||
'phone': '+43 2538/8628 – 0',
|
||||
'email': 'office@tzaustria.com',
|
||||
'website': 'https://www.glaser-co.at',
|
||||
'company_registry': 'FN 61793 y',
|
||||
'country_id': 'at', # 'de' für Deutschland
|
||||
'vat': 'ATU17860303',
|
||||
'vat_check_vies': True,
|
||||
'logo': '../ext/custom-addons/dp_custom/static/src/img/logo_glaser.png',
|
||||
#'favicon_backend': '../ext/custom-addons/dp_custom/static/src/img/favicon.ico',
|
||||
#'favicon_backend_mimetype': 'image/x-icon'
|
||||
}
|
||||
|
||||
# Nur für Lager
|
||||
# Wenn nicht gesetzt, dann wird der Firmenname genommen
|
||||
self.warehouse_name = 'Glaser'
|
||||
self.warehouse_code = 'Glaser'
|
||||
|
||||
self.sequences = {
|
||||
'sale.order': {
|
||||
# 'number_next_actual': 1,
|
||||
'prefix': 'GL%(y)s',
|
||||
'padding': 4,
|
||||
'use_date_range': True,
|
||||
'monthly_date_range': False
|
||||
},
|
||||
'account.invoice': {
|
||||
# 'number_next_actual': 0001,
|
||||
'prefix': 'GL%(y)s%(month)s',
|
||||
'padding': 4,
|
||||
'use_date_range': True,
|
||||
'monthly_date_range': False
|
||||
},
|
||||
# Wenn 'account.invoice_refund' auskommentiert ist, dann wird
|
||||
# für die Gutschrift der selbe Nummernkreis verwendet
|
||||
'account.invoice_refund': {
|
||||
# 'number_next_actual': 0001,
|
||||
'name': 'Gutschriften',
|
||||
'implementation': 'no_gap',
|
||||
'prefix': 'GL%(y)s',
|
||||
'padding': 4,
|
||||
'use_date_range': True,
|
||||
'monthly_date_range': False
|
||||
},
|
||||
# 'picking.out': {
|
||||
# # 'number_next_actual': 1,
|
||||
# 'prefix': 'LS-',
|
||||
# 'padding': 5,
|
||||
# },
|
||||
# 'picking.in': {
|
||||
# #'number_next_actual': 1,
|
||||
# 'prefix': 'LS/IN/',
|
||||
# 'padding': 4,
|
||||
# },
|
||||
# 'picking.int': {
|
||||
# #'number_next_actual': 1,
|
||||
# 'prefix': 'LS/INT/',
|
||||
# 'padding': 4,
|
||||
# },
|
||||
# 'purchase.order': {
|
||||
# 'number_next_actual': 1,
|
||||
# 'prefix': 'B-',
|
||||
# 'padding': 5,
|
||||
# },
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from .config import Config
|
||||
|
||||
class ConfigTZA(Config):
|
||||
def __init__(self):
|
||||
super(ConfigTZA, self).__init__()
|
||||
|
||||
self.company_xmlid = 'base.main_company'
|
||||
|
||||
self.company_data = {
|
||||
'name': 'TZ Tischlerzentrum GesmbH',
|
||||
'street': 'Neugasse 36',
|
||||
'street2': False,
|
||||
'city': 'Spannberg',
|
||||
'zip': '2244',
|
||||
'phone': '+43 2538/8628 – 0',
|
||||
'email': 'office@tzaustria.com',
|
||||
'website': 'https://www.tzaustria.com/',
|
||||
'company_registry': 'FN 224119m',
|
||||
'country_id': 'at', # 'de' für Deutschland
|
||||
'vat': 'ATU 54619104',
|
||||
'vat_check_vies': True,
|
||||
'logo': '../ext/custom-addons/dp_custom/static/src/img/logo.png',
|
||||
#'favicon_backend': '../ext/custom-addons/dp_custom/static/src/img/favicon.ico',
|
||||
#'favicon_backend_mimetype': 'image/x-icon'
|
||||
}
|
||||
|
||||
# Nur für Lager
|
||||
# Wenn nicht gesetzt, dann wird der Firmenname genommen
|
||||
self.warehouse_name = 'TZA'
|
||||
self.warehouse_code = 'TZA'
|
||||
|
||||
self.sequences = {
|
||||
'sale.order': {
|
||||
# 'number_next_actual': 1,
|
||||
'prefix': '%(y)s',
|
||||
'padding': 4,
|
||||
'use_date_range': True,
|
||||
'monthly_date_range': False
|
||||
},
|
||||
'account.invoice': {
|
||||
# 'number_next_actual': 0001,
|
||||
'prefix': '%(y)s%(month)s',
|
||||
'padding': 4,
|
||||
'use_date_range': True,
|
||||
'monthly_date_range': False
|
||||
},
|
||||
# Wenn 'account.invoice_refund' auskommentiert ist, dann wird
|
||||
# für die Gutschrift der selbe Nummernkreis verwendet
|
||||
'account.invoice_refund': {
|
||||
# 'number_next_actual': 0001,
|
||||
'name': 'Gutschriften',
|
||||
'implementation': 'no_gap',
|
||||
'prefix': '%(y)s',
|
||||
'padding': 4,
|
||||
'use_date_range': True,
|
||||
'monthly_date_range': False
|
||||
},
|
||||
# 'picking.out': {
|
||||
# # 'number_next_actual': 1,
|
||||
# 'prefix': 'LS-',
|
||||
# 'padding': 5,
|
||||
# },
|
||||
# 'picking.in': {
|
||||
# #'number_next_actual': 1,
|
||||
# 'prefix': 'LS/IN/',
|
||||
# 'padding': 4,
|
||||
# },
|
||||
# 'picking.int': {
|
||||
# #'number_next_actual': 1,
|
||||
# 'prefix': 'LS/INT/',
|
||||
# 'padding': 4,
|
||||
# },
|
||||
# 'purchase.order': {
|
||||
# 'number_next_actual': 1,
|
||||
# 'prefix': 'B-',
|
||||
# 'padding': 5,
|
||||
# },
|
||||
}
|
||||
|
||||
|
|
@ -1,7 +1,10 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from .config_tza import ConfigTZA
|
||||
from .config_glaser import ConfigGlaser
|
||||
|
||||
class Environment():
|
||||
def __init__(self, host, port, dbname, username, pwd=None, super_admin_pw=None, demo=False):
|
||||
def __init__(self, host, port, dbname, username, pwd=None, super_admin_pw=None, demo=False, config=False):
|
||||
self.host = host
|
||||
self.port = port
|
||||
self.dbname = dbname
|
||||
|
|
@ -12,6 +15,7 @@ class Environment():
|
|||
self.pwd = pwd
|
||||
self.super_admin_pw = super_admin_pw
|
||||
self.demo = demo
|
||||
self.config = config
|
||||
|
||||
def __str__(self):
|
||||
return """==============================
|
||||
|
|
@ -24,7 +28,9 @@ Port: %s
|
|||
|
||||
ENVIRONMENTS = {
|
||||
# Local environments are listed with passwords
|
||||
'br': Environment('http://localhost', '8080', 'tz-austria_1', 'admin', 'x', 'admin'),
|
||||
'br': Environment('http://localhost', '8080', 'tz-austria_1', 'tz-admin', 'x', 'admin', config=ConfigTZA()),
|
||||
'br-glaser': Environment('http://localhost', '8080', 'tz-austria_1', 'glaser-admin', 'x', 'admin', config=ConfigTZA()),
|
||||
|
||||
'aa': Environment('http://localhost', '8080', 'tz-austria_1', 'admin', 'x', 'admin'),
|
||||
'oa': Environment('http://localhost', '8080', 'tz-austria_1', 'admin', 'x', 'admin'),
|
||||
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@ class DatenpolFunctions:
|
|||
"""Login"""
|
||||
|
||||
self.odoo.login(self.env.dbname, self.env.username, self.env.pwd)
|
||||
self.company_id = self.odoo.env.user.company_id
|
||||
return True
|
||||
|
||||
def set_default_settings(self):
|
||||
|
|
@ -90,13 +91,21 @@ class DatenpolFunctions:
|
|||
vals['favicon_backend'] = self._readAndReturnFile(vals['favicon_backend'], encode='base64')
|
||||
|
||||
vals['country_id'] = country_id
|
||||
return self.odoo.env.ref('base.main_company').write(vals)
|
||||
return self.odoo.env.ref(self.config.company_xmlid).write(vals)
|
||||
|
||||
def set_taxes(self):
|
||||
"""Setze nicht benötigte Steuern auf inaktiv"""
|
||||
"""Setze Standard-Steuersätze"""
|
||||
|
||||
tax_ids = self.odoo.env['account.tax'].search([('description', 'not in', self.config.valid_taxes)])
|
||||
return self.odoo.env['account.tax'].write(tax_ids, {'active': False})
|
||||
c = self.config
|
||||
# Standard Sales Tax
|
||||
sales_tax_ids = self.odoo.env['account.tax'].search(
|
||||
[('name', '=', c.default_sales_tax)])
|
||||
self.odoo.env['ir.default'].set('product.template', 'taxes_id', sales_tax_ids, company_id=self.company_id.id)
|
||||
# Standard Purchase Tax
|
||||
supplier_tax_ids = self.odoo.env['account.tax'].search(
|
||||
[('name', '=', c.default_supplier_tax)])
|
||||
self.odoo.env['ir.default'].set('product.template', 'supplier_taxes_id', supplier_tax_ids, company_id=self.company_id.id)
|
||||
return True
|
||||
|
||||
def set_incoterms(self):
|
||||
"""Lieferbedingungen setzen"""
|
||||
|
|
@ -134,8 +143,7 @@ class DatenpolFunctions:
|
|||
mod_ids = self.odoo.env['ir.module.module'].search([('name', 'in', module_to_install), ('state', '!=', 'installed')])
|
||||
if not len(mod_ids) == 1 and raise_exception:
|
||||
raise Exception('Module %s not found or is not in state "uninstalled".' % module_to_install)
|
||||
self.odoo.env['ir.module.module'].button_install(mod_ids)
|
||||
self.odoo.env['base.module.upgrade'].upgrade_module(mod_ids)
|
||||
self.odoo.env['ir.module.module'].button_immediate_install(mod_ids)
|
||||
return True
|
||||
|
||||
def _set_picking_sequence_prefix(self, code, value):
|
||||
|
|
@ -230,7 +238,7 @@ class DatenpolFunctions:
|
|||
"""Setze Administrator Rechte"""
|
||||
|
||||
groups = []
|
||||
user_id = self.odoo.env.ref('base.user_root').id
|
||||
user_id = self.odoo.env._uid
|
||||
|
||||
# Technische Eigenschaften
|
||||
groups.append((4, self.odoo.env.ref('base.group_no_one').id))
|
||||
|
|
@ -244,31 +252,6 @@ class DatenpolFunctions:
|
|||
}
|
||||
return self.odoo.env['res.users'].write([user_id], vals)
|
||||
|
||||
def setup_accounting(self):
|
||||
"""Konfiguration Kontenplan"""
|
||||
|
||||
c = self.config
|
||||
sales_tax_ids = self.odoo.env['account.tax.template'].search(
|
||||
[('description', '=', c.sales_tax), ('parent_id', '=', False)])
|
||||
if not sales_tax_ids:
|
||||
return False
|
||||
purchase_tax_ids = self.odoo.env['account.tax.template'].search(
|
||||
[('description', '=', c.purchase_tax), ('parent_id', '=', False)])
|
||||
if not purchase_tax_ids:
|
||||
return False
|
||||
|
||||
# Set Your Accounting Options
|
||||
currency_id = self.odoo.env.ref('base.EUR').id
|
||||
vals = {}
|
||||
vals['chart_template_id'] = c.chart_template_id
|
||||
vals['sale_tax'] = sales_tax_ids[0]
|
||||
vals['purchase_tax'] = purchase_tax_ids[0]
|
||||
vals['company_id'] = 1 # Default
|
||||
vals['currency_id'] = currency_id
|
||||
wizard_id = self.odoo.env['wizard.multi.charts.accounts'].create(vals)
|
||||
self.odoo.env['wizard.multi.charts.accounts'].action_next([wizard_id])
|
||||
return True
|
||||
|
||||
def set_uom(self):
|
||||
"""Mengeneinheiten setzen"""
|
||||
|
||||
|
|
@ -314,13 +297,14 @@ class DatenpolFunctions:
|
|||
# Mappings inaktiver Steuern löschen (also wenn rechte Seite eine inaktive Steuer ist, wie z. B "strf. i.g.L"))
|
||||
valid_position_ids = self.odoo.env['account.fiscal.position'].search(
|
||||
[('name', 'in', c.valid_fiscal_positions)])
|
||||
valid_tax_ids = self.odoo.env['account.tax'].search([('parent_id', '=', False)])
|
||||
#valid_tax_ids = self.odoo.env['account.tax'].search([('parent_id', '=', False)])
|
||||
|
||||
position_tax_line_ids = self.odoo.env['account.fiscal.position.tax'].search(
|
||||
[('position_id', 'in', valid_position_ids),
|
||||
('tax_dest_id', 'not in', valid_tax_ids)])
|
||||
vals = {'tax_dest_id': False}
|
||||
return self.odoo.env['account.fiscal.position.tax'].write(position_tax_line_ids, vals)
|
||||
# position_tax_line_ids = self.odoo.env['account.fiscal.position.tax'].search(
|
||||
# [('position_id', 'in', valid_position_ids),
|
||||
# ('tax_dest_id', 'not in', valid_tax_ids)])
|
||||
# vals = {'tax_dest_id': False}
|
||||
# return self.odoo.env['account.fiscal.position.tax'].write(position_tax_line_ids, vals)
|
||||
return True
|
||||
|
||||
def update_module(self):
|
||||
"""Aktualisiere Modul"""
|
||||
|
|
|
|||
Loading…
Reference in New Issue