{"id":9250,"date":"2025-05-23T13:29:08","date_gmt":"2025-05-23T11:29:08","guid":{"rendered":"https:\/\/pomoc.comarch.pl\/cee\/640\/?post_type=ht_kb&#038;p=9250"},"modified":"2025-05-23T13:31:00","modified_gmt":"2025-05-23T11:31:00","slug":"interfejs-dla-reorganizacji-partnerow","status":"publish","type":"ht_kb","link":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-partnerow\/","title":{"rendered":"Interfejs dla reorganizacji partner\u00f3w"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 ez-toc-wrap-left counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Spis tre\u015bci<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Prze\u0142\u0105cznik Spisu Tre\u015bci\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-partnerow\/#Grupa_docelowa\" >Grupa docelowa<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-partnerow\/#Interfejs_programowania\" >Interfejs programowania<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-partnerow\/#Tworzenie_klas_uzytkowania\" >Tworzenie klas u\u017cytkowania<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-partnerow\/#GUID_partnera_bez_odniesienia_organizacyjnego\" >GUID partnera bez odniesienia organizacyjnego<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-partnerow\/#GUID_partnera_i_organizacji_w_BO\" >GUID partnera i organizacji w BO<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-partnerow\/#GUID_partnera_i_organizacji_w_roznych_BO_podwojne_sprzezenie\" >GUID partnera i organizacji w r\u00f3\u017cnych BO (podw\u00f3jne sprz\u0119\u017cenie)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-partnerow\/#Rejestrowanie_klas_uzytkowania\" >Rejestrowanie klas u\u017cytkowania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-partnerow\/#Implementacja_interfejsu_uzytkowania\" >Implementacja interfejsu u\u017cytkowania<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-partnerow\/#Rejestracja_BO_do_usuniecia\" >Rejestracja BO do usuni\u0119cia<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-partnerow\/#Implementacja_interfejsu_usuwania\" >Implementacja interfejsu usuwania<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<p data-start=\"54\" data-end=\"298\">Partnerzy i role oznaczone do usuni\u0119cia mog\u0105 zosta\u0107 usuni\u0119te w ramach procesu reorganizacji.<br data-start=\"181\" data-end=\"184\" \/>Aby fizycznie usun\u0105\u0107 dane ze znacznikiem usuwania, nale\u017cy sprawdzi\u0107, czy nie s\u0105 one wykorzystywane w innych procesach.<\/p>\n<p data-start=\"300\" data-end=\"461\">W niniejszym artykule wyja\u015bnione zostan\u0105 technicznie rejestry oraz opisane zosta\u0142o, jak mo\u017ce wygl\u0105da\u0107 rozszerzenie dla w\u0142asnych obiekt\u00f3w podlegaj\u0105cych weryfikacji.<\/p>\n<h3 id=\"grupa-docelowa\" ><span class=\"ez-toc-section\" id=\"Grupa_docelowa\"><\/span>Grupa docelowa<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>Programi\u015bci<\/li>\n<\/ul>\n<h3 id=\"interfejs-programowania\" ><span class=\"ez-toc-section\" id=\"Interfejs_programowania\"><\/span>Interfejs programowania<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4 id=\"tworzenie-klas-uzytkowania\" ><span class=\"ez-toc-section\" id=\"Tworzenie_klas_uzytkowania\"><\/span>Tworzenie klas u\u017cytkowania<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Z wyj\u0105tkiem roli <em>Podstawowa<\/em> i <em>Pracownik<\/em>, wszystkie role partner\u00f3w s\u0105 zapisywane w spos\u00f3b zale\u017cny od organizacji. Oznacza to, \u017ce do uzyskania dost\u0119pu do tych danych zawsze wymagana jest organizacja. W zwi\u0105zku z tym, w u\u017cywanych obiektach biznesowych r\u00f3wnie\u017c nale\u017cy okre\u015bli\u0107 powi\u0105zanie z organizacj\u0105. Obs\u0142ugiwane s\u0105 niekt\u00f3re standardowe przypadki:<\/p>\n<ul>\n<li class=\"\" data-start=\"336\" data-end=\"528\">\n<p class=\"\" data-start=\"338\" data-end=\"528\">wykorzystywany jest jedynie GUID partnera, bez odniesienia do organizacji, np. dla u\u017cycia, kt\u00f3re maj\u0105 by\u0107 zachowane wy\u0142\u0105cznie na poziomie klienta lub odnosz\u0105 si\u0119 do danych podstawowych<\/p>\n<\/li>\n<li class=\"\" data-start=\"529\" data-end=\"614\">\n<p class=\"\" data-start=\"531\" data-end=\"614\">GUID partnera i GUID organizacji znajduj\u0105 si\u0119 w tym samym obiekcie biznesowym (BO)<\/p>\n<\/li>\n<li class=\"\" data-start=\"615\" data-end=\"711\">\n<p class=\"\" data-start=\"617\" data-end=\"711\">GUID partnera znajduje si\u0119 w jednym BO, a GUID organizacji w innym, po\u0142\u0105czonym prostym join<\/p>\n<\/li>\n<li class=\"\" data-start=\"712\" data-end=\"912\">\n<p class=\"\" data-start=\"714\" data-end=\"912\">GUID partnera znajduje si\u0119 w jednym BO, a GUID organizacji w innym BO, kt\u00f3ry jest po\u0142\u0105czony za pomoc\u0105 z\u0142o\u017conego (dwukrotnego) join<\/p>\n<\/li>\n<\/ul>\n<p>W typowych przypadkach obiekty biznesowe zawieraj\u0105 tylko jedno atrybutowe odniesienie do partnera. Join s\u0105 zwykle realizowane r\u00f3wnie\u017c przez jedno pole. Dla takich przypadk\u00f3w dost\u0119pne s\u0105 metody <em data-start=\"1108\" data-end=\"1125\">createUsage(..)<\/em>, kt\u00f3re umo\u017cliwiaj\u0105 ich odwzorowanie. Istnieje logika standardowa, kt\u00f3ra na podstawie informacji rejestracyjnych generuje odpowiednie zapytania OQL, wykonuje je i identyfikuje mo\u017cliwe powi\u0105zania. Zwracanym wynikiem metod\u00a0<em data-start=\"1346\" data-end=\"1363\">createUsage(..)<\/em>\u00a0jest instancja klasy\u00a0<em data-start=\"1385\" data-end=\"1400\">StandardUsage<\/em>, kt\u00f3ra implementuje t\u0119 logik\u0119.<\/p>\n<p>Dost\u0119pna jest tak\u017ce wersja metody\u00a0<em data-start=\"1467\" data-end=\"1480\">createUsage<\/em>, kt\u00f3rej sygnatura obs\u0142uguje najbardziej og\u00f3lny przypadek w ramach logiki standardowej. Join mog\u0105 wtedy obejmowa\u0107 wiele atrybut\u00f3w, a tak\u017ce mo\u017cliwe jest, \u017ce dany BO zawiera wiele atrybut\u00f3w z identyfikatorami artyku\u0142\u00f3w, kt\u00f3re maj\u0105 by\u0107 sprawdzane jednocze\u015bnie.<\/p>\n<p>W przypadku bardziej z\u0142o\u017conych modeli danych lub konieczno\u015bci uwzgl\u0119dnienia szczeg\u00f3lnych warunk\u00f3w, nale\u017cy zaprogramowa\u0107 klas\u0119 kontroln\u0105, kt\u00f3ra implementuje interfejs\u00a0 com.cisag.app.general.partner.reorg.Usage.<\/p>\n<h5 id=\"guid-partnera-bez-odniesienia-organizacyjnego\" ><span class=\"ez-toc-section\" id=\"GUID_partnera_bez_odniesienia_organizacyjnego\"><\/span>GUID partnera bez odniesienia organizacyjnego<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Wywo\u0142anie metody<\/p>\n<p><code>createUsage(clazz, \"partnerAttribute\")<\/code><\/p>\n<article class=\"text-token-text-primary w-full\" dir=\"auto\" data-testid=\"conversation-turn-98\" data-scroll-anchor=\"true\">\n<div class=\"text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[70rem]:[--thread-content-margin:--spacing(12)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group\/turn-messages focus-visible:outline-hidden\" tabindex=\"-1\">\n<div class=\"group\/conversation-turn relative flex w-full min-w-0 flex-col agent-turn\">\n<div class=\"relative flex-col gap-1 md:gap-3\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-5\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"d8118ba9-e01b-41dc-aee3-b23689d03697\" data-message-model-slug=\"gpt-4o\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[3px]\">\n<div class=\"markdown prose dark:prose-invert w-full break-words light\">\n<p>Generuje standardow\u0105 instancj\u0119 logiczn\u0105, kt\u00f3ra zawiera nast\u0119puj\u0105ce zapytanie OQL:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<p><code>Select .. from clazz uc where uc:partnerAttribute = ?<\/code><\/p>\n<h5 id=\"guid-partnera-i-organizacji-w-bo\" ><span class=\"ez-toc-section\" id=\"GUID_partnera_i_organizacji_w_BO\"><\/span>GUID partnera i organizacji w BO<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Wywo\u0142anie metody:<\/p>\n<p><code>createUsage(clazz, \"partnerAttribute\", \"organizationalUnitAttribute\")<\/code><\/p>\n<p>Generuje standardow\u0105 instancj\u0119 logiczn\u0105, kt\u00f3ra zawiera nast\u0119puj\u0105ce zapytanie OQL:<\/p>\n<p><code>Select .. from clazz uc where uc:partnerAttribute = ? and\u00a0uc:organizationalUnitAttribute = ?<\/code><\/p>\n<h5 id=\"guid-partnera-i-organizacji-w-roznych-bo-podwojne-sprzezenie\" ><span class=\"ez-toc-section\" id=\"GUID_partnera_i_organizacji_w_roznych_BO_podwojne_sprzezenie\"><\/span>GUID partnera i organizacji w r\u00f3\u017cnych BO (podw\u00f3jne sprz\u0119\u017cenie)<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Wywo\u0142anie metody:<\/p>\n<p><code>createUsage(clazz, \"partnerAttribute\", \"source\", targetClass, \"target\", \"organizationalUnitAttribute\")<\/code><\/p>\n<p>Generuje standardow\u0105 instancj\u0119 logiczn\u0105, kt\u00f3ra zawiera nast\u0119puj\u0105ce zapytanie OQL:<\/p>\n<p><code>Select .. from clazz uc<\/code><br \/>\n<code>join targetClass tc on uc:source = tc:target<\/code><br \/>\n<code>where uc:partnerAttribute = ? and tc:organizationalUnitAttribute = ?<\/code><\/p>\n<h4 id=\"rejestrowanie-klas-uzytkowania\" ><span class=\"ez-toc-section\" id=\"Rejestrowanie_klas_uzytkowania\"><\/span>Rejestrowanie klas u\u017cytkowania<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Obiekty biznesowe do sprawdzenia s\u0105 rejestrowane w klasie:<\/p>\n<p>com.cisag.app.general.partner.reorg.PartnerUsageRegistry.<\/p>\n<p>Te obiekty biznesowe musz\u0105 zawiera\u0107 partnera jako klucz obcy. Ponadto nadal potrzebuj\u0105 one danych partnera. Je\u015bli obiekt biznesowy co prawda zawiera partnera jako klucz obcy, ale nie wymaga ju\u017c samych danych partnera, to taki obiekt nie musi by\u0107 rejestrowany. Rejestracja zawiera informacje o obiektach biznesowych, kt\u00f3re \u2014 pod pewnymi warunkami \u2014 mog\u0105 zablokowa\u0107 trwa\u0142e usuni\u0119cie danych partnera.<\/p>\n<p>Podczas rejestracji nale\u017cy uwzgl\u0119dni\u0107 rodzaj u\u017cycia partnera oraz to, czy dany obiekt biznesowy dotyczy danych podstawowych. Dla ka\u017cdego typu u\u017cycia istnieje metoda, kt\u00f3rej nazwa odpowiada wpisom w zestawie warto\u015bci <em>ValueSet SubapplicationSelection<\/em>.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><code><span style=\"color: initial;\">registerBase( false, <\/span>createUsage(com.cisag.app.inventory.obj.InventoryOnhand.class, \"owner\" ));<\/code><\/p>\n<p>W tym przyk\u0142adzie obiekt biznesowy <em data-start=\"128\" data-end=\"145\">InventoryOnhand<\/em> zostaje zarejestrowany z u\u017cyciem jednej z opisanych metod <em data-start=\"204\" data-end=\"217\">createUsage<\/em>.<br data-start=\"218\" data-end=\"221\" \/>Dane podstawowe partnera mog\u0105 zosta\u0107 usuni\u0119te tylko wtedy, gdy nie istniej\u0105 \u017cadne wpisy w obiekcie biznesowym <em data-start=\"331\" data-end=\"348\" data-is-only-node=\"\">InventoryOnhand<\/em>, kt\u00f3re poprzez atrybut <em data-start=\"372\" data-end=\"381\">owner<\/em>\u00a0odnosi\u0142yby si\u0119 do danego partnera.<\/div><\/section>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><code><span style=\"color: initial;\">registerCustomer( false,\u00a0<\/span>createUsage(com.cisag.app.sales.obj.CustomerInvoiceDetail.class, \"deliveryCustomer\",\u00a0\"header\",com.cisag.app.sales.obj.CustomerInvoice.class, \"guid\",\u00a0\"invoicingParty\" ));<\/code><\/p>\n<p>W drugim przyk\u0142adzie obiekt biznesowy <em data-start=\"118\" data-end=\"141\">CustomerInvoiceDetail<\/em> zostaje zarejestrowany z u\u017cyciem jednej z opisanych metod <em data-start=\"200\" data-end=\"213\">createUsage<\/em>.<br data-start=\"214\" data-end=\"217\" \/>Dane klienta danego partnera mog\u0105 zosta\u0107 usuni\u0119te tylko wtedy, gdy nie istniej\u0105 \u017cadne wpisy w obiekcie biznesowym <em data-start=\"331\" data-end=\"354\" data-is-only-node=\"\">CustomerInvoiceDetail<\/em>, kt\u00f3re poprzez atrybut <em data-start=\"378\" data-end=\"398\">deliveryCustomer<\/em>\u00a0odnosi\u0142yby si\u0119 do tego partnera.<br data-start=\"431\" data-end=\"434\" \/>W tym przypadku powi\u0105zanie z organizacj\u0105 mo\u017cna okre\u015bli\u0107 na podstawie relacji mi\u0119dzy <em data-start=\"518\" data-end=\"541\">CustomerInvoiceDetail<\/em> a <em data-start=\"544\" data-end=\"561\">CustomerInvoice<\/em>.<\/div><\/section>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><code><span style=\"color: initial;\">registerSupplier( true, new PartnerRelationUsage());<\/span><\/code><\/p>\n<p>W trzecim przyk\u0142adzie bezpo\u015brednio rejestrowana jest klasa do weryfikacji zale\u017cno\u015bci w obiekcie biznesowym <em data-start=\"188\" data-end=\"205\">PartnerRelation<\/em> w odniesieniu do danych dostawcy danego partnera.<br data-start=\"255\" data-end=\"258\" \/>Klasa <em data-start=\"264\" data-end=\"286\">PartnerRelationUsage<\/em> musi implementowa\u0107 interfejs <em data-start=\"316\" data-end=\"323\" data-is-only-node=\"\">Usage<\/em>.<br data-start=\"324\" data-end=\"327\" \/>Jest to spos\u00f3b na zarejestrowanie w\u0142asnej procedury sprawdzaj\u0105cej, kt\u00f3ra wykracza poza standardowe przypadki obs\u0142ugiwane przez metody <em data-start=\"461\" data-end=\"474\">createUsage<\/em>.<\/div><\/section>\n<h4 id=\"implementacja-interfejsu-uzytkowania\" ><span class=\"ez-toc-section\" id=\"Implementacja_interfejsu_uzytkowania\"><\/span>Implementacja interfejsu u\u017cytkowania<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"75\" data-end=\"729\">Dla wszystkich obiekt\u00f3w biznesowych (<em data-start=\"112\" data-end=\"117\">BO<\/em>), kt\u00f3re nie mog\u0105 by\u0107 obs\u0142u\u017cone przez wspomniane powy\u017cej standardowe metody, konieczne jest zaprogramowanie klasy sprawdzaj\u0105cej, kt\u00f3ra implementuje interfejs <em data-start=\"275\" data-end=\"318\">com.cisag.app.general.partner.reorg.Usage<\/em>. Konwencja nazewnicza zak\u0142ada nazw\u0119 sprawdzanego obiektu biznesowego z dodanym sufiksem <em data-start=\"409\" data-end=\"418\">Usage<\/em>. Interfejs zawiera metody: <em data-start=\"448\" data-end=\"463\">getUsageClass<\/em>, <em data-start=\"465\" data-end=\"474\">isInUse<\/em> oraz <em data-start=\"480\" data-end=\"488\">usedBy. <\/em>Metoda <em data-start=\"499\" data-end=\"514\">getUsageClass<\/em> zwraca zarejestrowan\u0105 klas\u0119 <em data-start=\"543\" data-end=\"555\">usageClass<\/em> i s\u0142u\u017cy g\u0142\u00f3wnie do cel\u00f3w konserwacyjnych.<br data-start=\"597\" data-end=\"600\" \/>Metoda <em data-start=\"607\" data-end=\"616\">isInUse<\/em> sprawdza istnienie referencji do partnera, natomiast <em data-start=\"670\" data-end=\"678\">usedBy<\/em> identyfikuje instancje odwo\u0142uj\u0105ce si\u0119 do partnera.<\/p>\n<p data-start=\"731\" data-end=\"787\">Dzia\u0142anie interfejsu zosta\u0142o wyja\u015bnione na przyk\u0142adzie.<\/p>\n<p data-start=\"731\" data-end=\"787\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><code>public class TaxExemptionUsage implements Usage{private final CisEnvironment env = CisEnvironment.getInstance();<\/code><\/p>\n<p><code>private final CisObjectManager om = env.getObjectManager();<\/code><\/p>\n<p><code>public TaxExemptionUsage() {<\/code><\/p>\n<p><code>}<\/code><\/p>\n<p><code>public Class getUsageClass() {<\/code><\/p>\n<p><code>return TaxExemption.class;<\/code><\/p>\n<p><code>}<\/code><\/p>\n<p><code>public boolean isInUse(Chunk chunk) {<\/code><\/p>\n<p><code>short role=chunk.getRole();<\/code><\/p>\n<p><code>if (role != SubapplicationSelection.CUSTOMER &amp;&amp; role != SubapplicationSelection.SUPPLIER) {<\/code><\/p>\n<p><code>throw new IllegalArgumentException(\"Only customer and supplier\u00a0role are allowed.\");<\/code><\/p>\n<p><code>}<\/code><\/p>\n<p><code>int size = chunk.countToCheck();<\/code><\/p>\n<p><code>if (size &lt;= 0) {<\/code><\/p>\n<p><code>return false;<\/code><\/p>\n<p><code>}<\/code><\/p>\n<p><code>boolean isInUse = false;<\/code><\/p>\n<p><code>StringBuffer oql = new StringBuffer(\"select o:partner,\u00a0o:organizationalUnit from \");<\/code><\/p>\n<p><code>oql.append(\" TaxExemption o where (\");<\/code><\/p>\n<p><code>for (int i = 0; i &lt; size; i++) {<\/code><\/p>\n<p><code>oql.append(\"(o:partner=? i o:organisationalUnit=?) lub \");<\/code><\/p>\n<p><code>}<\/code><\/p>\n<p><code>oql.setLength(oql.length() - 4);<\/code><\/p>\n<p><code>oql.append(\") and o:kind=?\");<\/code><\/p>\n<p><code>CisResultSet rs = om.getResultSet( oql.toString() );<\/code><\/p>\n<p><code>try {<\/code><\/p>\n<p><code>int offset = 0;<\/code><\/p>\n<p><code>Iterator comboIt = chunk.retrieveCombinationsToCheck();<\/code><\/p>\n<p><code>while (comboIt.hasNext()) {<\/code><\/p>\n<p><code>Entry currentCombo = (Entry) comboIt.next();<\/code><\/p>\n<p><code>rs.setGuid( ++offset, currentCombo.getGuid() );<\/code><\/p>\n<p><code>rs.setGuid( ++offset, currentCombo.getOrganizationalUnit() );<\/code><\/p>\n<p><code>}<\/code><\/p>\n<p><code>rs.setShort(++offset, role == SubapplicationSelection.CUSTOMER?<\/code><\/p>\n<p><code>TaxExemptionKind.EXTERNAL :<\/code><\/p>\n<p><code>TaxExemptionKind.OWN);<\/code><\/p>\n<p><code>while (rs.next()) {<\/code><\/p>\n<p><code>chunk.setInUse( rs.getGuid( 1 ), rs.getGuid( 2 ) );<\/code><\/p>\n<p><code>isInUse = true;<\/code><\/p>\n<p><code>}<\/code><\/p>\n<p><code>} catch (java.sql.SQLException ex) {<\/code><\/p>\n<p><code>throw new RuntimeException( ex );<\/code><\/p>\n<p><code>} finally {<\/code><\/p>\n<p><code>rs.close();<\/code><\/p>\n<p><code>}<\/code><\/p>\n<p><code>return isInUse;<\/code><\/p>\n<p><code>}<\/code><\/p>\n<p><code>public CisObject[] usedBy(Chunk.Entry entry) {<\/code><\/p>\n<p><code>short role = entry.getRole();<\/code><\/p>\n<p><code>if (role != SubapplicationSelection.CUSTOMER &amp;&amp; role != SubapplicationSelection.SUPPLIER) {<\/code><\/p>\n<p><code>throw new IllegalArgumentException(\"Dozwolone s\u0105 tylko role klienta i dostawcy<\/code><\/p>\n<p><code>role are allowed.\");<\/code><\/p>\n<p><code>}<\/code><\/p>\n<p><code>byte[] partnerGuid = entry.getGuid();<\/code><\/p>\n<p><code>byte[] organizationalUnit = entry.getOrganizationalUnit();<\/code><\/p>\n<p><code>String oql = \"select o:guid from \" +<\/code><\/p>\n<p><code>\"com.cisag.app.financials.obj.TaxExemption o where \" +<\/code><\/p>\n<p><code>\"o:partner=? and o:organisationalUnit=? \" +<\/code><\/p>\n<p><code>\"i o:kind=?\";<\/code><\/p>\n<p><code>Lista result = new ArrayList();<\/code><\/p>\n<p><code>CisResultSet rs = om.getResultSet( oql );<\/code><\/p>\n<p><code>try {<\/code><\/p>\n<p><code>rs.setGuid( 1, partnerGuid);<\/code><\/p>\n<p><code>rs.setGuid( 2, organizationalUnit);<\/code><\/p>\n<p><code>rs.setShort( 3, role == SubapplicationSelection.CUSTOMER?<\/code><\/p>\n<p><code>TaxExemptionKind.EXTERNAL :<\/code><\/p>\n<p><code>TaxExemptionKind.OWN);<\/code><\/p>\n<p><code>rs.setMaxRows(PartnerReorganisationLogic.MAX_USAGE);<\/code><\/p>\n<p><code>while(rs.next()){<\/code><\/p>\n<p><code>result.add(TaxExemption.buildPrimaryKey(rs.getGuid(1)));<\/code><\/p>\n<p><code>}<\/code><\/p>\n<p><code>} catch (java.sql.SQLException ex) {<\/code><\/p>\n<p><code>throw new RuntimeException( ex );<\/code><\/p>\n<p><code>} finally {<\/code><\/p>\n<p><code>rs.close();<\/code><\/p>\n<p><code>}<\/code><\/p>\n<p><code>CisObject[] resultObj = om.getObjectArray(result, CisObjectManager.READ);<\/code><\/p>\n<p><code>return resultObj;<\/code><\/p>\n<p><code>}<\/code><\/p>\n<p><code>}<\/code> <\/div><\/section><\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Przyk\u0142ad ten s\u0142u\u017cy wy\u0142\u0105cznie celom ilustracyjnym. Nie odpowiada on aktualnemu stanowi klasy Java w systemie i nie b\u0119dzie aktualizowany w przypadku ewentualnych zmian tej klasy w systemie.<\/div><\/section>\n<p>Nast\u0119pnie rejestracja odbywa si\u0119 w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<p><code>registerCustomer( true, new TaxExemptionUsage());<\/code><\/p>\n<p>Sprawdzenie poprawnej roli odbywa si\u0119 w metodach <em data-start=\"103\" data-end=\"112\">isInUse<\/em> oraz <em data-start=\"118\" data-end=\"126\">usedBy<\/em>. Rola mo\u017ce by\u0107 odczytana zar\u00f3wno z <em data-start=\"164\" data-end=\"171\" data-is-only-node=\"\">Chunk<\/em>, jak i z <em data-start=\"181\" data-end=\"188\">Entry<\/em>.<\/p>\n<p>Metoda <em data-start=\"61\" data-end=\"69\">usedBy<\/em> identyfikuje kombinacje partner\u2013organizacja, kt\u00f3re nadal s\u0105 referencjonowane przez instancje danego obiektu biznesowego (<em data-start=\"191\" data-end=\"195\">BO<\/em>).<br data-start=\"197\" data-end=\"200\" \/>Metoda otrzymuje jako parametr obiekt typu <em data-start=\"243\" data-end=\"250\">Chunk<\/em>, kt\u00f3ry zawiera kombinacje partner\u2013organizacja do sprawdzenia.<\/p>\n<p>Jeden\u00a0<em data-start=\"269\" data-end=\"276\">Chunk<\/em> zawsze odnosi si\u0119 do jednego typu u\u017cycia i mo\u017ce zawiera\u0107 wiele identyfikator\u00f3w GUID partnera. Dla ka\u017cdego identyfikatora partnera zawiera wszystkie identyfikatory organizacji, kt\u00f3re nale\u017cy zweryfikowa\u0107. Kombinacje, kt\u00f3re maj\u0105 zosta\u0107 sprawdzone, mo\u017cna pobra\u0107 z obiektu <em data-start=\"548\" data-end=\"555\">Chunk<\/em>\u00a0za pomoc\u0105 metody\u00a0<em data-start=\"573\" data-end=\"602\">retrieveCombinationsToCheck<\/em>.<br data-start=\"603\" data-end=\"606\" data-is-only-node=\"\" \/>Nast\u0119pnie metod\u0105\u00a0<em data-start=\"623\" data-end=\"633\">setInUse<\/em>\u00a0okre\u015bla si\u0119, kt\u00f3re z tych kombinacji s\u0105 nadal wykorzystywane.<\/p>\n<p>Je\u015bli sprawdzane zastosowanie nie jest zale\u017cne od organizacji (np. partner-podstawowe lub pracownik), organizacja nadal zawiera identyfikator klienta, nawet je\u015bli ta informacja nie jest potrzebna. Nale\u017cy to uwzgl\u0119dni\u0107 przy wywo\u0142aniu metody <em data-start=\"921\" data-end=\"931\">setInUse<\/em>.<\/p>\n<p>W przypadku metody\u00a0<em data-start=\"953\" data-end=\"962\">isInUse<\/em> nale\u017cy przy definiowaniu zapytania OQL zwr\u00f3ci\u0107 uwag\u0119, aby sprawdzanie obejmowa\u0142o wiele kombinacji partner\u2013organizacja w ramach jednego zapytania. Pola selekcji powinny odpowiada\u0107 tym kombinacjom, aby mo\u017cliwe by\u0142o oznaczenie odwo\u0142a\u0144 kombinacji za pomoc\u0105 <em data-start=\"1229\" data-end=\"1239\">setInUse<\/em>.<\/p>\n<p>Metoda\u00a0<em data-start=\"1249\" data-end=\"1257\">usedBy<\/em>\u00a0jest wywo\u0142ywana tylko wtedy, gdy podczas reorganizacji wymagane s\u0105 szczeg\u00f3\u0142owe komunikaty. Otrzymuje ona jako parametr\u00a0<em data-start=\"1377\" data-end=\"1390\">Chunk.Entry<\/em>, kt\u00f3ry zawiera jedn\u0105 kombinacj\u0119 partner\u2013organizacja, dla kt\u00f3rej zosta\u0142y wykryte instancje referencyjne. Metoda <em data-start=\"1502\" data-end=\"1510\">usedBy<\/em>\u00a0zwraca te instancje.<br data-start=\"1531\" data-end=\"1534\" \/>W zapytaniu OQL nale\u017cy jako pole selekcji wybra\u0107 klucz g\u0142\u00f3wny obiektu biznesowego (BO).<\/p>\n<h4 id=\"rejestracja-bo-do-usuniecia\" ><span class=\"ez-toc-section\" id=\"Rejestracja_BO_do_usuniecia\"><\/span>Rejestracja BO do usuni\u0119cia<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"54\" data-end=\"254\">Je\u015bli dana kombinacja kluczy przejdzie pomy\u015blnie wszystkie testy, odpowiadaj\u0105ce jej dane musz\u0105 zosta\u0107 fizycznie usuni\u0119te. Wymaga to rejestracji powi\u0105zanych obiekt\u00f3w biznesowych (BO).<\/p>\n<p data-start=\"256\" data-end=\"469\">W przypadku reorganizacji partner\u00f3w, rejestracja zazwyczaj obejmuje obiekt biznesowy odpowiadaj\u0105cy danej roli (np. <em data-start=\"371\" data-end=\"405\">com.cisag.app.sales.obj.Customer<\/em> dla roli klienta) oraz dodatkowe obiekty zale\u017cne (<em data-start=\"366\" data-end=\"378\">Dependents<\/em>).<\/p>\n<p data-start=\"471\" data-end=\"605\">Dla ka\u017cdej roli dost\u0119pne s\u0105 odpowiednie metody rejestracyjne w klasie <em data-start=\"541\" data-end=\"563\">PartnerUsageRegistry<\/em>.<br data-start=\"564\" data-end=\"567\" \/>Poni\u017cej opisanych zosta\u0142o kilka przyk\u0142ad\u00f3w:<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><code>registerDeletionCustomer(com.cisag.app.sales.obj.SalesOutputSettings.class, \"partner\",\u00a0\"organizationalUnit\");<\/code><\/p>\n<p>W pierwszym przyk\u0142adzie rejestrowane s\u0105 <em data-start=\"98\" data-end=\"119\">SalesOutputSettings<\/em>, kt\u00f3re s\u0105 powi\u0105zane z g\u0142\u00f3wnym obiektem <em data-start=\"159\" data-end=\"169\">Customer<\/em> za po\u015brednictwem atrybut\u00f3w <em data-start=\"197\" data-end=\"206\">partner<\/em> oraz <em data-start=\"212\" data-end=\"232\">organizationalUnit<\/em>.<\/div><\/section>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><code>registerDeletionCustomer( new PartnerRelationDeletion());<\/code><\/p>\n<p>W drugim przyk\u0142adzie rejestrowana jest klasa Java, kt\u00f3ra implementuje interfejs <em data-start=\"205\" data-end=\"215\">Deletion<\/em>.<\/div><\/section>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><code>registerDeletionCustomer( com.cisag.app.sales.obj.Customer.class);<\/code><\/p>\n<p>W ostatnim przyk\u0142adzie po prostu rejestrowane jest g\u0142\u00f3wne obiekt dla roli <i>Klient<\/i>\u00a0do usuni\u0119cia.<\/div><\/section>\n<h4 id=\"implementacja-interfejsu-usuwania\" ><span class=\"ez-toc-section\" id=\"Implementacja_interfejsu_usuwania\"><\/span>Implementacja interfejsu usuwania<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Interfejs usuwania obejmuje metody\u00a0<em>getDeletionClass<\/em>,\u00a0<em>delete<\/em>\u00a0i\u00a0<em>deleteExpiredVersions<\/em>.<\/p>\n<p>Metoda\u00a0<em>getDeletionClass<\/em>\u00a0zwraca klas\u0119 zarejestrowan\u0105 do usuni\u0119cia\u00a0<em>deletionClass<\/em>\u00a0zarejestrowan\u0105 do usuwania i jest u\u017cywana g\u0142\u00f3wnie w celach serwisowych (np. aby wy\u015bwietli\u0107 klasy zarejestrowane dla danego przypadku u\u017cycia).<\/p>\n<p>Metoda\u00a0<em>deleteExpiredVersions<\/em>\u00a0jest przewidziana na potrzeby przysz\u0142ych rozszerze\u0144. W przypadku BO zale\u017cnych od czasu, usuwa ona wersje, kt\u00f3rych okres wa\u017cno\u015bci up\u0142yn\u0105\u0142 przed przekazan\u0105 dat\u0105. Dla BO, kt\u00f3re nie s\u0105 zale\u017cne od czasu metoda musi jedynie zwraca\u0107 warto\u015b\u0107\u00a0<em>true<\/em>.<\/p>\n<p>Metoda\u00a0<em>delete<\/em> usuwa wszystkie wersje dla BO zale\u017cnych od czasu. Informacja o tym, dla kt\u00f3rych kombinacji partner\u2013organizacja dane maj\u0105 zosta\u0107 usuni\u0119te, pobierana jest za pomoc\u0105 metody <em>retrieveFreeCombinations\u00a0<\/em>z obiektu typu\u00a0<em>Chunk<\/em>.<\/p>\n<p style=\"text-align: left;\">Przyk\u0142adem mo\u017ce by\u0107 klasa:<\/p>\n<p style=\"text-align: left;\"><em>com.cisag.app.general.partner.reorg.PartnerRelationDeletion,<\/em>\u00a0kt\u00f3ra s\u0142u\u017cy do bezpo\u015bredniego usuwania danych powi\u0105zanych z artyku\u0142em.<\/p>\n","protected":false},"author":27,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"class_list":["post-9250","ht_kb","type-ht_kb","status-publish","format-standard","hentry","ht_kb_category-interfejsy-do-systemow-zarzadzania-przedsiebiorstwem"],"_links":{"self":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/ht_kb\/9250","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/ht_kb"}],"about":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/types\/ht_kb"}],"author":[{"embeddable":true,"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/users\/27"}],"replies":[{"embeddable":true,"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/comments?post=9250"}],"version-history":[{"count":20,"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/ht_kb\/9250\/revisions"}],"predecessor-version":[{"id":31480,"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/ht_kb\/9250\/revisions\/31480"}],"wp:attachment":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/media?parent=9250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}