Skip to content

Commit 95faa9a

Browse files
committed
Import series: assign a group during seller creation.
Fix #857
1 parent 777e3ea commit 95faa9a

25 files changed

+168
-8
lines changed

src/main/java/ru/mystamps/web/config/ControllersConfig.java

+1
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ public SeriesImportController getSeriesImportController() {
119119
servicesConfig.getSeriesSalesService(),
120120
servicesConfig.getSeriesSalesImportService(),
121121
getSeriesController(),
122+
servicesConfig.getTransactionParticipantService(),
122123
eventPublisher
123124
);
124125
}

src/main/java/ru/mystamps/web/controller/SeriesImportController.java

+13
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import java.io.IOException;
2121
import java.util.Date;
22+
import java.util.List;
2223
import java.util.Locale;
2324

2425
import javax.servlet.http.HttpServletRequest;
@@ -46,12 +47,14 @@
4647
import ru.mystamps.web.controller.dto.RequestImportForm;
4748
import ru.mystamps.web.controller.editor.ExpandCatalogNumbersEditor;
4849
import ru.mystamps.web.controller.event.ImportRequestCreated;
50+
import ru.mystamps.web.dao.dto.EntityWithIdDto;
4951
import ru.mystamps.web.dao.dto.ImportRequestDto;
5052
import ru.mystamps.web.dao.dto.SeriesParsedDataDto;
5153
import ru.mystamps.web.dao.dto.SeriesSaleParsedDataDto;
5254
import ru.mystamps.web.service.SeriesImportService;
5355
import ru.mystamps.web.service.SeriesSalesImportService;
5456
import ru.mystamps.web.service.SeriesSalesService;
57+
import ru.mystamps.web.service.TransactionParticipantService;
5558
import ru.mystamps.web.util.CatalogUtils;
5659
import ru.mystamps.web.util.LocaleUtils;
5760

@@ -65,6 +68,7 @@ public class SeriesImportController {
6568
private final SeriesSalesService seriesSalesService;
6669
private final SeriesSalesImportService seriesSalesImportService;
6770
private final SeriesController seriesController;
71+
private final TransactionParticipantService participantService;
6872
private final ApplicationEventPublisher eventPublisher;
6973

7074
@InitBinder("requestImportForm")
@@ -154,12 +158,17 @@ public String showRequestAndImportSeriesForm(
154158
ImportSellerForm sellerForm = new ImportSellerForm();
155159
sellerForm.setName(seriesSale.getSellerName());
156160
sellerForm.setUrl(seriesSale.getSellerUrl());
161+
sellerForm.setGroupId(seriesSale.getSellerGroupId());
157162

158163
form.setSeller(sellerForm);
159164
form.setSeriesSale(seriesSaleForm);
160165

161166
if (seriesSale.getSellerId() != null) {
162167
seriesController.addSellersToModel(model);
168+
} else {
169+
// required for displaying seller group
170+
List<EntityWithIdDto> groups = participantService.findAllGroups();
171+
model.addAttribute("groups", groups);
163172
}
164173
}
165174

@@ -214,6 +223,10 @@ public String processImportSeriesForm(
214223
ImportSeriesSalesForm seriesSaleForm = form.getSeriesSale();
215224
if (seriesSaleForm != null) {
216225
seriesController.addSellersToModel(model);
226+
227+
// required for displaying seller group
228+
List<EntityWithIdDto> groups = participantService.findAllGroups();
229+
model.addAttribute("groups", groups);
217230
}
218231

219232
if (result.hasErrors()) {

src/main/java/ru/mystamps/web/controller/dto/ImportSellerForm.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,9 @@ public class ImportSellerForm implements AddParticipantDto {
3636
// @todo #695 /series/import/request/{id}(seller.url): add validation against long values
3737
private String url;
3838

39-
@Override
40-
public Integer getGroupId() {
41-
return null;
42-
}
39+
// @todo #857 /series/import/request/{id}(seller.group): add validation against negative values
40+
// @todo #857 /series/import/request/{id}(seller.group): add validation for existing group
41+
private Integer groupId;
4342

4443
@Override
4544
public Boolean getBuyer() {

src/main/java/ru/mystamps/web/dao/TransactionParticipantDao.java

+1
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,5 @@ public interface TransactionParticipantDao {
2929
List<EntityWithParentDto> findSellersWithParents();
3030
Integer findSellerId(String name, String url);
3131
List<EntityWithIdDto> findAllGroups();
32+
Integer findGroupIdByName(String name);
3233
}

src/main/java/ru/mystamps/web/dao/dto/SeriesSaleParsedDataDto.java

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
@RequiredArgsConstructor
2727
public class SeriesSaleParsedDataDto {
2828
private final Integer sellerId;
29+
private final Integer sellerGroupId;
2930
private final String sellerName;
3031
private final String sellerUrl;
3132
private final BigDecimal price;

src/main/java/ru/mystamps/web/dao/dto/SeriesSalesParsedDataDbDto.java

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
@ToString(exclude = { "createdAt", "updatedAt" })
3030
public class SeriesSalesParsedDataDbDto {
3131
private Integer sellerId;
32+
private Integer sellerGroupId;
3233
private String sellerName;
3334
private String sellerUrl;
3435
private BigDecimal price;

src/main/java/ru/mystamps/web/dao/impl/JdbcSeriesSalesImportDao.java

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public void addParsedData(Integer requestId, SeriesSalesParsedDataDbDto data) {
5252
Map<String, Object> params = new HashMap<>();
5353
params.put("request_id", requestId);
5454
params.put("seller_id", data.getSellerId());
55+
params.put("seller_group_id", data.getSellerGroupId());
5556
params.put("seller_name", data.getSellerName());
5657
params.put("seller_url", data.getSellerUrl());
5758
params.put("price", data.getPrice());

src/main/java/ru/mystamps/web/dao/impl/JdbcTransactionParticipantDao.java

+18
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818
package ru.mystamps.web.dao.impl;
1919

20+
import java.util.Collections;
2021
import java.util.HashMap;
2122
import java.util.List;
2223
import java.util.Map;
@@ -57,6 +58,9 @@ public class JdbcTransactionParticipantDao implements TransactionParticipantDao
5758
@Value("${transaction_participant_group.find_all}")
5859
private String findAllGroupsSql;
5960

61+
@Value("${transaction_participant_group.find_id_by_name}")
62+
private String findGroupIdByNameSql;
63+
6064
@Override
6165
public Integer add(AddParticipantDbDto participant) {
6266
Map<String, Object> params = new HashMap<>();
@@ -117,4 +121,18 @@ public List<EntityWithIdDto> findAllGroups() {
117121
return jdbcTemplate.query(findAllGroupsSql, RowMappers::forEntityWithIdDto);
118122
}
119123

124+
@Override
125+
public Integer findGroupIdByName(String name) {
126+
try {
127+
return jdbcTemplate.queryForObject(
128+
findGroupIdByNameSql,
129+
Collections.singletonMap("name", name),
130+
Integer.class
131+
);
132+
133+
} catch (EmptyResultDataAccessException ignored) {
134+
return null;
135+
}
136+
}
137+
120138
}

src/main/java/ru/mystamps/web/dao/impl/RowMappers.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -363,12 +363,20 @@ public static SeriesSaleParsedDataDto forSeriesSaleParsedDataDto(ResultSet rs, i
363363
throws SQLException {
364364

365365
Integer sellerId = JdbcUtils.getInteger(rs, "seller_id");
366+
Integer sellerGroupId = JdbcUtils.getInteger(rs, "seller_group_id");
366367
String sellerName = rs.getString("seller_name");
367368
String sellerUrl = rs.getString("seller_url");
368369
BigDecimal price = rs.getBigDecimal("price");
369370
Currency currency = JdbcUtils.getCurrency(rs, "currency");
370371

371-
return new SeriesSaleParsedDataDto(sellerId, sellerName, sellerUrl, price, currency);
372+
return new SeriesSaleParsedDataDto(
373+
sellerId,
374+
sellerGroupId,
375+
sellerName,
376+
sellerUrl,
377+
price,
378+
currency
379+
);
372380
}
373381

374382
public static ImportRequestInfo forImportRequestInfo(ResultSet rs, int unused)

src/main/java/ru/mystamps/web/service/SeriesImportServiceImpl.java

+2
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,12 @@ public void saveParsedData(Integer requestId, RawParsedDataDto data) {
216216
seriesParsedData.setMichelNumbers(shortenedNumbers);
217217
}
218218

219+
// @todo #857 SeriesImportServiceImpl.saveParsedData(): add unit test for seller group
219220
SeriesSalesParsedDataDbDto seriesSalesParsedData = new SeriesSalesParsedDataDbDto();
220221
seriesSalesParsedData.setCreatedAt(now);
221222
seriesSalesParsedData.setUpdatedAt(now);
222223
seriesSalesParsedData.setSellerId(seriesInfo.getSellerId());
224+
seriesSalesParsedData.setSellerGroupId(seriesInfo.getSellerGroupId());
223225
seriesSalesParsedData.setSellerName(seriesInfo.getSellerName());
224226
seriesSalesParsedData.setSellerUrl(seriesInfo.getSellerUrl());
225227
seriesSalesParsedData.setPrice(seriesInfo.getPrice());

src/main/java/ru/mystamps/web/service/SeriesInfoExtractorServiceImpl.java

+29
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
package ru.mystamps.web.service;
1919

2020
import java.math.BigDecimal;
21+
import java.net.MalformedURLException;
22+
import java.net.URL;
2123
import java.util.Arrays;
2224
import java.util.Collections;
2325
import java.util.LinkedHashSet;
@@ -88,6 +90,7 @@ public SeriesExtractedInfo extract(RawParsedDataDto data) {
8890
Boolean perforated = extractPerforated(data.getPerforated());
8991
Set<String> michelNumbers = extractMichelNumbers(data.getMichelNumbers());
9092
Integer sellerId = extractSeller(data.getSellerName(), data.getSellerUrl());
93+
Integer sellerGroupId = extractSellerGroup(sellerId, data.getSellerUrl());
9194
String sellerName = extractSellerName(sellerId, data.getSellerName());
9295
String sellerUrl = extractSellerUrl(sellerId, data.getSellerUrl());
9396
BigDecimal price = extractPrice(data.getPrice());
@@ -101,6 +104,7 @@ public SeriesExtractedInfo extract(RawParsedDataDto data) {
101104
perforated,
102105
michelNumbers,
103106
sellerId,
107+
sellerGroupId,
104108
sellerName,
105109
sellerUrl,
106110
price,
@@ -311,6 +315,31 @@ public Integer extractSeller(String name, String url) {
311315
return null;
312316
}
313317

318+
// @todo #857 SeriesInfoExtractorServiceImpl.extractSellerGroup(): add unit tests
319+
public Integer extractSellerGroup(Integer id, String sellerUrl) {
320+
// we need a group ony for a new seller (id == null)
321+
if (id != null) {
322+
return null;
323+
}
324+
325+
log.debug("Determining seller group by seller url '{}'", sellerUrl);
326+
327+
try {
328+
String name = new URL(sellerUrl).getHost();
329+
log.debug("Determining seller group: looking for a group named '{}'", name);
330+
331+
Integer groupId = transactionParticipantService.findGroupIdByName(name);
332+
if (groupId != null) {
333+
log.debug("Found seller group: #{}", groupId);
334+
}
335+
return groupId;
336+
337+
} catch (MalformedURLException ex) {
338+
log.debug("Could not extract seller group: {}", ex.getMessage());
339+
return null;
340+
}
341+
}
342+
314343
// @todo #695 SeriesInfoExtractorServiceImpl.extractSellerName(): add unit tests
315344
protected String extractSellerName(Integer id, String name) {
316345
if (id != null) {

src/main/java/ru/mystamps/web/service/TransactionParticipantService.java

+1
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,5 @@ public interface TransactionParticipantService {
2929
List<EntityWithParentDto> findSellersWithParents();
3030
Integer findSellerId(String name, String url);
3131
List<EntityWithIdDto> findAllGroups();
32+
Integer findGroupIdByName(String name);
3233
}

src/main/java/ru/mystamps/web/service/TransactionParticipantServiceImpl.java

+10
Original file line numberDiff line numberDiff line change
@@ -96,4 +96,14 @@ public List<EntityWithIdDto> findAllGroups() {
9696
return transactionParticipantDao.findAllGroups();
9797
}
9898

99+
// @todo #857 TransactionParticipantServiceImpl.findGroupIdByName(): add unit tests
100+
// @todo #857 TransactionParticipantServiceImpl.findGroupIdByName(): move to a separate service
101+
@Override
102+
@Transactional(readOnly = true)
103+
public Integer findGroupIdByName(String name) {
104+
Validate.isTrue(StringUtils.isNotBlank(name), "Group name must be non-blank");
105+
106+
return transactionParticipantDao.findGroupIdByName(name);
107+
}
108+
99109
}

src/main/java/ru/mystamps/web/service/dto/SeriesExtractedInfo.java

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public class SeriesExtractedInfo {
3434
private final Boolean perforated;
3535
private final Set<String> michelNumbers;
3636
private final Integer sellerId;
37+
private final Integer sellerGroupId;
3738
private final String sellerName;
3839
private final String sellerUrl;
3940
private final BigDecimal price;

src/main/resources/liquibase/version/0.4.xml

+1
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,6 @@
5353
<include file="0.4/2018-06-15--add_price_to_collections_series.xml" relativeToChangelogFile="true" />
5454
<include file="0.4/2018-06-18--test_paid_user.xml" relativeToChangelogFile="true" />
5555
<include file="0.4/2018-07-05--series_import_parsed_data_michel_numbers_field.xml" relativeToChangelogFile="true" />
56+
<include file="0.4/2018-07-15--series_import_parsed_data_group_id_field.xml" relativeToChangelogFile="true" />
5657

5758
</databaseChangeLog>

src/main/resources/liquibase/version/0.4/2017-11-15--group_participants.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
<changeSet id="add-movies-characters-participant-group" author="php-coder" context="test-data">
4444

4545
<insert tableName="transaction_participant_groups">
46-
<column name="name" value="Movies characters" />
46+
<column name="name" value="example.com" />
4747
<column name="created_at" valueComputed="${NOW}" />
4848
<column name="created_by" valueComputed="(SELECT id FROM users WHERE role = 'ADMIN' ORDER by id LIMIT 1)" />
4949
<column name="updated_at" valueComputed="${NOW}" />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<databaseChangeLog
3+
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
6+
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
7+
8+
<changeSet id="add-seller_group_id-column-to-series_sales_import_parsed_data-table" author="php-coder" context="scheme">
9+
10+
<addColumn tableName="series_sales_import_parsed_data">
11+
<column name="seller_group_id"
12+
type="INTEGER"
13+
beforeColumn="seller_name">
14+
15+
<constraints references="transaction_participant_groups(id)"
16+
foreignKeyName="fk_series_sales_import_parsed_data_seller_group_id" />
17+
</column>
18+
</addColumn>
19+
20+
</changeSet>
21+
22+
</databaseChangeLog>

src/main/resources/ru/mystamps/i18n/Messages.properties

+1
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ t_gathered_data = Gathered data
216216
t_import = Import
217217
t_seller_url = Seller URL
218218
t_seller_name = Seller name
219+
t_seller_group = Seller group
219220

220221
# series/import/list.html
221222
t_no_import_requests = No import requests

src/main/resources/ru/mystamps/i18n/Messages_ru.properties

+1
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ t_gathered_data = Собранные данные
215215
t_import = Импортировать
216216
t_seller_url = Страница продавца
217217
t_seller_name = Имя продавца
218+
t_seller_group = Группа продавца
218219

219220
# series/import/list.html
220221
t_no_import_requests = Нет запросов на импорт

src/main/resources/sql/series_import_request_dao_queries.properties

+3
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ INSERT \
147147
INTO series_sales_import_parsed_data \
148148
( request_id \
149149
, seller_id \
150+
, seller_group_id \
150151
, seller_url \
151152
, seller_name \
152153
, price \
@@ -157,6 +158,7 @@ INSERT \
157158
VALUES \
158159
( :request_id \
159160
, :seller_id \
161+
, :seller_group_id \
160162
, :seller_url \
161163
, :seller_name \
162164
, :price \
@@ -167,6 +169,7 @@ VALUES \
167169

168170
series_import_requests.find_series_sale_parsed_data_by_request_id = \
169171
SELECT seller_id \
172+
, seller_group_id \
170173
, seller_url \
171174
, seller_name \
172175
, price \

src/main/resources/sql/transaction_participants_dao_queries.properties

+5
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,8 @@ transaction_participant_group.find_all = \
4747
, name \
4848
FROM transaction_participant_groups \
4949
ORDER BY name
50+
51+
transaction_participant_group.find_id_by_name = \
52+
SELECT id \
53+
FROM transaction_participant_groups \
54+
WHERE name = :name

src/main/webapp/WEB-INF/views/series/import/info.html

+30
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,36 @@ <h3 th:text="#{t_gathered_data}">
351351
</tr>
352352
/*/-->
353353

354+
<tr th:if="${hasSellerInfo and importSeriesForm.seller.groupId != null}" th:classappend="${#fields.hasErrors('seller.groupId') ? 'has-error' : ''}">
355+
<th>
356+
<label for="seller-group" class="control-label" th:text="#{t_seller_group}">
357+
Seller group
358+
</label>
359+
</th>
360+
<td>
361+
<select id="seller-group" class="form-control" th:field="*{seller.groupId}" th:disabled="${disabled}">
362+
<option value="" th:text="#{t_not_chosen}">Not chosen</option>
363+
<!--/*/
364+
<option th:each="group : ${groups}"
365+
th:value="${group.id}"
366+
th:text="${group.name}"
367+
th:selected="${importSeriesForm.seller.groupId == group.id}">
368+
</option>
369+
/*/-->
370+
<!--/*-->
371+
<option value="1" selected="selected">example.com</option>
372+
<!--*/-->
373+
</select>
374+
<!--/*/
375+
<span id="seller-group.errors"
376+
class="help-block"
377+
th:if="${#fields.hasErrors('seller.groupId')}"
378+
th:each="error : ${#fields.errors('seller.groupId')}"
379+
th:text="${error}"></span>
380+
/*/-->
381+
</td>
382+
</tr>
383+
354384
<tr th:if="${hasSellerInfo and importSeriesForm.seller.name != null}" th:classappend="${#fields.hasErrors('seller.name') ? 'has-error' : ''}">
355385
<th>
356386
<label for="seller-name" class="control-label" th:text="#{t_seller_name}">

0 commit comments

Comments
 (0)