use of com.axelor.db.mapper.Mapper in project axelor-open-suite by axelor.
the class ValidatorService method validateImportRequiredField.
private void validateImportRequiredField(int line, Class<?> model, String fieldName, FileField fileField, List<String> relationalFieldList) throws IOException, ClassNotFoundException {
Mapper mapper = advancedImportService.getMapper(model.getName());
String field = getField(fileField);
Integer rowNum = fileField.getIsMatchWithFile() ? line : null;
int importType = fileField.getImportType();
for (Property prop : mapper.getProperties()) {
if (prop.isRequired()) {
if (prop.getName().equals(fieldName) && importType == FileFieldRepository.IMPORT_TYPE_IGNORE_EMPTY) {
logService.addLog(IExceptionMessage.ADVANCED_IMPORT_LOG_5, field, rowNum);
} else if ((importType == FileFieldRepository.IMPORT_TYPE_FIND_NEW || importType == FileFieldRepository.IMPORT_TYPE_NEW) && field.contains(".") && !fileField.getTargetType().equals("MetaFile")) {
String newField = StringUtils.substringBeforeLast(field, ".");
newField = newField + "." + prop.getName();
if (!relationalFieldList.contains(newField)) {
logService.addLog(IExceptionMessage.ADVANCED_IMPORT_LOG_3, newField, null);
}
}
}
}
}
use of com.axelor.db.mapper.Mapper in project axelor-open-suite by axelor.
the class ValidatorService method validateData.
private void validateData(String[] dataRow, int line, boolean isConfig, FileTab fileTab) throws IOException, ClassNotFoundException {
Map<String, Object> map = isConfig ? fieldMap : titleMap;
for (int fieldIndex = 0; fieldIndex < fileTab.getFileFieldList().size(); fieldIndex++) {
FileField fileField = fileTab.getFileFieldList().get(fieldIndex);
if (!fileField.getIsMatchWithFile() || !Strings.isNullOrEmpty(fileField.getExpression())) {
continue;
}
Mapper mapper = null;
Property property = null;
String key = null;
if (isConfig) {
key = this.getField(fileField);
} else {
key = fileField.getColumnTitle();
}
int cellIndex = 0;
if (map.containsKey(key)) {
cellIndex = (int) map.get(key);
}
cellIndex = (!isConfig && !fileTab.getAdvancedImport().getIsHeader()) ? fieldIndex : cellIndex;
if (fileField.getImportField() != null) {
mapper = advancedImportService.getMapper(fileField.getImportField().getMetaModel().getFullName());
property = mapper.getProperty(fileField.getImportField().getName());
}
if (property != null && Strings.isNullOrEmpty(fileField.getSubImportField())) {
if (this.validateDataRequiredField(dataRow, cellIndex, line, Class.forName(fileTab.getMetaModel().getFullName()), property.getName(), fileField)) {
continue;
}
if (!Strings.isNullOrEmpty(property.getSelection()) && fileField.getForSelectUse() != FileFieldRepository.SELECT_USE_VALUES) {
continue;
}
this.validateDataType(dataRow, cellIndex, line, property.getJavaType().getSimpleName(), fileField);
} else if (!Strings.isNullOrEmpty(fileField.getSubImportField())) {
Property subProperty = this.getAndValidateSubField(line, property, fileField, true);
if (subProperty != null) {
if (this.validateDataRequiredField(dataRow, cellIndex, line, subProperty.getEntity(), subProperty.getName(), fileField)) {
continue;
}
if (!Strings.isNullOrEmpty(subProperty.getSelection()) && fileField.getForSelectUse() != FileFieldRepository.SELECT_USE_VALUES) {
continue;
}
this.validateDataType(dataRow, cellIndex, line, subProperty.getJavaType().getSimpleName(), fileField);
}
}
}
}
use of com.axelor.db.mapper.Mapper in project axelor-open-suite by axelor.
the class ProductStockRepository method save.
public Product save(Product product) {
WeightedAveragePriceService weightedAveragePriceService = Beans.get(WeightedAveragePriceService.class);
Set<MetaField> specificProductFieldSet = appBaseService.getAppBase().getCompanySpecificProductFieldsSet();
if (!specificProductFieldSet.isEmpty() && appBaseService.getAppBase().getEnableMultiCompany()) {
ArrayList<Company> productCompanyList = new ArrayList<>();
if (product.getProductCompanyList() != null) {
for (ProductCompany productCompany : product.getProductCompanyList()) {
productCompanyList.add(productCompany.getCompany());
}
}
Mapper mapper = Mapper.of(Product.class);
List<StockConfig> stockConfigList = Beans.get(StockConfigRepository.class).all().fetch();
for (StockConfig stockConfig : stockConfigList) {
if (stockConfig.getCompany() != null && !productCompanyList.contains(stockConfig.getCompany()) && stockConfig.getReceiptDefaultStockLocation() != null && (stockConfig.getCompany().getArchived() == null || !stockConfig.getCompany().getArchived())) {
ProductCompany productCompany = new ProductCompany();
for (MetaField specificField : specificProductFieldSet) {
mapper.set(productCompany, specificField.getName(), mapper.get(product, specificField.getName()));
}
// specific case for avgPrice per company
productCompany.setAvgPrice(weightedAveragePriceService.computeAvgPriceForCompany(product, stockConfig.getCompany()));
productCompany.setCompany(stockConfig.getCompany());
productCompany.setProduct(product);
product.addProductCompanyListItem(productCompany);
}
}
}
return super.save(product);
}
use of com.axelor.db.mapper.Mapper in project axelor-open-suite by axelor.
the class DuplicateObjectsService method concatFields.
/*
* get all records for duplicate records
*/
private String concatFields(Class<?> modelClass, Set<String> fieldSet) throws AxelorException {
StringBuilder fields = new StringBuilder("LOWER(concat(");
Mapper mapper = Mapper.of(modelClass);
int count = 0;
for (String field : fieldSet) {
Property property = mapper.getProperty(field);
if (property == null) {
throw new AxelorException(TraceBackRepository.CATEGORY_CONFIGURATION_ERROR, I18n.get(IExceptionMessage.GENERAL_8), field, modelClass.getSimpleName());
}
if (property.isCollection()) {
throw new AxelorException(TraceBackRepository.CATEGORY_CONFIGURATION_ERROR, I18n.get(IExceptionMessage.GENERAL_9), field);
}
if (count != 0) {
fields.append(",");
}
count++;
fields.append("cast(self" + "." + field);
if (property.getTarget() != null) {
fields.append(".id");
}
fields.append(" as string)");
}
fields.append("))");
return fields.toString();
}
use of com.axelor.db.mapper.Mapper in project axelor-open-suite by axelor.
the class DuplicateObjectsService method removeDuplicate.
@Transactional
public void removeDuplicate(List<Long> selectedIds, String modelName) {
List<Object> duplicateObjects = getDuplicateObject(selectedIds, modelName);
Object originalObjct = getOriginalObject(selectedIds, modelName);
List<MetaField> allField = metaFieldRepo.all().filter("(relationship = 'ManyToOne' AND typeName = ?1) OR (relationship = 'ManyToMany' AND (typeName = ?1 OR metaModel.name =?1))", modelName).fetch();
for (MetaField metaField : allField) {
if ("ManyToOne".equals(metaField.getRelationship())) {
Query update = JPA.em().createQuery("UPDATE " + metaField.getMetaModel().getFullName() + " self SET self." + metaField.getName() + " = :value WHERE self." + metaField.getName() + " in (:duplicates)");
update.setParameter("value", originalObjct);
update.setParameter("duplicates", duplicateObjects);
update.executeUpdate();
} else if ("ManyToMany".equals(metaField.getRelationship())) {
if (metaField.getTypeName().equals(modelName)) {
Query select = JPA.em().createQuery("select self from " + metaField.getMetaModel().getFullName() + " self LEFT JOIN self." + metaField.getName() + " as x WHERE x IN (:ids)");
select.setParameter("ids", duplicateObjects);
List<?> list = select.getResultList();
for (Object obj : list) {
Set<Object> items = (Set<Object>) Mapper.of(obj.getClass()).get(obj, metaField.getName());
for (Object dupObj : duplicateObjects) {
if (items.contains(dupObj)) {
items.remove(dupObj);
}
}
items.add(originalObjct);
}
}
Mapper mapper = Mapper.of(originalObjct.getClass());
Set<Object> existRelationalObjects = (Set<Object>) mapper.get(originalObjct, metaField.getName());
for (int i = 0; i < duplicateObjects.size(); i++) {
Set<Object> newRelationalObjects = (Set<Object>) mapper.get(duplicateObjects.get(i), metaField.getName());
if (newRelationalObjects != null) {
existRelationalObjects.addAll(newRelationalObjects);
mapper.set(duplicateObjects.get(i), metaField.getName(), new HashSet<>());
}
}
}
}
JPA.em().flush();
JPA.em().clear();
for (Object obj : getDuplicateObject(selectedIds, modelName)) {
JPA.em().remove(obj);
}
}
Aggregations