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
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(); } } } … }
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.