{"id":9252,"date":"2025-04-23T14:30:25","date_gmt":"2025-04-23T12:30:25","guid":{"rendered":"https:\/\/pomoc.comarch.pl\/cee\/640\/?post_type=ht_kb&#038;p=9252"},"modified":"2025-04-23T14:34:57","modified_gmt":"2025-04-23T12:34:57","slug":"interfejs-dla-reorganizacji-artykulow","status":"publish","type":"ht_kb","link":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-artykulow\/","title":{"rendered":"Interfejs dla reorganizacji artyku\u0142\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-artykulow\/#Wprowadzenie\" >Wprowadzenie<\/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-artykulow\/#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-3\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-artykulow\/#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-4\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-artykulow\/#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-5\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-artykulow\/#GUID_artykulu_bez_odniesienia_organizacyjnego\" >GUID artyku\u0142u bez odniesienia organizacyjnego<\/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-artykulow\/#GUID_pozycji_i_organizacji_w_BO\" >GUID pozycji 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-7\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-artykulow\/#GUID_pozycji_i_organizacji_w_roznych_BO_proste_polaczenie\" >GUID pozycji i organizacji w r\u00f3\u017cnych BO (proste po\u0142\u0105czenie)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-artykulow\/#GUID_pozycji_i_organizacji_w_roznych_BO_podwojne_sprzezenie\" >GUID pozycji 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-9\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-artykulow\/#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-10\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-artykulow\/#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-11\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-artykulow\/#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-12\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/interfejs-dla-reorganizacji-artykulow\/#Implementacja_interfejsu_usuwania\" >Implementacja interfejsu usuwania<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h3 id=\"wprowadzenie\" ><span class=\"ez-toc-section\" id=\"Wprowadzenie\"><\/span>Wprowadzenie<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p class=\"\" data-start=\"114\" data-end=\"370\">W systemie mo\u017cliwe jest usuwanie artyku\u0142\u00f3w i ich zastosowa\u0144 oznaczonych do usuni\u0119cia za pomoc\u0105 funkcji reorganizacji. Aby mo\u017cliwe by\u0142o fizyczne usuni\u0119cie danych oznaczonych do usuni\u0119cia, konieczne jest sprawdzenie ich powi\u0105za\u0144 z innymi danymi.<\/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<p class=\"\" data-start=\"0\" data-end=\"239\">Aby zarejestrowa\u0107 obiekt biznesowy (BO) do sprawdzania w ramach reorganizacji artyku\u0142\u00f3w, konieczna jest klasa implementuj\u0105ca interfejs <em>com.cisag.app.general.item.reorg.Usage<\/em> oraz jej rejestracja.<\/p>\n<p class=\"\" data-start=\"241\" data-end=\"518\">Je\u015bli dany artyku\u0142 lub jego zastosowanie nie s\u0105 u\u017cywane, nale\u017cy r\u00f3wnie\u017c zarejestrowa\u0107 wszystkie obiekty, kt\u00f3re w takim przypadku maj\u0105 zosta\u0107 usuni\u0119te. W tym celu r\u00f3wnie\u017c musi zosta\u0107 zarejestrowana klasa, kt\u00f3ra implementuje interfejs <em>com.cisag.app.general.item.reorg.Deletion.<\/em><\/p>\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 class=\"\" data-start=\"0\" data-end=\"334\">Z wyj\u0105tkiem u\u017cycia <em>Podstawowe<\/em>, wszystkie u\u017cycia artyku\u0142\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 data-start=\"336\" data-end=\"912\">\n<li class=\"\" data-start=\"336\" data-end=\"528\">\n<p class=\"\" data-start=\"338\" data-end=\"528\">wykorzystywany jest jedynie GUID artyku\u0142u, 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 artyku\u0142u 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 artyku\u0142u 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 artyku\u0142u 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 class=\"\" data-start=\"914\" data-end=\"1431\">W typowych przypadkach obiekty biznesowe zawieraj\u0105 tylko jedno atrybutowe odniesienie do artyku\u0142u. 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 <em data-start=\"1346\" data-end=\"1363\">createUsage(..)<\/em> jest instancja klasy <em data-start=\"1385\" data-end=\"1400\">StandardUsage<\/em>, kt\u00f3ra implementuje t\u0119 logik\u0119.<\/p>\n<p class=\"\" data-start=\"1433\" data-end=\"1738\">Dost\u0119pna jest tak\u017ce wersja metody <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 class=\"\" data-start=\"1740\" data-end=\"1962\">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 <em data-start=\"1921\" data-end=\"1961\">com.cisag.app.general.item.reorg.Usage<\/em>.<\/p>\n<h5 id=\"guid-artykulu-bez-odniesienia-organizacyjnego\" ><span class=\"ez-toc-section\" id=\"GUID_artykulu_bez_odniesienia_organizacyjnego\"><\/span>GUID artyku\u0142u bez odniesienia organizacyjnego<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Wywo\u0142anie metody<\/p>\n<p><code>createUsage(clazz, \"itemAttribute\")<\/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 class=\"\" data-start=\"0\" data-end=\"89\">Tworzy instancj\u0119 logiki standardowej, 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:itemAttribute = ?<\/code><\/p>\n<h5 id=\"guid-pozycji-i-organizacji-w-bo\" ><span class=\"ez-toc-section\" id=\"GUID_pozycji_i_organizacji_w_BO\"><\/span>GUID pozycji i organizacji w BO<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Wywo\u0142anie metody:<\/p>\n<p>createUsage(clazz, &#8222;itemAttribute&#8221;, &#8222;organisationalUnitAttribute&#8221;)<\/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><\/p>\n<p><code>where uc:itemAttribute = ? and<\/code><\/p>\n<p><code>uc:organizationalUnitAttribute = ?<\/code><\/p>\n<h5 id=\"guid-pozycji-i-organizacji-w-roznych-bo-proste-polaczenie\" ><span class=\"ez-toc-section\" id=\"GUID_pozycji_i_organizacji_w_roznych_BO_proste_polaczenie\"><\/span>GUID pozycji i organizacji w r\u00f3\u017cnych BO (proste po\u0142\u0105czenie)<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Wywo\u0142anie metody:<\/p>\n<p><code>createUsage(clazz, \"itemAttribute\", \"source\", targetClass, \"target\"<\/code><\/p>\n<p><code>\"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 .. <\/code><\/p>\n<p><code>from clazz uc<\/code><\/p>\n<p><code>join targetClass tc on uc:source = tc:target<\/code><\/p>\n<p><code>where uc:itemAttribute = ? and tc:organisationalUnitAttribute = ?<\/code><\/p>\n<h5 id=\"guid-pozycji-i-organizacji-w-roznych-bo-podwojne-sprzezenie\" ><span class=\"ez-toc-section\" id=\"GUID_pozycji_i_organizacji_w_roznych_BO_podwojne_sprzezenie\"><\/span>GUID pozycji 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, \"itemAttribute\", \"source\", linkingClass, \"linkToSource\", \"linkToTarget\", 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 .. <\/code><\/p>\n<p><code>from clazz uc<\/code><\/p>\n<p><code>join linkingClass lc on uc:source = lc:linkToSource<\/code><\/p>\n<p><code>join targetClass tc on lc:linkToTarget = tc:target<\/code><\/p>\n<p><code>where uc:itemAttribute = ? 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><code>com.cisag.app.general.item.reorg.ItemUsageRegistry.<\/code><\/p>\n<p>Te obiekty biznesowe musz\u0105 zawiera\u0107 artyku\u0142 jako klucz obcy. Ponadto musz\u0105 one nadal korzysta\u0107 z danych artyku\u0142u. Je\u017celi obiekt biznesowy zawiera co prawda artyku\u0142 jako klucz obcy, ale dane te nie s\u0105 mu niezb\u0119dne, w\u00f3wczas taki obiekt biznesowy nie musi by\u0107 rejestrowany.<span style=\"font-size: revert;\"> Rejestracja zawiera informacje o obiektach biznesowych, kt\u00f3re \u2014 pod pewnymi warunkami \u2014 mog\u0105 zablokowa\u0107 trwa\u0142e usuni\u0119cie danych artyku\u0142u.<\/span><\/p>\n<p>Podczas rejestracji nale\u017cy uwzgl\u0119dni\u0107 rodzaj u\u017cycia artyku\u0142u oraz to, czy dany obiekt biznesowy dotyczy danych podstawowych. Dla ka\u017cdego typu u\u017cycia istnieje metoda rejestracji, kt\u00f3rej nazwa odpowiada wpisom w <em data-start=\"655\" data-end=\"674\">ValueSet ItemView<\/em>.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p><code>registerCommon(true, createUsage(com.cisag.app.general.obj.Kit.class, \"guid\"))<\/code><\/p>\n<p>Obiekt biznesowy <em data-start=\"1135\" data-end=\"1140\">Kit<\/em> jest rejestrowany z u\u017cyciem jednej z metod <em data-start=\"1184\" data-end=\"1197\">createUsage<\/em>. Oznacza to, \u017ce dane podstawowe artyku\u0142u mog\u0105 zosta\u0107 usuni\u0119te tylko wtedy, gdy nie istniej\u0105 \u017cadne wpisy w obiekcie <em data-start=\"1315\" data-end=\"1320\">Kit<\/em>, kt\u00f3re odnosz\u0105 si\u0119 do danego artyku\u0142u za pomoc\u0105 atrybutu <em>guid<\/em>.<\/p>\n<p><\/div><\/section>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p><code>registerSales(false, createUsage(com.cisag.app.sales.obj.SalesOrderDetail.class, \"item\", \"header\", com.cisag.app.sales.obj.SalesOrder.class, \"guid\", \"invoicingPartyData\", com.cisag.app.general.obj.OrderPartnerDataInfo.class, \"guid\", \"partner\"))<\/code><\/p>\n<p>Obiekt <em data-start=\"1423\" data-end=\"1441\">SalesOrderDetail<\/em> jest r\u00f3wnie\u017c rejestrowany z u\u017cyciem jednej z metod <em data-start=\"1493\" data-end=\"1506\">createUsage<\/em>. Dane sprzeda\u017cowe artyku\u0142u mog\u0105 zosta\u0107 usuni\u0119te tylko wtedy, gdy nie istniej\u0105 wpisy w obiekcie <em data-start=\"1604\" data-end=\"1622\">SalesOrderDetail<\/em>, kt\u00f3re odnosz\u0105 si\u0119 do danego artyku\u0142u za pomoc\u0105 atrybutu <em>item<\/em>. W tym przypadku powi\u0105zanie organizacyjne ustalane jest poprzez zale\u017cno\u015b\u0107 mi\u0119dzy obiektami <em data-start=\"1780\" data-end=\"1798\" data-is-only-node=\"\">SalesOrderDetail<\/em>, <em data-start=\"1800\" data-end=\"1812\">SalesOrder<\/em> i <em data-start=\"1815\" data-end=\"1837\">OrderPartnerDataInfo<\/em>.<\/p>\n<p><\/div><\/section>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p><code>registerInventory(false, new InventoryTransactionUsage())<\/code><\/p>\n<p>Rejestrowana jest bezpo\u015brednio klasa <em data-start=\"1905\" data-end=\"1932\">InventoryTransactionUsage<\/em>, kt\u00f3ra sprawdza zale\u017cno\u015bci w obiekcie <em data-start=\"1971\" data-end=\"1993\">InventoryTransaction<\/em> w odniesieniu do danych logistyki magazynowej artyku\u0142u. Klasa <strong><em data-start=\"2056\" data-end=\"2083\">InventoryTransactionUsage<\/em> musi implementowa\u0107 interfejs <em data-start=\"2113\" data-end=\"2120\" data-is-only-node=\"\">Usage<\/em>.<\/strong><br data-start=\"2121\" data-end=\"2124\" \/><strong>Jest to spos\u00f3b rejestracji sprawdzania zale\u017cno\u015bci, kt\u00f3ry wykracza poza standardowe przypadki obs\u0142ugiwane przez metody <em data-start=\"2246\" data-end=\"2259\">createUsage<\/em>.<\/strong><\/p>\n<p><\/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>Dla wszystkich obiekt\u00f3w biznesowych (BO), kt\u00f3re nie mog\u0105 zosta\u0107 obs\u0142u\u017cone przez wy\u017cej wymienione standardowe mechanizmy, konieczne jest stworzenie klasy kontrolnej, kt\u00f3ra implementuje interfejs <em>com.cisag.app.general.item.reorg.Usage.<\/em><\/p>\n<p class=\"\" data-start=\"243\" data-end=\"363\">Konwencja nazewnictwa zak\u0142ada u\u017cycie nazwy obiektu biznesowego, kt\u00f3ry ma by\u0107 sprawdzany, z dodanym sufiksem <em>Usage<\/em>.<\/p>\n<p class=\"\" data-start=\"365\" data-end=\"414\">Interfejs <em>Usage<\/em> zawiera nast\u0119puj\u0105ce metody:<\/p>\n<ul>\n<li><strong>getUsageClass <\/strong>&#8211; zwraca klas\u0119 <em>usageClass<\/em>, kt\u00f3ra zosta\u0142a zarejestrowana do weryfikacji, i s\u0142u\u017cy g\u0142\u00f3wnie do cel\u00f3w administracyjnych (np. umo\u017cliwia wy\u015bwietlenie klas zarejestrowanych dla danego u\u017cycia)<\/li>\n<li><strong>isInUse<\/strong> &#8211; sprawdza, czy istniej\u0105 referencje do artyku\u0142u<\/li>\n<li><strong>usedBy<\/strong> &#8211; identyfikuje instancje, kt\u00f3re odwo\u0142uj\u0105 si\u0119 do danego artyku\u0142u.<\/li>\n<\/ul>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">\n<p><em>public class ReceiptOfGoodsDetailUsage implements Usage{<\/em><\/p>\n<p><em>private final CisEnvironment env =CisEnvironment.getInstance();<\/em><\/p>\n<p><em>private final CisObjectManager om = env.getObjectManager();<\/em><\/p>\n<p><em>private final Class usageClass = ReceiptOfGoodsDetail.class;<\/em><\/p>\n<p><em>public Class getUsageClass(){<\/em><\/p>\n<p><em>return usageClass;<\/em><\/p>\n<p><em>}<\/em><\/p>\n<p><em>public boolean isInUse(Chunk chunk){<\/em><\/p>\n<p><em>switch(chunk.getRole()){<\/em><\/p>\n<p><em>case ItemView.INVENTORY:<\/em><\/p>\n<p><em>break;<\/em><\/p>\n<p><em>default:<\/em><\/p>\n<p><em>throw new IllegalArgumentException(<\/em><\/p>\n<p><em>this.getClass().getName()+\u201d not defined for item role<\/em><\/p>\n<p><em>\u201c+chunk.getRole());<\/em><\/p>\n<p><em>}<\/em><\/p>\n<p><em>boolean isInUse = false;<\/em><\/p>\n<p><em>int size = chunk.countToCheck();<\/em><\/p>\n<p><em>if (size&lt;=0)return isInUse;<\/em><\/p>\n<p><em>StringBuffer oql = new StringBuffer();<\/em><\/p>\n<p><em>oql.append(\u201cSelect uc:item, lc:inventoryOrganization from<\/em><\/p>\n<p><em>\u201c+usageClass.getName()+\u201d uc join com.cisag.app.purchasing.obj.<\/em><\/p>\n<p><em>ReceiptOfGoods lc on uc:header = lc:guid \u201c+<\/em><\/p>\n<p><em>\u201cjoin com.cisag.app.purchasing.obj.ReceiptOfGoodsType tc on<\/em><\/p>\n<p><em>lc:type = tc:guid \u201d<\/em><\/p>\n<p><em>+\u201dwhere tc:type = ? and (\u201c);<\/em><\/p>\n<p><em>for (int i=0;i&lt;size;i++){<\/em><\/p>\n<p><em>oql.append(\u201c(uc:item =? and lc:inventoryOrganization =?) or \u201c);<\/em><\/p>\n<p><em>}<\/em><\/p>\n<p><em>oql.setLength(oql.length()-4);<\/em><\/p>\n<p><em>oql.append(\u201c)\u201d);<\/em><\/p>\n<p><em>CisResultSet rs =<\/em><\/p>\n<p><em>om.getResultSet(oql.toString(),CisObjectManager.READ);<\/em><\/p>\n<p><em>try {<\/em><\/p>\n<p><em>int offset = 0;<\/em><\/p>\n<p><em>rs.setShort(++offset,<\/em><\/p>\n<p><em>com.cisag.app.purchasing.ReceiptOfGoodsType.PRODUCTION);<\/em><\/p>\n<p><em>Iterator comboIt = chunk.retrieveCombinationsToCheck();<\/em><\/p>\n<p><em>while(comboIt.hasNext()){<\/em><\/p>\n<p><em>Chunk.Entry currentCombo = (Chunk.Entry)comboIt.next();<\/em><\/p>\n<p><em>rs.setGuid(++offset,currentCombo.getGuid());<\/em><\/p>\n<p><em>rs.setGuid(++offset,currentCombo.getOrganizationalUnit());<\/em><\/p>\n<p><em>}<\/em><\/p>\n<p><em>while (rs.next()){<\/em><\/p>\n<p><em>chunk.setInUse(rs.getGuid(1), rs.getGuid(2));<\/em><\/p>\n<p><em>isInUse = true;<\/em><\/p>\n<p><em>}<\/em><\/p>\n<p><em>} catch (java.sql.SQLException ex) {<\/em><\/p>\n<p><em>throw new RuntimeException(ex);<\/em><\/p>\n<p><em>} finally {<\/em><\/p>\n<p><em>rs.close();<\/em><\/p>\n<p><em>}<\/em><\/p>\n<p><em>return isInUse;<\/em><\/p>\n<p><em>}<\/em><\/p>\n<p><em>public CisObject[] usedBy(Chunk.Entry entry) {<\/em><\/p>\n<p><em>switch(entry.getRole()){<\/em><\/p>\n<p><em>case ItemView.INVENTORY:<\/em><\/p>\n<p><em>break;<\/em><\/p>\n<p><em>default:<\/em><\/p>\n<p><em>throw new IllegalArgumentException(this.getClass().getName()<\/em><\/p>\n<p><em>+\u201d not defined for item role \u201c+entry.getRole());<\/em><\/p>\n<p><em>}<\/em><\/p>\n<p><em>String oqlString = \u201cSelect uc:header, uc:guid from<\/em><\/p>\n<p><em>\u201c+usageClass.getName()+\u201d uc join com.cisag.app.purchasing.obj.<\/em><\/p>\n<p><em>ReceiptOfGoods lc on uc:header = lc:guid join<\/em><\/p>\n<p><em>com.cisag.app.purchasing.obj.ReceiptOfGoodsType tc<\/em><\/p>\n<p><em>on lc:type = tc:guid \u201d<\/em><\/p>\n<p><em>+\u201dwhere tc:type=? and uc:item=? and lc:inventoryOrganization= ?\u201d;<\/em><\/p>\n<p><em>CisResultSet rs =<\/em><\/p>\n<p><em>om.getResultSet(oqlString, CisObjectManager.READ);<\/em><\/p>\n<p><em>List keys = new ArrayList();<\/em><\/p>\n<p><em>try {<\/em><\/p>\n<p><em>int offset = 0;<\/em><\/p>\n<p><em>rs.setShort(++offset,<\/em><\/p>\n<p><em>com.cisag.app.purchasing.ReceiptOfGoodsType.PRODUCTION);<\/em><\/p>\n<p><em>rs.setGuid(++offset,entry.getGuid());<\/em><\/p>\n<p><em>rs.setGuid(++offset,entry.getOrganizationalUnit());<\/em><\/p>\n<p><em>rs.setMaxRows(ItemReorganizationLogic.MAX_USAGE);<\/em><\/p>\n<p><em>while (rs.next()){<\/em><\/p>\n<p><em>keys.add(<\/em><\/p>\n<p><em>ReceiptOfGoodsDetail.buildPrimaryKey(rs.getGuid(1),rs.getGuid(2)));<\/em><\/p>\n<p><em>}<\/em><\/p>\n<p><em>} catch (java.sql.SQLException ex) {<\/em><\/p>\n<p><em>throw new RuntimeException(ex);<\/em><\/p>\n<p><em>} finally {<\/em><\/p>\n<p><em>rs.close();<\/em><\/p>\n<p><em>}<\/em><\/p>\n<p><em>CisObject[] resultObj =<\/em><\/p>\n<p><em>om.getObjectArray(keys, CisObjectManager.READ);<\/em><\/p>\n<p><em>return resultObj;<\/em><\/p>\n<p><em>}<\/em><\/p>\n<p><span style=\"font-size: revert; color: initial;\"><\/div><\/section><\/span><\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Przyk\u0142ad s\u0142u\u017cy wy\u0142\u0105cznie do cel\u00f3w ilustracyjnych. Nie jest on aktualizowany w przypadku ewentualnych zmian tej klasy w systemie.<\/div><\/section>\n<p>Sprawdzenie poprawnej roli odbywa si\u0119 w metodach <em>isInUse <\/em>oraz <em>usedBy<\/em>. Rola mo\u017ce by\u0107 odczytana zar\u00f3wno z <em>Chunk<\/em>, jak i z <em>Entry<\/em>.<\/p>\n<p class=\"\" data-start=\"0\" data-end=\"261\">Metoda <em data-start=\"7\" data-end=\"15\">usedBy<\/em> identyfikuje kombinacje artyku\u0142\u2013organizacja, do kt\u00f3rych odwo\u0142uj\u0105 si\u0119 instancje danego obiektu biznesowego (BO).<br data-start=\"141\" data-end=\"144\" \/>Metoda ta otrzymuje jako parametr obiekt typu <em data-start=\"190\" data-end=\"197\">Chunk<\/em>, kt\u00f3ry zawiera kombinacje artyku\u0142\u2013organizacja do sprawdzenia.<\/p>\n<p class=\"\" data-start=\"263\" data-end=\"695\">Jeden <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 artyku\u0142\u00f3w. Dla ka\u017cdego identyfikatora artyku\u0142u 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> za pomoc\u0105 metody <em data-start=\"573\" data-end=\"602\">retrieveCombinationsToCheck<\/em>.<br data-start=\"603\" data-end=\"606\" data-is-only-node=\"\" \/>Nast\u0119pnie metod\u0105 <em data-start=\"623\" data-end=\"633\">setInUse<\/em> okre\u015bla si\u0119, kt\u00f3re z tych kombinacji s\u0105 nadal wykorzystywane.<\/p>\n<p class=\"\" data-start=\"697\" data-end=\"932\">Je\u015bli sprawdzane zastosowanie nie jest zale\u017cne od organizacji (np. artyku\u0142-podstawowe), 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 class=\"\" data-start=\"934\" data-end=\"1240\">W przypadku metody <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 artyku\u0142\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 class=\"\" data-start=\"1242\" data-end=\"1623\">Metoda <em data-start=\"1249\" data-end=\"1257\">usedBy<\/em> jest wywo\u0142ywana tylko wtedy, gdy podczas reorganizacji wymagane s\u0105 szczeg\u00f3\u0142owe komunikaty. Otrzymuje ona jako parametr <em data-start=\"1377\" data-end=\"1390\">Chunk.Entry<\/em>, kt\u00f3ry zawiera jedn\u0105 kombinacj\u0119 artyku\u0142\u2013organizacja, dla kt\u00f3rej zosta\u0142y wykryte instancje referencyjne. Metoda <em data-start=\"1502\" data-end=\"1510\">usedBy<\/em> zwraca 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<p class=\"\" data-start=\"1625\" data-end=\"2196\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Dane artyku\u0142u dostawcy stanowi\u0105 przypadek szczeg\u00f3lny. W danych zakupowych artyku\u0142u mo\u017cna okre\u015bli\u0107, czy zakupy mog\u0105 by\u0107 realizowane tylko u przypisanych dostawc\u00f3w. W takim przypadku dla niekt\u00f3rych BO nale\u017cy zachowa\u0107 nie tylko dane zakupowe, ale r\u00f3wnie\u017c specjalne dane artyku\u0142u dostawcy. Klucz w tym przypadku sk\u0142ada si\u0119 z artyku\u0142u, organizacji i dostawcy. Aby to uwzgl\u0119dni\u0107, w obiekcie <em data-start=\"2021\" data-end=\"2034\">Chunk.Entry<\/em> przechowywany jest atrybut <em data-start=\"2062\" data-end=\"2074\">partnerKey<\/em>. W przypadku standardowym zawiera on <em data-start=\"2112\" data-end=\"2122\">ZEROGUID<\/em>, natomiast w przypadku danych artyku\u0142u dostawcy \u2013 identyfikator dostawcy.<\/div><\/section><\/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>Je\u015bli kombinacja kluczy przesz\u0142a pomy\u015blnie wszystkie testy, odpowiednie dane musz\u0105 zosta\u0107 fizycznie usuni\u0119te. Wymaga to rejestracji powi\u0105zanych obiekt\u00f3w biznesowych. W typowym przypadku rejestracja na potrzeby reorganizacji artyku\u0142\u00f3w obejmuje obiekt biznesowy odpowiadaj\u0105cy za u\u017cycie (np. <em>InventoryItem <\/em>dla logistyki magazynowej) oraz dodatkowe obiekty zale\u017cne (<em data-start=\"366\" data-end=\"378\">Dependents<\/em>).<\/p>\n<p class=\"\" data-start=\"0\" data-end=\"85\">Dla ka\u017cdej formy u\u017cycia istnieje metoda rejestracji w klasie <em>ItemUsageRegistry<\/em>.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><code>registerDeletionSales(new ItemClassDeletion(com.cisag.app.sales.obj.SalesItem.class));<\/code><\/p>\n<p>G\u0142\u00f3wny obiekt dla u\u017cycia <em>Sales<\/em> jest zarejestrowany do usuni\u0119cia.<\/div><\/section>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">registerDeletionInventory(new ItemClassDeletion(com.cisag.app.inventory.obj.ItemStorageData.class));<\/p>\n<p>Rejestrowany jest obiekt zale\u017cny (<em data-start=\"55\" data-end=\"66\">Dependent<\/em>) \u2014 <em>ItemStorageData<\/em>, kt\u00f3ry musi zosta\u0107 usuni\u0119ty razem z danymi, gdy usuwane jest u\u017cycie logistyki magazynowej.<\/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 <em>getDeletionClass<\/em>, <em>delete<\/em> i <em>deleteExpiredVersions<\/em>.<\/p>\n<p>Metoda <em>getDeletionClass<\/em> zwraca klas\u0119 zarejestrowan\u0105 do usuni\u0119cia <em>deletionClass<\/em> zarejestrowan\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 <em>deleteExpiredVersions<\/em> jest 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 <em>true<\/em>.<\/p>\n<p>Metoda <em>delete<\/em> usuwa wszystkie wersje dla BO zale\u017cnych od czasu. Informacja o tym, dla kt\u00f3rych kombinacji artyku\u0142\u2013organizacja dane maj\u0105 zosta\u0107 usuni\u0119te, pobierana jest za pomoc\u0105 metody <em>retrieveFreeCombinations <\/em>z obiektu typu <em>Chunk<\/em>.<\/p>\n<p>Przyk\u0142adem mo\u017ce by\u0107 klasa <em>com.cisag.app.general.item.reorg.ItemClassDeletion,<\/em> kt\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-9252","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\/9252","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=9252"}],"version-history":[{"count":6,"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/ht_kb\/9252\/revisions"}],"predecessor-version":[{"id":29216,"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/ht_kb\/9252\/revisions\/29216"}],"wp:attachment":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/media?parent=9252"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}