| Line 395... |
Line 395... |
| 395 |
boolean noGST = false;
|
395 |
boolean noGST = false;
|
| 396 |
int changedTotalBillAmount = 0;
|
396 |
int changedTotalBillAmount = 0;
|
| 397 |
for (CustomPaymentOption cpo : createOrderRequest.getPaymentOptions()) {
|
397 |
for (CustomPaymentOption cpo : createOrderRequest.getPaymentOptions()) {
|
| 398 |
changedTotalBillAmount += cpo.getAmount();
|
398 |
changedTotalBillAmount += cpo.getAmount();
|
| 399 |
}
|
399 |
}
|
| - |
|
400 |
|
| - |
|
401 |
// N+1 fix: Batch fetch all PendingOrderItems before the validation loop
|
| - |
|
402 |
List<Integer> validationPoiIds = createOrderRequest.getFofoOrderItems().stream()
|
| - |
|
403 |
.map(CustomFofoOrderItem::getPoiId)
|
| - |
|
404 |
.filter(id -> id > 0)
|
| - |
|
405 |
.collect(Collectors.toList());
|
| - |
|
406 |
Map<Integer, PendingOrderItem> pendingOrderItemMap = new HashMap<>();
|
| - |
|
407 |
if (!validationPoiIds.isEmpty()) {
|
| - |
|
408 |
List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectByIds(validationPoiIds);
|
| - |
|
409 |
pendingOrderItemMap = pendingOrderItems.stream()
|
| - |
|
410 |
.collect(Collectors.toMap(PendingOrderItem::getId, poi -> poi));
|
| - |
|
411 |
}
|
| - |
|
412 |
|
| 400 |
for (CustomFofoOrderItem customFofoOrderItem : createOrderRequest.getFofoOrderItems()) {
|
413 |
for (CustomFofoOrderItem customFofoOrderItem : createOrderRequest.getFofoOrderItems()) {
|
| 401 |
if (customFofoOrderItem.getPoiId() > 0) {
|
414 |
if (customFofoOrderItem.getPoiId() > 0) {
|
| - |
|
415 |
// N+1 fix: Use pre-fetched map instead of querying per item
|
| 402 |
PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(customFofoOrderItem.getPoiId());
|
416 |
PendingOrderItem pendingOrderItem = pendingOrderItemMap.get(customFofoOrderItem.getPoiId());
|
| - |
|
417 |
if (pendingOrderItem == null) {
|
| - |
|
418 |
throw new ProfitMandiBusinessException("poiId", customFofoOrderItem.getPoiId(), "Pending order item not found");
|
| - |
|
419 |
}
|
| 403 |
if (customFofoOrderItem.getQuantity() > pendingOrderItem.getQuantity()) {
|
420 |
if (customFofoOrderItem.getQuantity() > pendingOrderItem.getQuantity()) {
|
| 404 |
throw new ProfitMandiBusinessException("itemIdQuantity", customFofoOrderItem.getItemId(), "Quantity should not be greater than order item quantity");
|
421 |
throw new ProfitMandiBusinessException("itemIdQuantity", customFofoOrderItem.getItemId(), "Quantity should not be greater than order item quantity");
|
| 405 |
}
|
422 |
}
|
| 406 |
if (pendingOrderItem.getQuantity() > customFofoOrderItem.getQuantity()) {
|
423 |
if (pendingOrderItem.getQuantity() > customFofoOrderItem.getQuantity()) {
|
| 407 |
pendingOrderService.duplicatePendingOrder(pendingOrderItem, customFofoOrderItem.getQuantity());
|
424 |
pendingOrderService.duplicatePendingOrder(pendingOrderItem, customFofoOrderItem.getQuantity());
|
| Line 649... |
Line 666... |
| 649 |
} catch (Exception e) {
|
666 |
} catch (Exception e) {
|
| 650 |
LOGGER.error("Unable to get state rates");
|
667 |
LOGGER.error("Unable to get state rates");
|
| 651 |
}
|
668 |
}
|
| 652 |
}
|
669 |
}
|
| 653 |
|
670 |
|
| - |
|
671 |
// N+1 fix: Pre-fetch tagListings and GST rates before the loop
|
| - |
|
672 |
Map<Integer, TagListing> tagListingMap = tagListingRepository.selectByItemIds(itemIdCustomFofoOrderItemMap.keySet());
|
| - |
|
673 |
Map<Integer, GstRate> gstRateMap = null;
|
| - |
|
674 |
if (stateId != null) {
|
| - |
|
675 |
gstRateMap = stateGstRateRepository.getStateTaxRate(new ArrayList<>(itemMap.keySet()), stateId);
|
| - |
|
676 |
} else {
|
| - |
|
677 |
gstRateMap = stateGstRateRepository.getIgstTaxRate(new ArrayList<>(itemMap.keySet()));
|
| - |
|
678 |
}
|
| - |
|
679 |
|
| 654 |
for (CustomFofoOrderItem customFofoOrderItem : createOrderRequest.getFofoOrderItems()) {
|
680 |
for (CustomFofoOrderItem customFofoOrderItem : createOrderRequest.getFofoOrderItems()) {
|
| 655 |
FofoOrderItem fofoOrderItem = this.createAndGetFofoOrderItem(customFofoOrderItem, fofoOrder.getId(), itemMap, inventoryItemsToBill.get(customFofoOrderItem.getItemId()), stateId);
|
681 |
FofoOrderItem fofoOrderItem = this.createAndGetFofoOrderItem(customFofoOrderItem, fofoOrder.getId(), itemMap, inventoryItemsToBill.get(customFofoOrderItem.getItemId()), tagListingMap, gstRateMap);
|
| 656 |
|
682 |
|
| 657 |
Item item = itemMap.get(customFofoOrderItem.getItemId());
|
683 |
Item item = itemMap.get(customFofoOrderItem.getItemId());
|
| 658 |
if (item.getType().equals(ItemType.NON_SERIALIZED)) {
|
684 |
if (item.getType().equals(ItemType.NON_SERIALIZED)) {
|
| 659 |
if (customFofoOrderItem.getCustomSerialNumbers() != null && !customFofoOrderItem.getCustomSerialNumbers().isEmpty()) {
|
685 |
if (customFofoOrderItem.getCustomSerialNumbers() != null && !customFofoOrderItem.getCustomSerialNumbers().isEmpty()) {
|
| 660 |
persistNonSerializedWithCustomSerialNumber(customFofoOrderItem, fofoOrderItem.getId());
|
686 |
persistNonSerializedWithCustomSerialNumber(customFofoOrderItem, fofoOrderItem.getId());
|
| Line 673... |
Line 699... |
| 673 |
this.updateInventoryItemsAndScanRecord(inventoryItems, fofoId, inventoryItemIdQuantityUsed, fofoOrder.getId());
|
699 |
this.updateInventoryItemsAndScanRecord(inventoryItems, fofoId, inventoryItemIdQuantityUsed, fofoOrder.getId());
|
| 674 |
}
|
700 |
}
|
| 675 |
|
701 |
|
| 676 |
List<FofoOrderItem> fofoItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
|
702 |
List<FofoOrderItem> fofoItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
|
| 677 |
|
703 |
|
| 678 |
boolean smartPhone = false;
|
- |
|
| 679 |
for (FofoOrderItem fofoOrderItem : fofoItems) {
|
704 |
// Use existing itemMap instead of querying DB per item (N+1 fix)
|
| 680 |
Item item = itemRepository.selectById(fofoOrderItem.getItemId());
|
705 |
boolean smartPhone = items.stream().anyMatch(Item::isSmartPhone);
|
| 681 |
|
- |
|
| 682 |
if (item.isSmartPhone()) {
|
706 |
if (smartPhone) {
|
| 683 |
LOGGER.info("fofoItem {}", fofoOrderItem);
|
707 |
LOGGER.info("Smartphone found in order items");
|
| 684 |
smartPhone = true;
|
- |
|
| 685 |
}
|
708 |
} else {
|
| 686 |
}
|
- |
|
| 687 |
|
- |
|
| 688 |
if (!smartPhone) {
|
- |
|
| 689 |
LOGGER.warn("No smartphones found in fofoItems.");
|
709 |
LOGGER.warn("No smartphones found in fofoItems.");
|
| 690 |
}
|
710 |
}
|
| 691 |
|
711 |
|
| 692 |
|
712 |
|
| 693 |
if (smartPhone) {
|
713 |
if (smartPhone) {
|
| Line 710... |
Line 730... |
| 710 |
schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
|
730 |
schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
|
| 711 |
|
731 |
|
| 712 |
if (createOrderRequest.getPoId() != 0) {
|
732 |
if (createOrderRequest.getPoId() != 0) {
|
| 713 |
PendingOrder po = pendingOrderRepository.selectById(createOrderRequest.getPoId());
|
733 |
PendingOrder po = pendingOrderRepository.selectById(createOrderRequest.getPoId());
|
| 714 |
po.setBilledAmount(po.getBilledAmount() + totalAmount);
|
734 |
po.setBilledAmount(po.getBilledAmount() + totalAmount);
|
| - |
|
735 |
|
| - |
|
736 |
// N+1 fix: Batch fetch pending order items instead of querying per item
|
| 715 |
for (CustomFofoOrderItem cfoi : createOrderRequest.getFofoOrderItems()) {
|
737 |
List<Integer> poiIds = createOrderRequest.getFofoOrderItems().stream()
|
| - |
|
738 |
.map(CustomFofoOrderItem::getPoiId)
|
| - |
|
739 |
.filter(id -> id != 0)
|
| - |
|
740 |
.collect(Collectors.toList());
|
| - |
|
741 |
if (!poiIds.isEmpty()) {
|
| 716 |
PendingOrderItem poi = pendingOrderItemRepository.selectById(cfoi.getPoiId());
|
742 |
List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectByIds(poiIds);
|
| - |
|
743 |
LocalDateTime now = LocalDateTime.now();
|
| - |
|
744 |
for (PendingOrderItem poi : pendingOrderItems) {
|
| 717 |
poi.setStatus(OrderStatus.BILLED);
|
745 |
poi.setStatus(OrderStatus.BILLED);
|
| 718 |
poi.setBilledTimestamp(LocalDateTime.now());
|
746 |
poi.setBilledTimestamp(now);
|
| - |
|
747 |
}
|
| 719 |
}
|
748 |
}
|
| - |
|
749 |
|
| 720 |
po.setStatus(OrderStatus.BILLED);
|
750 |
po.setStatus(OrderStatus.BILLED);
|
| 721 |
}
|
751 |
}
|
| 722 |
//Process scratch
|
752 |
//Process scratch
|
| 723 |
this.processScratchOffer(fofoOrder);
|
753 |
this.processScratchOffer(fofoOrder);
|
| 724 |
|
754 |
|
| Line 750... |
Line 780... |
| 750 |
}
|
780 |
}
|
| 751 |
|
781 |
|
| 752 |
}
|
782 |
}
|
| 753 |
}
|
783 |
}
|
| 754 |
|
784 |
|
| 755 |
// enable it fo upsell call
|
785 |
// enable it fo upsell call - N+1 fix: smartPhone already determined, no need to re-query items
|
| 756 |
if (smartPhone) {
|
- |
|
| 757 |
if (fofoOrder.getId() > 0) {
|
786 |
if (smartPhone && fofoOrder.getId() > 0) {
|
| 758 |
List<InsurancePolicy> insurancePolicies = insurancePolicyRepository
|
787 |
List<InsurancePolicy> insurancePolicies = insurancePolicyRepository
|
| 759 |
.selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
|
788 |
.selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
|
| 760 |
if (insurancePolicies.isEmpty()) {
|
789 |
if (insurancePolicies.isEmpty()) {
|
| 761 |
List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
|
- |
|
| 762 |
for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
|
- |
|
| 763 |
Item item = itemRepository.selectById(fofoOrderItem.getItemId());
|
- |
|
| 764 |
if (item.isSmartPhone()) {
|
- |
|
| 765 |
UpSaleOrder upSaleOrder = new UpSaleOrder();
|
790 |
UpSaleOrder upSaleOrder = new UpSaleOrder();
|
| 766 |
upSaleOrder.setCreatedTimestamp(LocalDateTime.now());
|
791 |
upSaleOrder.setCreatedTimestamp(LocalDateTime.now());
|
| 767 |
upSaleOrder.setOrderId(fofoOrder.getId());
|
792 |
upSaleOrder.setOrderId(fofoOrder.getId());
|
| 768 |
upSaleOrder.setFofoId(fofoOrder.getFofoId());
|
793 |
upSaleOrder.setFofoId(fofoOrder.getFofoId());
|
| 769 |
upSaleOrderRepository.persist(upSaleOrder);
|
794 |
upSaleOrderRepository.persist(upSaleOrder);
|
| 770 |
break; // Exit the loop after persisting the UpSaleOrder for the first smartphone
|
- |
|
| 771 |
}
|
- |
|
| 772 |
}
|
- |
|
| 773 |
}
|
- |
|
| 774 |
}
|
795 |
}
|
| 775 |
}
|
796 |
}
|
| 776 |
|
797 |
|
| 777 |
// Update Partner Opening Stock current qty
|
798 |
// Update Partner Opening Stock current qty - N+1 fix: use existing itemMap and batch update
|
| 778 |
if (fofoOrder.getId() > 0) {
|
799 |
if (fofoOrder.getId() > 0) {
|
| 779 |
List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
|
800 |
Map<Integer, Integer> itemIdQuantityMap = new HashMap<>();
|
| 780 |
for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
|
801 |
for (FofoOrderItem fofoOrderItem : fofoItems) {
|
| 781 |
Item item = itemRepository.selectById(fofoOrderItem.getItemId());
|
- |
|
| 782 |
smartCartService.minusOpeningStock(item.getId(), fofoOrder.getFofoId(), fofoOrderItem.getQuantity());
|
802 |
itemIdQuantityMap.merge(fofoOrderItem.getItemId(), fofoOrderItem.getQuantity(), Integer::sum);
|
| 783 |
}
|
803 |
}
|
| - |
|
804 |
smartCartService.minusOpeningStockBatch(itemIdQuantityMap, fofoOrder.getFofoId());
|
| 784 |
}
|
805 |
}
|
| 785 |
|
806 |
|
| 786 |
|
807 |
|
| 787 |
return fofoOrder.getId();
|
808 |
return fofoOrder.getId();
|
| 788 |
}
|
809 |
}
|
| Line 790... |
Line 811... |
| 790 |
@Override
|
811 |
@Override
|
| 791 |
public void processScratchOffer(FofoOrder fofoOrder) throws ProfitMandiBusinessException {
|
812 |
public void processScratchOffer(FofoOrder fofoOrder) throws ProfitMandiBusinessException {
|
| 792 |
boolean isSmartPhonePurchased = false;
|
813 |
boolean isSmartPhonePurchased = false;
|
| 793 |
float maxPurchaseValue = 0;
|
814 |
float maxPurchaseValue = 0;
|
| 794 |
List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
|
815 |
List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
|
| - |
|
816 |
|
| - |
|
817 |
// N+1 fix: batch fetch all items instead of querying per order item
|
| - |
|
818 |
Set<Integer> itemIds = fofoOrderItems.stream()
|
| - |
|
819 |
.map(FofoOrderItem::getItemId)
|
| - |
|
820 |
.collect(Collectors.toSet());
|
| - |
|
821 |
Map<Integer, Item> itemMap = itemRepository.selectByIds(itemIds).stream()
|
| - |
|
822 |
.collect(Collectors.toMap(Item::getId, item -> item));
|
| - |
|
823 |
|
| 795 |
for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
|
824 |
for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
|
| 796 |
Item item = itemRepository.selectById(fofoOrderItem.getItemId());
|
825 |
Item item = itemMap.get(fofoOrderItem.getItemId());
|
| 797 |
|
826 |
|
| 798 |
if (item.isSmartPhone()) {
|
827 |
if (item != null && item.isSmartPhone()) {
|
| 799 |
LOGGER.info("fofoItem {}", fofoOrderItem);
|
828 |
LOGGER.info("fofoItem {}", fofoOrderItem);
|
| 800 |
isSmartPhonePurchased = true;
|
829 |
isSmartPhonePurchased = true;
|
| 801 |
maxPurchaseValue = Math.max(fofoOrderItem.getSellingPrice(), maxPurchaseValue);
|
830 |
maxPurchaseValue = Math.max(fofoOrderItem.getSellingPrice(), maxPurchaseValue);
|
| 802 |
|
- |
|
| 803 |
}
|
831 |
}
|
| 804 |
}
|
832 |
}
|
| 805 |
LocalDate startDate = ProfitMandiConstants.SCRATCH_OFFER_START_DATE;
|
833 |
LocalDate startDate = ProfitMandiConstants.SCRATCH_OFFER_START_DATE;
|
| 806 |
LocalDate endDate = ProfitMandiConstants.SCRATCH_OFFER_END_DATE;
|
834 |
LocalDate endDate = ProfitMandiConstants.SCRATCH_OFFER_END_DATE;
|
| 807 |
boolean specificPriceOffer = ProfitMandiConstants.SPECIFIC_PRICE_OFFER;
|
835 |
boolean specificPriceOffer = ProfitMandiConstants.SPECIFIC_PRICE_OFFER;
|
| Line 1795... |
Line 1823... |
| 1795 |
fofoLineItemRepository.persist(fofoLineItem);
|
1823 |
fofoLineItemRepository.persist(fofoLineItem);
|
| 1796 |
}
|
1824 |
}
|
| 1797 |
}
|
1825 |
}
|
| 1798 |
|
1826 |
|
| 1799 |
private FofoOrderItem createAndGetFofoOrderItem(CustomFofoOrderItem customFofoOrderItem, int fofoOrderId, Map<
|
1827 |
private FofoOrderItem createAndGetFofoOrderItem(CustomFofoOrderItem customFofoOrderItem, int fofoOrderId, Map<
|
| 1800 |
Integer, Item> itemMap, Set<InventoryItem> inventoryItems, Integer stateId) throws
|
1828 |
Integer, Item> itemMap, Set<InventoryItem> inventoryItems, Map<Integer, TagListing> tagListingMap,
|
| 1801 |
ProfitMandiBusinessException {
|
1829 |
Map<Integer, GstRate> gstRateMap) throws ProfitMandiBusinessException {
|
| 1802 |
FofoOrderItem fofoOrderItem = new FofoOrderItem();
|
1830 |
FofoOrderItem fofoOrderItem = new FofoOrderItem();
|
| 1803 |
fofoOrderItem.setItemId(customFofoOrderItem.getItemId());
|
1831 |
fofoOrderItem.setItemId(customFofoOrderItem.getItemId());
|
| 1804 |
fofoOrderItem.setQuantity(customFofoOrderItem.getQuantity());
|
1832 |
fofoOrderItem.setQuantity(customFofoOrderItem.getQuantity());
|
| 1805 |
fofoOrderItem.setSellingPrice(customFofoOrderItem.getSellingPrice());
|
1833 |
fofoOrderItem.setSellingPrice(customFofoOrderItem.getSellingPrice());
|
| 1806 |
fofoOrderItem.setPendingOrderItemId(customFofoOrderItem.getPoiId());
|
1834 |
fofoOrderItem.setPendingOrderItemId(customFofoOrderItem.getPoiId());
|
| 1807 |
fofoOrderItem.setOrderId(fofoOrderId);
|
1835 |
fofoOrderItem.setOrderId(fofoOrderId);
|
| - |
|
1836 |
|
| - |
|
1837 |
// N+1 fix: Use pre-fetched tagListingMap instead of querying per item
|
| 1808 |
TagListing tl = tagListingRepository.selectByItemId(customFofoOrderItem.getItemId());
|
1838 |
TagListing tl = tagListingMap.get(customFofoOrderItem.getItemId());
|
| 1809 |
// In case listing gets removed rebill it using the selling price
|
1839 |
// In case listing gets removed rebill it using the selling price
|
| 1810 |
if (tl != null) {
|
1840 |
if (tl != null) {
|
| 1811 |
fofoOrderItem.setDp(tl.getSellingPrice());
|
1841 |
fofoOrderItem.setDp(tl.getSellingPrice());
|
| 1812 |
fofoOrderItem.setMop(tl.getMop());
|
1842 |
fofoOrderItem.setMop(tl.getMop());
|
| 1813 |
} else {
|
1843 |
} else {
|
| Line 1815... |
Line 1845... |
| 1815 |
fofoOrderItem.setMop(customFofoOrderItem.getSellingPrice());
|
1845 |
fofoOrderItem.setMop(customFofoOrderItem.getSellingPrice());
|
| 1816 |
}
|
1846 |
}
|
| 1817 |
fofoOrderItem.setDiscount(customFofoOrderItem.getDiscountAmount());
|
1847 |
fofoOrderItem.setDiscount(customFofoOrderItem.getDiscountAmount());
|
| 1818 |
|
1848 |
|
| 1819 |
Item item = itemMap.get(customFofoOrderItem.getItemId());
|
1849 |
Item item = itemMap.get(customFofoOrderItem.getItemId());
|
| 1820 |
Map<Integer, GstRate> itemIdStateTaxRateMap = null;
|
- |
|
| 1821 |
if (stateId != null) {
|
- |
|
| 1822 |
itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(new ArrayList<>(itemMap.keySet()), stateId);
|
- |
|
| 1823 |
} else {
|
- |
|
| 1824 |
itemIdStateTaxRateMap = stateGstRateRepository.getIgstTaxRate(new ArrayList<>(itemMap.keySet()));
|
- |
|
| 1825 |
}
|
- |
|
| 1826 |
for (InventoryItem inventoryItem : inventoryItems) {
|
- |
|
| 1827 |
|
- |
|
| 1828 |
fofoOrderItem.setIgstRate(itemIdStateTaxRateMap.get(inventoryItem.getItemId()).getIgstRate());
|
- |
|
| 1829 |
|
- |
|
| 1830 |
fofoOrderItem.setCgstRate(itemIdStateTaxRateMap.get(inventoryItem.getItemId()).getCgstRate());
|
- |
|
| 1831 |
fofoOrderItem.setSgstRate(itemIdStateTaxRateMap.get(inventoryItem.getItemId()).getSgstRate());
|
- |
|
| 1832 |
|
- |
|
| 1833 |
|
1850 |
|
| - |
|
1851 |
// N+1 fix: Use pre-fetched gstRateMap instead of querying per item
|
| - |
|
1852 |
for (InventoryItem inventoryItem : inventoryItems) {
|
| - |
|
1853 |
GstRate gstRate = gstRateMap.get(inventoryItem.getItemId());
|
| - |
|
1854 |
if (gstRate != null) {
|
| - |
|
1855 |
fofoOrderItem.setIgstRate(gstRate.getIgstRate());
|
| - |
|
1856 |
fofoOrderItem.setCgstRate(gstRate.getCgstRate());
|
| - |
|
1857 |
fofoOrderItem.setSgstRate(gstRate.getSgstRate());
|
| - |
|
1858 |
}
|
| 1834 |
fofoOrderItem.setHsnCode(inventoryItem.getHsnCode());
|
1859 |
fofoOrderItem.setHsnCode(inventoryItem.getHsnCode());
|
| 1835 |
break;
|
1860 |
break;
|
| 1836 |
}
|
1861 |
}
|
| 1837 |
fofoOrderItem.setBrand(item.getBrand());
|
1862 |
fofoOrderItem.setBrand(item.getBrand());
|
| 1838 |
fofoOrderItem.setModelName(item.getModelName());
|
1863 |
fofoOrderItem.setModelName(item.getModelName());
|