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.



