/
C_BPartner_Window_AreaSearchProcess.java
154 lines (133 loc) · 5.72 KB
/
C_BPartner_Window_AreaSearchProcess.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package de.metas.location.geocoding.process;
import java.math.BigDecimal;
import java.util.List;
import java.util.Set;
import org.adempiere.exceptions.AdempiereException;
import org.compiere.SpringContextHolder;
import org.compiere.model.I_C_BPartner_Location;
import org.compiere.model.I_C_Location;
/*
* #%L
* metasfresh-pharma
* %%
* Copyright (C) 2018 metas GmbH
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-2.0.html>.
* #L%
*/
import com.google.common.collect.ImmutableList;
import de.metas.bpartner.BPartnerId;
import de.metas.bpartner.BPartnerLocationId;
import de.metas.bpartner.service.BPartnerLocationInfoRepository;
import de.metas.bpartner.service.IBPartnerDAO;
import de.metas.i18n.ITranslatableString;
import de.metas.location.CountryId;
import de.metas.location.ICountryDAO;
import de.metas.location.ILocationDAO;
import de.metas.location.LocationId;
import de.metas.process.JavaProcess;
import de.metas.process.Param;
import de.metas.process.ProcessExecutionResult;
import de.metas.ui.web.document.filter.DocumentFilter;
import de.metas.ui.web.document.geo_location.GeoLocationDocumentService;
import de.metas.ui.web.document.geo_location.GeoLocationDocumentQuery;
import de.metas.ui.web.view.CreateViewRequest;
import de.metas.ui.web.view.IView;
import de.metas.ui.web.view.IViewsRepository;
import de.metas.ui.web.window.datatypes.LookupValue.IntegerLookupValue;
import de.metas.ui.web.window.datatypes.WindowId;
import de.metas.ui.web.window.descriptor.DocumentEntityDescriptor;
import de.metas.ui.web.window.model.DocumentCollection;
import de.metas.util.Services;
import lombok.NonNull;
public class C_BPartner_Window_AreaSearchProcess extends JavaProcess
{
private final IViewsRepository viewsRepo = SpringContextHolder.instance.getBean(IViewsRepository.class);
private final DocumentCollection documentCollection = SpringContextHolder.instance.getBean(DocumentCollection.class);
private final BPartnerLocationInfoRepository bpartnerLocationInfoRepo = SpringContextHolder.instance.getBean(BPartnerLocationInfoRepository.class);
private final GeoLocationDocumentService geoLocationDocumentService = SpringContextHolder.instance.getBean(GeoLocationDocumentService.class);
private final IBPartnerDAO bpartnersRepo = Services.get(IBPartnerDAO.class);
private final ICountryDAO countriesRepo = Services.get(ICountryDAO.class);
private final ILocationDAO locationsRepo = Services.get(ILocationDAO.class);
@Param(parameterName = "Distance", mandatory = true)
private BigDecimal distanceInKm;
@Param(parameterName = "VisitorsAddress")
private boolean visitorsAddress;
@Override
protected String doIt()
{
final I_C_Location location = getSelectedLocationOrFirstAvailable();
final DocumentFilter filter = createAreaSearchFilter(location);
final IView view = createViewWithFilter(filter);
getResult().setWebuiViewToOpen(
ProcessExecutionResult.WebuiViewToOpen.builder()
.viewId(view.getViewId().toJson())
.target(ProcessExecutionResult.ViewOpenTarget.NewBrowserTab)
.build());
return MSG_OK;
}
private IView createViewWithFilter(final DocumentFilter filter)
{
final WindowId windowId = getWindowId();
return viewsRepo.createView(CreateViewRequest.builder(windowId)
.setFilters(ImmutableList.of(filter))
.build());
}
@NonNull
private WindowId getWindowId()
{
return WindowId.of(getProcessInfo().getAdWindowId().getRepoId());
}
@NonNull
private DocumentFilter createAreaSearchFilter(final I_C_Location location)
{
final DocumentEntityDescriptor entityDescriptor = documentCollection.getDocumentEntityDescriptor(getWindowId());
final GeoLocationDocumentQuery query = createGeoLocationQuery(location);
return geoLocationDocumentService.createDocumentFilter(entityDescriptor, query);
}
private GeoLocationDocumentQuery createGeoLocationQuery(final I_C_Location location)
{
final CountryId countryId = CountryId.ofRepoId(location.getC_Country_ID());
final ITranslatableString countryName = countriesRepo.getCountryNameById(countryId);
return GeoLocationDocumentQuery.builder()
.country(IntegerLookupValue.of(countryId, countryName))
.address1(location.getAddress1())
.city(location.getCity())
.postal(location.getPostal())
.distanceInKm(distanceInKm)
.visitorsAddress(visitorsAddress)
.build();
}
private I_C_Location getSelectedLocationOrFirstAvailable()
{
final Set<Integer> bpLocationIds = getSelectedIncludedRecordIds(I_C_BPartner_Location.class);
if (!bpLocationIds.isEmpty())
{
// retrieve the selected location
final LocationId locationId = bpartnerLocationInfoRepo.getByBPartnerLocationId(BPartnerLocationId.ofRepoId(getRecord_ID(), bpLocationIds.iterator().next())).getLocationId();
return locationsRepo.getById(LocationId.ofRepoId(locationId.getRepoId()));
}
else
{
// retrieve the first bpartner location available
final List<I_C_BPartner_Location> partnerLocations = bpartnersRepo.retrieveBPartnerLocations(BPartnerId.ofRepoId(getRecord_ID()));
if (!partnerLocations.isEmpty())
{
return locationsRepo.getById(LocationId.ofRepoId(partnerLocations.get(0).getC_Location_ID()));
}
}
throw new AdempiereException("@NotFound@ @C_Location_ID@");
}
}