Definicja Hook Contract: Wyszukaj i dodaj pozycje

Wprowadzenie

Za pomocą definicji hook contract: Wyszukaj i dodaj pozycje można wpływać na funkcjonalność Wyszukaj i dodaj pozycje poprzez implementację hooka. Dotyczy poniższych aplikacji:

  • Zapytania ofertowe zakupu
  • Oferty zakupu
  • Zamówienia zakupu
  • Dokumenty szybkiej rejestracji sprzedaży
  • Zapytania ofertowe sprzedaży
  • Oferty sprzedaży
  • Zamówienia sprzedaży
  • Zlecenia dystrybucji

W ramach następujących funkcjonalności oferowane są hooki:

  • nowe źródło z konwersją z dokumentu źródłowego na dokument docelowy w jednej z wymienionych aplikacji. Opcjonalnie można zapewnić ustawienia do wyszukiwania danych źródłowych i/lub do konwersji.

Standardowa funkcjonalność jest również konwertowana do odpowiednich implementacji hooków i dlatego może być używana jako przykład.

  • kopiowanie własnych atrybutów. Opcjonalnie można podać ustawienia do konwersji własnych atrybutów.

W tej artykule opisano, jakie rozszerzenia można wprowadzić za pomocą definicji hook contract oraz jakie ograniczenia należy wziąć pod uwagę.

Szczegółowe informacje na temat metod zadeklarowanych w interfejsach można znaleźć w powiązanych klasach Java.

Informacje na temat infrastruktury hooków można znaleźć w artykule Hook Contracts.

Grupa docelowa

  • Deweloperzy

Opis

W pierwszym podrozdziale, na przykładzie Oferta sprzedaży → Zamówienie sprzedaży opisano, w jaki sposób za pomocą implementacji hooka można rozszerzyć istniejącą konwersję Wyszukaj i dodaj pozycje o kopiowanie własnych atrybutów. Opcjonalnie można również wprowadzić ustawienia konwersji dla tych atrybutów.

W kolejnym podrozdziale opisano, w jaki sposób można dodać własne źródło lub własną konwersję w aplikacji, która udostępnia odpowiedni hook.

Rozszerzanie istniejącej konwersji

Wszystkie dostępne w standardzie konwersje Wyszukaj i dodaj pozycje mogą zostać rozszerzone za pomocą implementacji hooka o kopiowanie własnych atrybutów.

Poniższa tabela zawiera dla każdego dokumentu docelowego odpowiedni hook contract oraz listę dokumentów źródłowych dostępnych w standardzie, dla których istnieje własny interfejs hooka umożliwiający rozszerzenie konwersji:

Zakup

Dokument docelowy  Hook Contract Dokumenty źródłowe
Zapytanie ofertowe zakupu com.cisag.app.purchasing.request.ui.insertdetail.ConverterExtension Zapytanie ofertowe zakupu,
Oferta zakupu, Zamówienie zakupu, Oferta sprzedaży, Zamówienie sprzedaży
Oferta zakupu com.cisag.app.purchasing.proposal.ui.insertdetail.ConverterExtension Zapytanie ofertowe zakupu,
Oferta zakupu, Zamówienie zakupu, Oferta sprzedaży, Zamówienie sprzedaży
Zamówienie zakupu com.cisag.app.purchasing.proposal.ui.insertdetail.ConverterExtension Zapytanie ofertowe zakupu,
Oferta zakupu, Zamówienie zakupu, Oferta sprzedaży, Zamówienie sprzedaży

Sprzedaż

Dokument docelowy  Hook Contract Dokumenty źródłowe 
Dokument szybkiego wprowadzania com.cisag.app.sales.rapid.ui.insertdetail.ConverterExtension Dokumenty szybkiej rejestracji,
Zapytanie ofertowe sprzedaży,
Oferta sprzedaży, Zamówienia sprzedaży,
Faktura sprzedaży
Zapytanie ofertowe sprzedaży com.cisag.app.sales.request.ui.insertdetail.ConverterExtension Dokumenty szybkiej rejestracji,
Zapytanie ofertowe sprzedaży,
Oferta sprzedaży, Zamówienia sprzedaży
Oferta sprzedaży com.cisag.app.sales.proposal.ui.insertdetail.ConverterExtension Dokumenty szybkiej rejestracji,
Zapytanie ofertowe sprzedaży,
Oferta sprzedaży, Zamówienia sprzedaży,
Faktura sprzedaży
Zamówienia sprzedaży com.cisag.app.sales.order.ui.insertdetail.ConverterExtension Dokumenty szybkiej rejestracji,
Zapytanie ofertowe sprzedaży,
Oferta sprzedaży, Zamówienia sprzedaży,
Faktura sprzedaży
Zlecenie dystrybucji com.cisag.app.multiorg.order.ui.insertdetail.ConverterExtension Zlecenie dystrybucji, Faktura sprzedaży

Konkretne rozszerzenie zostanie wyjaśnione na przykładzie Oferta sprzedaży → Zamówienie sprzedaży.

Prosta implementacja hooka do bezwarunkowego, dodatkowego kopiowania atrybutu ado_orders_partner mogłaby wyglądać następująco:

XML:

<?xml version=”1.0″ encoding=”UTF-16″?>
<HookContract xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:noNamespaceSchemaLocation=”HookXMLSchema.xsd”>

<!– Don’t change this line and the lines above! –>

<HOOK_IMPLEMENTATION>

<contract>com.cisag.app.sales.order.ui.insertdetail.ConverterExtension</contract>
<!– extension: sales proposal detail ==> sales order detail  –>

<hook>

<interface>com.cisag.app.sales.order.ui.insertdetail.hook.SalesProposalConverterExtensionHook</interface>
<implementation>com.ado.ext.app.orders.sales.order.ui.insertdetail.SalesProposalConverterExtensionHookImpl</implementation>
</hook>

</HOOK_IMPLEMENTATION>
</HookContract>

Java:

…

/** … */

public class SalesProposalConverterExtensionHookImpl implements SalesProposalConverterExtensionHook {

    /** {@inheritDoc} */

@Override

public void convertSalesProposalDetail(CustomerProposalDetailView srcDetailView,

SalesProposalConverterExtensionHook.Context detailConversionContext,

TargetSource<SalesOrderDetailView> trgSource) {

trgSource.setValue(SalesOrderDetailView.Attribute.$ado_orders_partner,

srcDetailView.getAdo_orders_partner());

}

}

W razie potrzeby setValue może być warunkowane przy użyciu danych źródłowych lub kontekstu dokumentu docelowego.
Jeśli niestandardowe ustawienia mają być również obsługiwane, wymagane jest dalsze kodowanie - np:

…

/** … */

public class SalesProposalConverterExtensionHookImpl … {

…

    /** {@inheritDoc} */

@Override

public ConverterPropertiesExtensionImpl createConverterPropertiesExtension() {

return new ConverterPropertiesExtensionImpl();

}




private static class ConverterPropertiesExtensionImpl implements

ConverterPropertiesExtension<SalesOrderView> {

private static final String MSG_PATH = ConverterPropertiesExtensionImpl.class.getName();




private static final int MSG_ONE = 1;

private static final int MSG_TWO = 2;




private final TextField fieldOne = new TextField(Guid.AUTOGUID, …);

private final TextField fieldTwo = new TextField(Guid.AUTOGUID, …);




private ConverterPropertiesExtensionImpl() {

fieldOne.registerMessage(MSG_PATH, MSG_ONE);

fieldTwo.registerMessage(MSG_PATH, MSG_TWO);

}




        /** {@inheritDoc} */

@Override

public List<VisualElement> getVisualElements() {

return Arrays.<VisualElement> asList(fieldOne, fieldTwo);

}




        /** {@inheritDoc} */

@Override

public void init(SalesOrderView header) {

fieldOne.setValue(…);

fieldTwo.setValue(…);

}




        /** {@inheritDoc} */

@Override

public void validate() {

CisMessageManager mm = CisEnvironment.getInstance().getMessageManager();

mm.pushProgramMessagePath(MSG_PATH);

try {

if (fieldOne.getValue().trim().isEmpty()) {

mm.setProgramMessageId(MSG_ONE);

mm.sendMessage(…);

}

if (fieldTwo.getValue().trim().isEmpty()) {

mm.setProgramMessageId(MSG_TWO);

mm.sendMessage(…);

}

} finally {

mm.popProgramMessagePath();

}

}




}

…

}
Uwaga
W szczególności wzorzec obsługi komunikatów ze ścieżką komunikatu powinien być używany jako wzorzec.

Jeśli istnieją więcej niż cztery ustawienia konwersji, automatycznie używana jest półka (shelf) dla ustawień konwersji.

Istniejące standardowe atrybuty nie mogą być kopiowane przy użyciu hooka ConverterExtension; nie mogą one również wpływać na zachowanie kopiowania w standardzie – w razie potrzeby należy użyć własnej implementacji hook konwertera i przypisać unikalną nazwę w celu ich rozróżnienia.

Dokument źródłowy i hook do konwersji

Dokument źródłowy

Funkcja Wyszukaj i dodaj pozycje opiera się przede wszystkim na udostępnieniu jednego lub kilku źródeł, które spełniają interfejs Source w przestrzeni nazw com.cisag.app.general.order.ui.insertdetail.hook.
Opcjonalnie źródło może dostarczać ustawienia wyboru za pośrednictwem SourcePropertiesRetriever (np. Kopiuj ceny ogranicza wybór zgodnie z walutą w dokumencie docelowym) – są one następnie dostępne w menu Wykonaj wyszukiwania.
Opcjonalnie można zapewnić działania w celu wstępnego przypisania pól wyszukiwania za pośrednictwem SourceActionsRetriever (np. szablon zamówienia w zamówieniu sprzedaży).
Standardowo dostępne są następujące implementacje źródeł:
Zakup:

Dokument źródłowy  Implementacja źródła Uwagi
Zapytanie ofertowe zakupu com.cisag.app.purchasing.request.ui.insertdetail.PurchaseRequestSource
Oferta zakupu com.cisag.app.purchasing.proposal.ui.insertdetail.PurchaseProposalSource Przykład ustawienia Kopiuj ceny
Zamówienie zakupu com.cisag.app.purchasing.order.ui.insertdetail.PurchaseOrderSource Przykład ustawienia Kopiuj ceny oraz akcji

Sprzedaż:

Dokument źródłowy  Implementacja źródła Uwagi
Dokument szybkiego wprowadzania  com.cisag.app.sales.rapid.ui.insertdetail.SalesRapidSource Przykład ustawienia Kopiuj ceny
Zapytanie ofertowe sprzedaży com.cisag.app.sales.request.ui.insertdetail.SalesRequestSource
Oferta sprzedaży  com.cisag.app.sales.proposal.ui.insertdetail.SalesProposalSource Przykład ustawienia Kopiuj ceny
Zamówienie sprzedaży com.cisag.app.sales.order.ui.insertdetail.SalesOrderSource Przykład ustawienia Kopiuj ceny oraz akcji
Zlecenie dystrybucji com.cisag.app.multiorg.order.ui.insertdetail.DistributionOrderSource Przykład ustawienia Kopiuj ceny oraz akcji
Hook do konwersji

Każda z opisanych tutaj standardowych aplikacji dokumentów udostępnia kontrakt hooka, który zawiera dwa następujące interfejsy hooka:

  • cisag.app.general.order.ui.insertdetail.hook.ConverterHook

  • cisag.app.general.order.ui.insertdetail.hook.ConverterSupportIndicatorHook

Poniższa tabela zawiera dla każdego dokumentu docelowego odpowiedni hook kontrakt:

Zakup

Dokument docelowy  Hook Contract
Zapytanie ofertowe zakupu com.cisag.app.purchasing.request.ui.insertdetail.Converter
Oferta zakupu com.cisag.app.purchasing.proposal.ui.insertdetail.Converter
Zamówienie zakupu com.cisag.app.purchasing.proposal.ui.insertdetail.Converter

Sprzedaż

Dokument docelowy Hook Contract
Dokument szybkiego wprowadzania com.cisag.app.sales.rapid.ui.insertdetail.Converter
Zapytanie ofertowe sprzedaży com.cisag.app.sales.request.ui.insertdetail.Converter
Oferta sprzedaży com.cisag.app.sales.proposal.ui.insertdetail.Converter
Zamówienie sprzedaży com.cisag.app.sales.order.ui.insertdetail.Converter
Zlecenie dystrybucji com.cisag.app.multiorg.order.ui.insertdetail.Converter

W standardzie dla każdego hook contract istnieje dokładnie jedna implementacja hook contract, która zawiera implementację ConverterHook dla wszystkich obsługiwanych dokumentów źródłowych (np. dla zamówienia sprzedaży: com.cisag.app.sales.order.ui.insertdetail.ConverterImpl).

Zazwyczaj sama implementacja interfejsu ConverterHook jest wystarczająca.

ConverterSupportIndicatorHook może być opcjonalnie użyty do wykluczenia źródła w dokumencie docelowym w określonych warunkach – przykładem może być implementacja dla zlecenia dystrybucji.

Implementacje standardowe mogą służyć jako wzór do tworzenia własnych implementacji ConverterHook.

Uwaga
Ponieważ zazwyczaj własny hook nie wymaga ConverterExtension, kod można odpowiednio uprościć.

Czy ten artykuł był pomocny?