Skip to Content
Meniu
Trebuie să fiți înregistrat pentru a interacționa cu comunitatea.
Această întrebare a fost marcată
1 Răspunde
266 Vizualizări

Hello!


I setup month ago my odoo 17. I update the existing company, which is on id1. This seems was a fail, because after a update from git, it overwrite id1 with the default values.


Now I would like to move my company to id2 and set on id1 a default not used company.

This was working, but there is an issue with the tax.


My sql code:


DO $$
DECLARE
    old_company_id INTEGER := 3;  -- Ursprüngliche company_id
    new_company_id INTEGER := 2;  -- Neue company_id
    fk RECORD;  -- Variable für Fremdschlüssel
    tbl RECORD; -- Variable für Tabellen mit company_id
BEGIN
    -- 1. Alle Fremdschlüssel, die company_id referenzieren, deaktivieren
    RAISE NOTICE 'Deaktivieren von Fremdschlüsseln beginnt.';
    FOR fk IN
        SELECT conname, conrelid::regclass::text AS table_name
        FROM pg_constraint
        WHERE confkey IS NOT NULL
          AND confrelid = 'res_company'::regclass
    LOOP
        RAISE NOTICE 'Entferne Fremdschlüssel % von Tabelle %', fk.conname, fk.table_name;
        EXECUTE format('ALTER TABLE %I DROP CONSTRAINT %I;', fk.table_name, fk.conname);
    END LOOP;
    RAISE NOTICE 'Deaktivieren von Fremdschlüsseln abgeschlossen.';

    -- 2. Ändere die ID in res_company (Tabelle NICHT ändern)
    RAISE NOTICE 'res_company wird nicht geändert. Überspringe diesen Schritt.';

    -- 3. Passe alle Tabellen an, die company_id referenzieren, aber keine Sichten sind
    RAISE NOTICE 'Beginne mit der Aktualisierung von Tabellen mit company_id.';
    FOR tbl IN
        SELECT table_name
        FROM information_schema.columns
        WHERE column_name = 'company_id'
          AND table_name NOT IN (
              SELECT table_name
              FROM information_schema.views
              WHERE table_schema = 'public'
          )
          AND table_name != 'res_company' -- res_company ausschließen
    LOOP
        RAISE NOTICE 'Aktualisiere Tabelle %', tbl.table_name;
        EXECUTE format('UPDATE %I SET company_id = %s WHERE company_id = %s;', tbl.table_name, new_company_id, old_company_id);
    END LOOP;
    RAISE NOTICE 'Alle Tabellen mit company_id erfolgreich aktualisiert, res_company ausgeschlossen.';

    -- 4. Fremdschlüssel wiederherstellen
    RAISE NOTICE 'Beginne mit dem Wiederherstellen der Fremdschlüssel.';
    FOR fk IN
        SELECT conname, conrelid::regclass::text AS table_name,
               pg_get_constraintdef(oid) AS definition
        FROM pg_constraint
        WHERE confkey IS NOT NULL
          AND confrelid = 'res_company'::regclass
    LOOP
        RAISE NOTICE 'Stelle Fremdschlüssel % in Tabelle % wieder her', fk.conname, fk.table_name;
        EXECUTE format('ALTER TABLE %I ADD CONSTRAINT %I %s;', fk.table_name, fk.conname, fk.definition);
    END LOOP;
    RAISE NOTICE 'Wiederherstellung der Fremdschlüssel abgeschlossen.';
END $$;


I created first a new company (id2), then I move my company (id1) to id3, move id2 to id 1 and the my id3 to id2


So I have:;

id1: default company

id2: my company


All orders and sales are moving and working.

But when I open a page with tax (products, invoicing, ...) he show me no data or get an error: no permission


When I open the same as Superuser it is working fine.


So far I see, all tax tables are switched to id2.


Can someone help?


Thanks!!



Imagine profil
Abandonează
Autor Cel mai bun răspuns

I found an issue in the foreign keys and fix it:

DO $$
DECLARE
    old_company_id INTEGER := 3;  -- Ursprüngliche ID
    new_company_id INTEGER := 2;  -- Neue ID
    fk RECORD;                   -- Variable für Fremdschlüssel
    tbl RECORD;                  -- Variable für Tabellen mit referenzierenden Fremdschlüsseln
BEGIN
    -- 1. Temporäre Tabelle für Fremdschlüsseldefinitionen erstellen
    DROP TABLE IF EXISTS temp_fks;
    CREATE TEMP TABLE temp_fks (conname TEXT, table_name TEXT, column_name TEXT, definition TEXT);

    -- 2. Fremdschlüssel sichern
    RAISE NOTICE 'Sichern der Fremdschlüssel beginnt.';
    FOR fk IN
        SELECT conname, conrelid::regclass::text AS table_name,
               a.attname AS column_name,
               pg_get_constraintdef(c.oid) AS definition
        FROM pg_constraint c
        JOIN pg_class t ON c.conrelid = t.oid
        JOIN pg_attribute a ON a.attnum = ANY(c.conkey) AND a.attrelid = t.oid
        WHERE c.confrelid = 'res_company'::regclass
    LOOP
        INSERT INTO temp_fks (conname, table_name, column_name, definition)
        VALUES (fk.conname, fk.table_name, fk.column_name, fk.definition);
        RAISE NOTICE 'Fremdschlüssel % von Tabelle % gesichert.', fk.conname, fk.table_name;
    END LOOP;
    RAISE NOTICE 'Sichern der Fremdschlüssel abgeschlossen.';

    -- 3. Fremdschlüssel deaktivieren
    RAISE NOTICE 'Deaktivieren der Fremdschlüssel beginnt.';
    FOR fk IN
        SELECT conname, table_name
        FROM temp_fks
    LOOP
        EXECUTE format('ALTER TABLE %I DROP CONSTRAINT %I;', fk.table_name, fk.conname);
        RAISE NOTICE 'Fremdschlüssel % von Tabelle % entfernt.', fk.conname, fk.table_name;
    END LOOP;
    RAISE NOTICE 'Deaktivieren der Fremdschlüssel abgeschlossen.';

    -- 4. Aktualisiere die ID in res_company
    RAISE NOTICE 'Beginne mit der Aktualisierung der ID in res_company.';
    EXECUTE format('UPDATE res_company SET id = %s WHERE id = %s;', new_company_id, old_company_id);
    RAISE NOTICE 'ID in res_company aktualisiert von % auf %.', old_company_id, new_company_id;

    -- 5. Aktualisiere Tabellen mit referenzierten Fremdschlüsselwerten
    RAISE NOTICE 'Beginne mit der Aktualisierung von Tabellen mit Fremdschlüsseln.';
    FOR tbl IN
        SELECT DISTINCT table_name, column_name
        FROM temp_fks
    LOOP
        EXECUTE format('UPDATE %I SET %I = %s WHERE %I = %s;',
                       tbl.table_name, tbl.column_name, new_company_id, tbl.column_name, old_company_id);
        RAISE NOTICE 'Tabelle % Spalte % erfolgreich aktualisiert.', tbl.table_name, tbl.column_name;
    END LOOP;

    -- 6. Wiederherstellung der Fremdschlüssel
    RAISE NOTICE 'Wiederherstellung der Fremdschlüssel beginnt.';
    FOR fk IN
        SELECT conname, table_name, definition
        FROM temp_fks
    LOOP
        EXECUTE format('ALTER TABLE %I ADD CONSTRAINT %I %s;', fk.table_name, fk.conname, fk.definition);
        RAISE NOTICE 'Fremdschlüssel % in Tabelle % wiederhergestellt.', fk.conname, fk.table_name;
    END LOOP;
    RAISE NOTICE 'Wiederherstellung der Fremdschlüssel abgeschlossen.';
END $$;

But still the same problem.


I notice now, when I open Invoicing / Configuration / Taxes:
He display the taxes from id1, but I use id2. When I switch to id1, he show me id2.

I updates all foreign keys, but there must be a setting hardcoded?

I need to change all tax data from company_id 1 to 2 and from 2 to 1



Imagine profil
Abandonează