Subversion Repositories SmartDukaan

Rev

Rev 35461 | Rev 35524 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
28217 tejbeer 1
package com.smartdukaan.cron.scheduled;
23723 amit.gupta 2
 
34039 vikas.jang 3
import com.google.auth.oauth2.GoogleCredentials;
24542 amit.gupta 4
import com.google.common.collect.Lists;
25300 tejbeer 5
import com.google.gson.Gson;
29488 manish 6
import com.razorpay.Payment;
32421 amit.gupta 7
import com.smartdukaan.cron.itelImeiActivation.ItelImeiActivationNewService;
29488 manish 8
import com.smartdukaan.cron.itelImeiActivation.ItelImeiActivationService;
9
import com.smartdukaan.cron.itelImeiActivation.TecnoImeiActivation;
33994 amit.gupta 10
import com.smartdukaan.cron.migrations.RunOnceTasks;
35021 amit 11
import com.smartdukaan.cron.scheduled.ambreports.AbmReportSender;
32482 amit.gupta 12
import com.smartdukaan.cron.scheduled.runnables.PurchaseMigration;
32511 amit.gupta 13
import com.spice.profitmandi.common.enumuration.*;
24121 govind 14
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
32421 amit.gupta 15
import com.spice.profitmandi.common.model.*;
24681 amit.gupta 16
import com.spice.profitmandi.common.services.ReporticoService;
29814 tejbeer 17
import com.spice.profitmandi.common.services.mandii.MandiiService;
35295 amit 18
import com.spice.profitmandi.common.util.FileUtil;
19
import com.spice.profitmandi.common.util.FormattingUtils;
20
import com.spice.profitmandi.common.util.PdfUtils;
21
import com.spice.profitmandi.common.util.Utils;
24592 amit.gupta 22
import com.spice.profitmandi.common.util.Utils.Attachment;
29308 tejbeer 23
import com.spice.profitmandi.common.web.client.RestClient;
25300 tejbeer 24
import com.spice.profitmandi.dao.Interface.Campaign;
32511 amit.gupta 25
import com.spice.profitmandi.dao.cart.CartService;
34450 ranu 26
import com.spice.profitmandi.dao.cart.SmartCartService;
25590 amit.gupta 27
import com.spice.profitmandi.dao.entity.auth.AuthUser;
30421 tejbeer 28
import com.spice.profitmandi.dao.entity.auth.PartnerCollectionRemark;
33078 ranu 29
import com.spice.profitmandi.dao.entity.catalog.*;
35393 amit 30
import com.spice.profitmandi.dao.entity.catalog.Offer;
33078 ranu 31
import com.spice.profitmandi.dao.entity.cs.NonSdBuying;
25590 amit.gupta 32
import com.spice.profitmandi.dao.entity.cs.Position;
26283 tejbeer 33
import com.spice.profitmandi.dao.entity.cs.Ticket;
35295 amit 34
import com.spice.profitmandi.dao.entity.dtr.*;
28769 amit.gupta 35
import com.spice.profitmandi.dao.entity.dtr.User;
32421 amit.gupta 36
import com.spice.profitmandi.dao.entity.fofo.*;
37
import com.spice.profitmandi.dao.entity.inventory.*;
33553 ranu 38
import com.spice.profitmandi.dao.entity.logistics.AST;
39
import com.spice.profitmandi.dao.entity.logistics.ASTRepository;
32421 amit.gupta 40
import com.spice.profitmandi.dao.entity.transaction.*;
41
import com.spice.profitmandi.dao.entity.user.*;
32511 amit.gupta 42
import com.spice.profitmandi.dao.entity.warehouse.WarehouseInventoryItem;
43
import com.spice.profitmandi.dao.entity.warehouse.WarehouseScan;
30421 tejbeer 44
import com.spice.profitmandi.dao.enumuration.auth.CollectionRemark;
34324 amit.gupta 45
import com.spice.profitmandi.dao.enumuration.catalog.StockTransactionType;
25598 amit.gupta 46
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
26790 tejbeer 47
import com.spice.profitmandi.dao.enumuration.dtr.RefferalStatus;
29814 tejbeer 48
import com.spice.profitmandi.dao.enumuration.fofo.Gateway;
31332 amit.gupta 49
import com.spice.profitmandi.dao.enumuration.fofo.PaymentStatus;
32511 amit.gupta 50
import com.spice.profitmandi.dao.enumuration.fofo.ReturnType;
24242 amit.gupta 51
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
34162 ranu 52
import com.spice.profitmandi.dao.enumuration.inventory.CatalogMovingEnum;
32081 tejbeer 53
import com.spice.profitmandi.dao.enumuration.inventory.VendorCatalogPricingStatus;
34324 amit.gupta 54
import com.spice.profitmandi.dao.enumuration.transaction.CreditRisk;
55
import com.spice.profitmandi.dao.enumuration.transaction.LoanReferenceType;
56
import com.spice.profitmandi.dao.enumuration.transaction.PriceDropImeiStatus;
57
import com.spice.profitmandi.dao.enumuration.transaction.SchemePayoutStatus;
32421 amit.gupta 58
import com.spice.profitmandi.dao.model.*;
33452 amit.gupta 59
import com.spice.profitmandi.dao.repository.GenericRepository;
25590 amit.gupta 60
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
33078 ranu 61
import com.spice.profitmandi.dao.repository.auth.NonSdBuyingRepository;
30421 tejbeer 62
import com.spice.profitmandi.dao.repository.auth.PartnerCollectionRemarkRepository;
32421 amit.gupta 63
import com.spice.profitmandi.dao.repository.catalog.*;
33874 ranu 64
import com.spice.profitmandi.dao.repository.cs.CsService;
65
import com.spice.profitmandi.dao.repository.cs.PartnerRegionRepository;
66
import com.spice.profitmandi.dao.repository.cs.PositionRepository;
67
import com.spice.profitmandi.dao.repository.cs.TicketRepository;
32421 amit.gupta 68
import com.spice.profitmandi.dao.repository.dtr.*;
69
import com.spice.profitmandi.dao.repository.fofo.*;
70
import com.spice.profitmandi.dao.repository.inventory.*;
33817 amit.gupta 71
import com.spice.profitmandi.dao.repository.logistics.WarehouseProviderRepository;
32421 amit.gupta 72
import com.spice.profitmandi.dao.repository.transaction.*;
35295 amit 73
import com.spice.profitmandi.dao.repository.trialOnboarding.TrialFormRepository;
24542 amit.gupta 74
import com.spice.profitmandi.dao.repository.user.AddressRepository;
34160 tejus.loha 75
import com.spice.profitmandi.dao.repository.user.LoiFormRepository;
25721 tejbeer 76
import com.spice.profitmandi.dao.repository.user.UserRepository;
32421 amit.gupta 77
import com.spice.profitmandi.dao.repository.warehouse.*;
34547 vikas.jang 78
import com.spice.profitmandi.dao.service.LiquidationService;
34252 tejus.loha 79
import com.spice.profitmandi.dao.service.PurSaleService;
33355 amit.gupta 80
import com.spice.profitmandi.dao.service.SidbiService;
32817 amit.gupta 81
import com.spice.profitmandi.dao.service.biuedart.BluedartAuthService;
82
import com.spice.profitmandi.dao.service.biuedart.BluedartService;
31604 tejbeer 83
import com.spice.profitmandi.dao.service.solr.FofoSolr;
32421 amit.gupta 84
import com.spice.profitmandi.service.*;
31332 amit.gupta 85
import com.spice.profitmandi.service.integrations.CCAvenuePaymentService;
28368 tejbeer 86
import com.spice.profitmandi.service.integrations.RazorpayPaymentService;
30858 amit.gupta 87
import com.spice.profitmandi.service.integrations.bharti.model.BAGInsuranceModel;
33638 amit.gupta 88
import com.spice.profitmandi.service.integrations.gstpro.GstProAuthService;
33817 amit.gupta 89
import com.spice.profitmandi.service.integrations.gstpro.GstProService;
35393 amit 90
import com.spice.profitmandi.service.integrations.pinelabs.dto.*;
32872 amit.gupta 91
import com.spice.profitmandi.service.integrations.psismart.PsiSmartService;
32948 amit.gupta 92
import com.spice.profitmandi.service.integrations.smartping.SmartPingService;
25694 amit.gupta 93
import com.spice.profitmandi.service.integrations.toffee.ToffeeService;
32421 amit.gupta 94
import com.spice.profitmandi.service.inventory.*;
31746 amit.gupta 95
import com.spice.profitmandi.service.offers.OfferService;
25335 amit.gupta 96
import com.spice.profitmandi.service.order.OrderService;
33452 amit.gupta 97
import com.spice.profitmandi.service.pricecircular.PriceCircularService;
24431 amit.gupta 98
import com.spice.profitmandi.service.pricing.PriceDropService;
23724 amit.gupta 99
import com.spice.profitmandi.service.recharge.provider.OxigenRechargeProviderService;
100
import com.spice.profitmandi.service.recharge.provider.ThinkWalnutDigitalRechargeProviderService;
101
import com.spice.profitmandi.service.scheme.SchemeService;
29668 tejbeer 102
import com.spice.profitmandi.service.serviceConfig.ServiceConfigService;
35295 amit 103
import com.spice.profitmandi.service.transaction.CreditBlockedExceptionPartnersRepository;
31008 amit.gupta 104
import com.spice.profitmandi.service.transaction.CreditNoteService;
30859 tejbeer 105
import com.spice.profitmandi.service.transaction.SDCreditService;
23929 amit.gupta 106
import com.spice.profitmandi.service.transaction.TransactionService;
32990 amit.gupta 107
import com.spice.profitmandi.service.transaction.invoicing.InvoiceService;
23929 amit.gupta 108
import com.spice.profitmandi.service.user.RetailerService;
34160 tejus.loha 109
import com.spice.profitmandi.service.user.StoreTimelineTatService;
32511 amit.gupta 110
import com.spice.profitmandi.service.wallet.CommonPaymentService;
23739 amit.gupta 111
import com.spice.profitmandi.service.wallet.WalletService;
32421 amit.gupta 112
import com.spice.profitmandi.service.warehouse.PurchaseOrderService;
32511 amit.gupta 113
import com.spice.profitmandi.service.warehouse.WarehouseInventoryService;
33384 amit.gupta 114
import com.spice.profitmandi.service.warehouse.WarehouseService;
25721 tejbeer 115
import in.shop2020.model.v1.order.OrderStatus;
29308 tejbeer 116
import in.shop2020.model.v1.order.WalletReferenceType;
32421 amit.gupta 117
import org.apache.commons.io.output.ByteArrayOutputStream;
118
import org.apache.commons.lang.StringUtils;
119
import org.apache.http.client.methods.CloseableHttpResponse;
120
import org.apache.http.client.methods.HttpPost;
121
import org.apache.http.conn.HttpHostConnectException;
122
import org.apache.http.entity.StringEntity;
123
import org.apache.http.impl.client.CloseableHttpClient;
124
import org.apache.http.impl.client.HttpClients;
125
import org.apache.logging.log4j.LogManager;
126
import org.apache.logging.log4j.Logger;
127
import org.hibernate.SessionFactory;
128
import org.json.JSONObject;
129
import org.springframework.beans.factory.annotation.Autowired;
130
import org.springframework.beans.factory.annotation.Qualifier;
131
import org.springframework.beans.factory.annotation.Value;
132
import org.springframework.core.io.ByteArrayResource;
133
import org.springframework.core.io.InputStreamSource;
134
import org.springframework.mail.javamail.JavaMailSender;
135
import org.springframework.mail.javamail.MimeMessageHelper;
136
import org.springframework.stereotype.Component;
137
import org.springframework.transaction.annotation.Transactional;
31640 tejbeer 138
 
32421 amit.gupta 139
import javax.mail.MessagingException;
140
import javax.mail.internet.InternetAddress;
141
import javax.mail.internet.MimeMessage;
142
import java.io.*;
143
import java.math.BigDecimal;
144
import java.math.RoundingMode;
145
import java.nio.file.Files;
146
import java.nio.file.Paths;
147
import java.sql.Timestamp;
148
import java.text.DecimalFormat;
149
import java.time.*;
150
import java.time.format.DateTimeFormatter;
151
import java.time.temporal.ChronoField;
152
import java.time.temporal.ChronoUnit;
153
import java.util.*;
154
import java.util.Map.Entry;
155
import java.util.stream.Collectors;
156
import java.util.stream.Stream;
32060 amit.gupta 157
 
33664 amit.gupta 158
import static java.util.stream.Collectors.*;
32421 amit.gupta 159
 
160
 
23723 amit.gupta 161
@Component
33384 amit.gupta 162
@Transactional(rollbackFor = {Throwable.class, ProfitMandiBusinessException.class})
23723 amit.gupta 163
public class ScheduledTasks {
164
 
31697 amit.gupta 165
    @Value("${oxigen.recharge.enquiry.url}")
166
    private String oxigenRechargeEnquiryUrl;
24533 govind 167
 
31697 amit.gupta 168
    @Autowired
32482 amit.gupta 169
    PurchaseMigration purchaseMigration;
170
 
171
    @Autowired
32795 amit.gupta 172
    SmartPingService smartPingService;
173
 
33553 ranu 174
    @Autowired
175
    private ASTRepository astRepository;
29668 tejbeer 176
 
31697 amit.gupta 177
    @Autowired
178
    private ServiceConfigService serviceConfigService;
29801 manish 179
 
31697 amit.gupta 180
    @Autowired
181
    private TecnoImeiActivation tecnoImeiActivation;
28205 tejbeer 182
 
31697 amit.gupta 183
    private static final DateTimeFormatter leadTimeFormatter = DateTimeFormatter.ofPattern("d LLL, hh:mm a");
27088 tejbeer 184
 
31697 amit.gupta 185
    @Autowired
186
    private PartnerRegionRepository partnerRegionRepository;
28790 amit.gupta 187
 
31697 amit.gupta 188
    @Autowired
189
    private EmployeeAttendanceRepository employeeAttendanceRepository;
27088 tejbeer 190
 
31697 amit.gupta 191
    @Autowired
192
    VivoImeiActivationService vivoImeiActivationService;
29488 manish 193
 
31697 amit.gupta 194
    @Autowired
195
    ItelImeiActivationService itelImeiActivationService;
29488 manish 196
 
31697 amit.gupta 197
    @Autowired
198
    private PartnerTypeChangeService partnerTypeChangeService;
25598 amit.gupta 199
 
26408 amit.gupta 200
 
31697 amit.gupta 201
    @Autowired
202
    private LeadRepository leadRepository;
25927 amit.gupta 203
 
31697 amit.gupta 204
    @Autowired
205
    private AuthRepository authRepository;
25503 amit.gupta 206
 
31697 amit.gupta 207
    @Autowired
208
    private PriceDropService priceDropService;
26283 tejbeer 209
 
31697 amit.gupta 210
    @Autowired
211
    private FranchiseeVisitRepository franchiseeVisitRepository;
26790 tejbeer 212
 
31697 amit.gupta 213
    @Autowired
214
    private FranchiseeActivityRepository franchiseeActivityRepository;
26790 tejbeer 215
 
31697 amit.gupta 216
    @Autowired
217
    private HdfcPaymentRepository hdfcPaymentRepository;
26790 tejbeer 218
 
31697 amit.gupta 219
    @Autowired
220
    private CsService csService;
25846 amit.gupta 221
 
31697 amit.gupta 222
    @Autowired
223
    private SaholicInventoryService saholicInventoryService;
27208 tejbeer 224
 
31697 amit.gupta 225
    @Autowired
226
    private InsurancePolicyRepository insurancePolicyRepository;
23723 amit.gupta 227
 
31697 amit.gupta 228
    @Autowired
229
    private ToffeeService toffeeService;
25694 amit.gupta 230
 
31697 amit.gupta 231
    @Value("${oxigen.recharge.auth.key}")
232
    private String oxigenRechargeAuthKey;
23724 amit.gupta 233
 
31697 amit.gupta 234
    @Value("${oxigen.recharge.validation.url}")
235
    private String oxigenRechargeValidationUrl;
23724 amit.gupta 236
 
31697 amit.gupta 237
    @Value("${oxigen.recharge.validation.auth.key}")
238
    private String oxigenRechargeValidationAuthKey;
23724 amit.gupta 239
 
31697 amit.gupta 240
    @Value("${think.walnut.digital.recharge.transaction.mobile.url}")
241
    private String thinkWalnutDigitalRechargeTransactionMobileUrl;
23724 amit.gupta 242
 
31697 amit.gupta 243
    @Value("${think.walnut.digital.recharge.transaction.dth.url}")
244
    private String thinkWalnutDigitalRechargeTransactionDthUrl;
23724 amit.gupta 245
 
31697 amit.gupta 246
    @Value("${think.walnut.digital.recharge.enquiry.url}")
247
    private String thinkWalnutDigitalRechargeEnquiryUrl;
23724 amit.gupta 248
 
31697 amit.gupta 249
    @Value("${think.walnut.digital.recharge.balance.url}")
250
    private String thinkWalnutDigitalRechargeBalanceUrl;
23724 amit.gupta 251
 
31697 amit.gupta 252
    @Value("${think.walnut.digital.recharge.username}")
253
    private String thinkWalnutDigitalRechargeUserName;
23724 amit.gupta 254
 
31697 amit.gupta 255
    @Value("${think.walnut.digital.recharge.password}")
256
    private String thinkWalnutDigitalRechargePassword;
23724 amit.gupta 257
 
31697 amit.gupta 258
    @Value("${think.walnut.digital.recharge.auth.key}")
259
    private String thinkWalnutDigitalRechargeAuthKey;
23724 amit.gupta 260
 
31697 amit.gupta 261
    @Autowired
262
    private PurchaseRepository purchaseRepository;
23724 amit.gupta 263
 
31697 amit.gupta 264
    @Autowired
265
    private PriceDropIMEIRepository priceDropIMEIRepository;
25609 amit.gupta 266
 
31697 amit.gupta 267
    @Autowired
268
    PriceDropRepository priceDropRepository;
25609 amit.gupta 269
 
31697 amit.gupta 270
    @Autowired
271
    private PartnerTypeChangeRepository partnerTypeChangeRepository;
28368 tejbeer 272
 
31697 amit.gupta 273
    @Autowired
274
    private SchemeService schemeService;
24683 amit.gupta 275
 
31697 amit.gupta 276
    @Autowired
277
    private ServiceConfigRepository serviceConfigRepository;
29668 tejbeer 278
 
32061 amit.gupta 279
    @Autowired
280
    private RetailerBlockBrandsRepository retailerBlockBrandsRepository;
281
 
34547 vikas.jang 282
    @Autowired
283
    private LiquidationService liquidationService;
284
 
34578 vikas.jang 285
    private static final String[] STOCK_AGEING_MAIL_LIST = new String[]{"uday.singh@smartudkaan.com", "mohinder.mutreja@smartdukaan.com", "ankit.bhatia@smartdukaan.com", "tarun.verma@smartdukaan.com", "kuldeep.kumar@smartdukaan.com", "manish.gupta1@smartdukaan.com"};
25609 amit.gupta 286
 
31886 tejbeer 287
    private static final String[] ITEMWISE_PENDING_INDENT_MAIL_LIST = new String[]{"kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com", "uday.singh@smartdukaan.com", "kuldeep.kumar@smartdukaan.com", "niranjan.kala@smartdukaan.com"};
25609 amit.gupta 288
 
33664 amit.gupta 289
    private static final String[] INDENT_TERTIARY_MAIL_LIST = new String[]{"uday.singh@smartdukaan.com", "kuldeep.kumar@smartdukaan.com", "nishant.ohri@smartdukaan.com", "vinay.p@smartdukaan.com", "deena.nath@smartdukaan.com", "shobhit.tandon@smartdukaan.com", "ritesh.chauhan1@smartdukaan.com"};
28709 amit.gupta 290
 
31886 tejbeer 291
    private static final String[] EMPLOYEE_ATTENDANCE_MAIL_LIST = new String[]{"sm@smartdukaan.com", "sm@smartdukaan.com"};
28790 amit.gupta 292
 
31697 amit.gupta 293
    private List<OrderStatus> orderStatusList = Arrays.asList(OrderStatus.SUBMITTED_FOR_PROCESSING);
25721 tejbeer 294
 
31697 amit.gupta 295
    @Autowired
296
    private ReporticoService reporticoService;
23724 amit.gupta 297
 
31697 amit.gupta 298
    @Autowired
299
    private PartnerInvestmentService partnerInvestmentService;
25598 amit.gupta 300
 
31697 amit.gupta 301
    @Autowired
302
    private PositionRepository positionRepository;
24337 amit.gupta 303
 
31697 amit.gupta 304
    @Autowired
305
    private FofoOrderItemRepository fofoOrderItemRepository;
25865 amit.gupta 306
 
31697 amit.gupta 307
    @Autowired
308
    private NotificationService notificationService;
24542 amit.gupta 309
 
31697 amit.gupta 310
    @Autowired
311
    private PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
24277 amit.gupta 312
 
31697 amit.gupta 313
    @Autowired
314
    private SchemeInOutRepository schemeInOutRepository;
24241 amit.gupta 315
 
31697 amit.gupta 316
    @Autowired
317
    private RechargeTransactionRepository rechargeTransactionRepository;
23724 amit.gupta 318
 
31697 amit.gupta 319
    @Autowired
320
    private CustomerAddressRepository customerAddressRepository;
24542 amit.gupta 321
 
31697 amit.gupta 322
    @Autowired
323
    private RechargeProviderCreditWalletHistoryRepository rechargeProviderCreditWalletHistoryRepository;
23724 amit.gupta 324
 
31697 amit.gupta 325
    @Autowired
326
    private FofoLineItemRepository fofoLineItemRepository;
24590 amit.gupta 327
 
31697 amit.gupta 328
    @Autowired
329
    private FofoOrderRepository fofoOrderRepository;
24587 amit.gupta 330
 
31697 amit.gupta 331
    @Autowired
332
    private UserWalletHistoryRepository userWalletHistoryRepository;
24250 amit.gupta 333
 
31697 amit.gupta 334
    @Autowired
335
    private UserWalletRepository userWalletRepository;
24587 amit.gupta 336
 
31697 amit.gupta 337
    @Autowired
338
    private InventoryItemRepository inventoryItemRepository;
23929 amit.gupta 339
 
31697 amit.gupta 340
    @Autowired
341
    private WalletService walletService;
23724 amit.gupta 342
 
31697 amit.gupta 343
    @Autowired
344
    private ThinkWalnutDigitalRechargeProviderService thinkWalnutDigitalRechargeProviderService;
23724 amit.gupta 345
 
31697 amit.gupta 346
    @Autowired
347
    private OxigenRechargeProviderService oxigenRechargeProviderService;
23724 amit.gupta 348
 
31697 amit.gupta 349
    @Autowired
350
    private RechargeProviderRepository rechargeProviderRepository;
23724 amit.gupta 351
 
31697 amit.gupta 352
    @Autowired
353
    private ScanRecordRepository scanRecordRepository;
24242 amit.gupta 354
 
31697 amit.gupta 355
    @Autowired
356
    private DailyRechargeRepository dailyRechargeRepository;
23724 amit.gupta 357
 
31697 amit.gupta 358
    @Autowired
359
    private FofoStoreRepository fofoStoreRepository;
24177 govind 360
 
31697 amit.gupta 361
    @Value("${prod}")
362
    private boolean prod;
26945 amit.gupta 363
 
31697 amit.gupta 364
    @Autowired
365
    private StateGstRateRepository stateGstRateRepository;
23724 amit.gupta 366
 
31697 amit.gupta 367
    @Autowired
368
    private RetailerService retailerService;
23929 amit.gupta 369
 
31697 amit.gupta 370
    @Autowired
33078 ranu 371
    private BrandsRepository brandsRepository;
372
 
373
    @Autowired
31697 amit.gupta 374
    private TransactionService transactionService;
24250 amit.gupta 375
 
31697 amit.gupta 376
    @Autowired
377
    private ItemRepository itemRepository;
23929 amit.gupta 378
 
31697 amit.gupta 379
    @Autowired
380
    private OrderRepository orderRepository;
25351 tejbeer 381
 
31697 amit.gupta 382
    @Autowired
383
    private OrderService orderService;
23929 amit.gupta 384
 
31697 amit.gupta 385
    @Autowired
386
    private SchemeRepository schemeRepository;
24241 amit.gupta 387
 
31697 amit.gupta 388
    @Autowired
389
    private SchemeItemRepository schemeItemRepository;
31612 tejbeer 390
 
31697 amit.gupta 391
    @Autowired
392
    private JavaMailSender mailSender;
24177 govind 393
 
31697 amit.gupta 394
    @Autowired
395
    private PartnerTargetRepository partnerTargetRepository;
24002 amit.gupta 396
 
31697 amit.gupta 397
    @Autowired
398
    @Qualifier(value = "googleMailSender")
399
    private JavaMailSender googleMailSender;
23929 amit.gupta 400
 
31697 amit.gupta 401
    @Autowired
402
    private InventoryService inventoryService;
23929 amit.gupta 403
 
31697 amit.gupta 404
    @Autowired
405
    private AddressRepository addressRepository;
24542 amit.gupta 406
 
31697 amit.gupta 407
    @Autowired
408
    private RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
24542 amit.gupta 409
 
31697 amit.gupta 410
    @Autowired
411
    private Mongo mongoClient;
24683 amit.gupta 412
 
31697 amit.gupta 413
    @Autowired
414
    private DeviceRepository deviceRepository;
25300 tejbeer 415
 
31697 amit.gupta 416
    @Autowired
417
    private PushNotificationRepository pushNotificationRepository;
25300 tejbeer 418
 
31697 amit.gupta 419
    @Autowired
420
    private NotificationCampaignRepository notificationCampaignRepository;
25300 tejbeer 421
 
31697 amit.gupta 422
    @Autowired
423
    private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
25721 tejbeer 424
 
31697 amit.gupta 425
    @Autowired
426
    private FocusedModelRepository focusedModelRepository;
25721 tejbeer 427
 
31697 amit.gupta 428
    @Autowired
429
    private UserAccountRepository userAccountRepository;
24653 govind 430
 
31697 amit.gupta 431
    @Autowired
432
    private UserRepository userUserRepository;
25721 tejbeer 433
 
31697 amit.gupta 434
    @Autowired
435
    private com.spice.profitmandi.dao.repository.dtr.UserRepository dtrUserRepository;
25927 amit.gupta 436
 
31697 amit.gupta 437
    @Autowired
438
    private UserCampaignRepository userCampaignRepository;
25721 tejbeer 439
 
31697 amit.gupta 440
    @Autowired
441
    private Gson gson;
25721 tejbeer 442
 
31697 amit.gupta 443
    @Autowired
444
    private TicketRepository ticketRepository;
26283 tejbeer 445
 
31697 amit.gupta 446
    @Autowired
447
    private RefferalRepository refferalRepository;
26790 tejbeer 448
 
31697 amit.gupta 449
    @Autowired
450
    private PartnerProblemRepository partnerProblemRepository;
28205 tejbeer 451
 
31697 amit.gupta 452
    @Autowired
453
    private PendingOrderRepository pendingOrderRepository;
28368 tejbeer 454
 
31697 amit.gupta 455
    @Autowired
456
    private PendingOrderItemRepository pendingOrderItemRepository;
28368 tejbeer 457
 
31697 amit.gupta 458
    @Value("${razorpay.account.keyId}")
459
    private String keyId;
28368 tejbeer 460
 
31697 amit.gupta 461
    @Value("${razorpay.account.keySecret}")
462
    private String keySecret;
28368 tejbeer 463
 
31697 amit.gupta 464
    @Autowired
465
    private RazorpayPaymentService razorPaymentService;
28369 tejbeer 466
 
31697 amit.gupta 467
    @Autowired
468
    private RazorPayRepository razorPayRepository;
28369 tejbeer 469
 
31697 amit.gupta 470
    @Autowired
471
    private PendingOrderService pendingOrderService;
28377 tejbeer 472
 
31697 amit.gupta 473
    @Autowired
474
    private CustomerRepository customerRepository;
28377 tejbeer 475
 
31697 amit.gupta 476
    @Autowired
477
    private RestClient restClient;
29308 tejbeer 478
 
31697 amit.gupta 479
    @Autowired
480
    private MandiiService mandiiService;
29814 tejbeer 481
 
31697 amit.gupta 482
    @Autowired
483
    CreditAccountRepository creditAccountRepository;
31604 tejbeer 484
 
31697 amit.gupta 485
    @Autowired
486
    CustomerOfferRepository customerOfferRepository;
31612 tejbeer 487
 
31697 amit.gupta 488
    @Autowired
489
    CustomerOfferItemRepository customerOfferItemRepository;
490
    @Autowired
491
    private FofoSolr fofoSolr;
23724 amit.gupta 492
 
25300 tejbeer 493
 
31697 amit.gupta 494
    private static final Logger LOGGER = LogManager.getLogger(ScheduledTasks.class);
31388 amit.gupta 495
 
34039 vikas.jang 496
    private String FCM_URL = "https://fcm.googleapis.com/v1/projects/api-project-309385327230/messages:send";
497
    private String FCM_SCOPED = "https://www.googleapis.com/auth/cloud-platform";
23724 amit.gupta 498
 
31697 amit.gupta 499
    @Autowired
500
    private TagListingRepository tagListingRepository;
33994 amit.gupta 501
    @Autowired
502
    private RunOnceTasks runOnceTasks;
23724 amit.gupta 503
 
31697 amit.gupta 504
    public void generateDailyRecharge() {
31886 tejbeer 505
        List<RechargeProviderCreditWalletHistory> allCreditHistory = rechargeProviderCreditWalletHistoryRepository.selectAll(0, 2000);
31697 amit.gupta 506
        List<RechargeProvider> rechargeProviders = rechargeProviderRepository.selectAll();
507
        rechargeProviders.stream().forEach(x -> x.setAmount(0));
23724 amit.gupta 508
 
31697 amit.gupta 509
        rechargeProviders.stream().forEach(x -> {
31886 tejbeer 510
            Map<LocalDate, List<RechargeProviderCreditWalletHistory>> dateWiseProviderCreditsMap = allCreditHistory.stream().filter(z -> z.getProviderId() == x.getId()).collect(groupingBy(x1 -> x1.getReceiveTimestamp().toLocalDate()));
23724 amit.gupta 511
 
31697 amit.gupta 512
            LOGGER.info("dateWiseProviderCreditsMap -{}", dateWiseProviderCreditsMap);
513
            LocalDate endDate = LocalDate.now().plusDays(1);
514
            float previousDayClosing = 0;
515
            LocalDate date = LocalDate.of(2018, 4, 6);
516
            while (date.isBefore(endDate)) {
31886 tejbeer 517
                List<RechargeTransaction> dateWiseRechargeTransactions = rechargeTransactionRepository.selectAllBetweenTimestamp(Arrays.asList(RechargeStatus.values()), date.atStartOfDay(), date.plusDays(1).atStartOfDay());
23724 amit.gupta 518
 
31886 tejbeer 519
                List<RechargeTransaction> successfulTransactions = dateWiseRechargeTransactions.stream().filter(y -> y.getStatus().equals(RechargeStatus.SUCCESS)).collect(Collectors.toList());
23724 amit.gupta 520
 
31697 amit.gupta 521
                float dailyAmount = 0;
522
                float totalCommission = 0;
523
                for (RechargeTransaction rechargeTransaction : successfulTransactions) {
524
                    if (rechargeTransaction.getProviderId() == x.getId()) {
525
                        dailyAmount += rechargeTransaction.getAmount();
526
                        totalCommission += rechargeTransaction.getCommission();
527
                    }
528
                }
28205 tejbeer 529
 
31697 amit.gupta 530
                List<RechargeProviderCreditWalletHistory> rechargeHistoryList = dateWiseProviderCreditsMap.get(date);
531
                float dailyWalletRecharge = 0;
532
                if (rechargeHistoryList != null) {
533
                    for (RechargeProviderCreditWalletHistory rechargeProviderCreditWalletHistory : rechargeHistoryList) {
534
                        if (rechargeProviderCreditWalletHistory.getProviderId() == x.getId()) {
535
                            dailyWalletRecharge += rechargeProviderCreditWalletHistory.getAmount();
536
                        }
537
                    }
538
                }
539
                if (dailyAmount > 0 || dailyWalletRecharge > 0) {
540
                    DailyRecharge dailyRecharge = null;
541
                    try {
542
                        dailyRecharge = dailyRechargeRepository.selectByProviderIdAndCreateDate(x.getId(), date);
543
                    } catch (Exception e) {
544
                        LOGGER.info("Could not find Recharge entry");
545
                    }
546
                    if (dailyRecharge == null) {
547
                        dailyRecharge = new DailyRecharge();
548
                        dailyRecharge.setCreateDate(date);
549
                    }
550
                    dailyRecharge.setOpeningBalance(previousDayClosing);
551
                    dailyRecharge.setProviderId(x.getId());
552
                    dailyRecharge.setWalletRechargeAmount(dailyWalletRecharge);
553
                    dailyRecharge.setTotalAmount(dailyAmount);
554
                    dailyRecharge.setTotalCommission(totalCommission);
555
                    float closingBalance = dailyRecharge.getOpeningBalance() + dailyWalletRecharge - dailyAmount;
556
                    dailyRecharge.setClosingBalance(closingBalance);
557
                    dailyRechargeRepository.persist(dailyRecharge);
558
                    x.setAmount(x.getAmount() + dailyRecharge.getClosingBalance() - dailyRecharge.getOpeningBalance());
559
                    previousDayClosing = dailyRecharge.getClosingBalance();
560
                }
561
                date = date.plusDays(1);
562
            }
563
            rechargeProviderRepository.persist(x);
564
        });
565
        LOGGER.info("finished generating daily recharge");
566
    }
24240 amit.gupta 567
 
31697 amit.gupta 568
    public void reconcileRecharge() throws Exception {
569
        LocalDateTime fromDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).minusDays(30);
570
        LocalDateTime toDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS);
571
        List<RechargeStatus> nonSuccessRechargeStatuses = new ArrayList<>(Arrays.asList(RechargeStatus.values()));
572
        LOGGER.info("nonSuccessRechargeStatuses {} ", nonSuccessRechargeStatuses);
573
        nonSuccessRechargeStatuses.remove(RechargeStatus.SUCCESS);
574
        nonSuccessRechargeStatuses.remove(RechargeStatus.FAILED);
575
        RechargeCredential thinkWalnutDigitalRechargeEnquiryCredential = new RechargeCredential();
576
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUrl(thinkWalnutDigitalRechargeEnquiryUrl);
577
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUserName(thinkWalnutDigitalRechargeUserName);
578
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargePassword(thinkWalnutDigitalRechargePassword);
579
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargeAuthKey(thinkWalnutDigitalRechargeAuthKey);
580
        Map<String, RechargeStatus> requestRechargeStatusChanged = new HashMap<>();
31886 tejbeer 581
        List<RechargeTransaction> rechargeTransactions = rechargeTransactionRepository.selectAllBetweenTimestamp(nonSuccessRechargeStatuses, fromDate, toDate);
31697 amit.gupta 582
        for (RechargeTransaction rechargeTransaction : rechargeTransactions) {
583
            try {
584
                int providerId = rechargeTransaction.getProviderId();
585
                if (providerId == 1) {
31886 tejbeer 586
                    oxigenRechargeProviderService.doCheckStatusRequest(oxigenRechargeEnquiryUrl, oxigenRechargeAuthKey, rechargeTransaction);
31697 amit.gupta 587
                } else if (providerId == 2) {
31886 tejbeer 588
                    thinkWalnutDigitalRechargeProviderService.doCheckStatusRequest(thinkWalnutDigitalRechargeEnquiryCredential, rechargeTransaction);
31697 amit.gupta 589
                }
31886 tejbeer 590
                if (rechargeTransaction.getStatus().equals(RechargeStatus.SUCCESS) || rechargeTransaction.getStatus().equals(RechargeStatus.FAILED)) {
591
                    requestRechargeStatusChanged.put(rechargeTransaction.getRequestId(), rechargeTransaction.getStatus());
31697 amit.gupta 592
                }
593
            } catch (Exception e) {
594
                LOGGER.info("Could not check status for Request {}", rechargeTransaction.getRequestId());
595
            }
596
        }
597
        LOGGER.info("Reconcile recharge ran successfully");
598
    }
24241 amit.gupta 599
 
31697 amit.gupta 600
    public void processActivation() throws Exception {
601
        schemeService.processActivation();
602
    }
24241 amit.gupta 603
 
31697 amit.gupta 604
    // TemporaryMethod
605
    public void migrateInvoice() {
606
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectFromSaleDate(LocalDateTime.now().minusDays(3));
607
        Map<Integer, List<FofoOrder>> partnerOrdersMap = new HashMap<>();
31886 tejbeer 608
        partnerOrdersMap = fofoOrders.stream().collect(groupingBy(FofoOrder::getFofoId, Collectors.toList()));
31697 amit.gupta 609
        for (List<FofoOrder> orderList : partnerOrdersMap.values()) {
610
            int sequence = 0;
611
            String prefix = "";
31886 tejbeer 612
            List<FofoOrder> sortedList = orderList.stream().sorted((x1, x2) -> x1.getId() - x2.getId()).collect(Collectors.toList());
31697 amit.gupta 613
            for (FofoOrder order : sortedList) {
23724 amit.gupta 614
 
31697 amit.gupta 615
                LOGGER.info("Order Id is {}, partner Id is {}", order.getId(), order.getFofoId());
616
                if (!order.getInvoiceNumber().contains("SEC")) {
617
                    sequence = Integer.parseInt(order.getInvoiceNumber().split("/")[1]);
618
                    prefix = order.getInvoiceNumber().split("/")[0];
619
                } else {
620
                    sequence += 1;
621
                    String invoiceNumber = prefix + "/" + sequence;
622
                    order.setInvoiceNumber(invoiceNumber);
623
                    fofoOrderRepository.persist(order);
624
                }
625
            }
24252 amit.gupta 626
 
31697 amit.gupta 627
        }
628
    }
28205 tejbeer 629
 
31697 amit.gupta 630
    @Autowired
631
    private ReporticoCacheTableRepository reporticoCacheTableRepository;
28205 tejbeer 632
 
31697 amit.gupta 633
    public void processSchemeOut(List<String> invoiceNumbers) throws Exception {
634
        for (String invoiceNumber : invoiceNumbers) {
635
            System.out.println("Invoice Number - " + invoiceNumber);
636
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
32147 amit.gupta 637
            //orderService.reverseScheme(fofoOrder);
31697 amit.gupta 638
            schemeService.processSchemeOut(fofoOrder.getId(), fofoOrder.getFofoId());
639
        }
640
    }
24271 amit.gupta 641
 
31697 amit.gupta 642
    public void processSchemeIn(List<String> invoiceNumbers) throws Exception {
643
        for (String invoiceNumber : invoiceNumbers) {
644
            System.out.println("Invoice Number - " + invoiceNumber);
645
            Purchase purchase = purchaseRepository.selectByPurchaseReference(invoiceNumber);
646
            schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
647
        }
648
    }
24271 amit.gupta 649
 
31697 amit.gupta 650
    public void processScheme(LocalDateTime startDate, LocalDateTime endDate, boolean dryRun) throws Exception {
651
        LOGGER.info("Started execution at {}", LocalDateTime.now());
652
        System.out.println(
653
                "InventoryId\tSerialNumber\tItem Id\tScheme Id\tScheme Name\tScheme Type\tAmount Type\tDP\tTaxable\tScheme Amount\tAmount Paid");
654
        try {
655
            List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
656
            for (Purchase purchase : purchases) {
657
                schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
658
            }
29160 amit.gupta 659
 
31697 amit.gupta 660
            List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
661
            for (FofoOrder fofoOrder : fofoOrders) {
662
                schemeService.processSchemeOut(fofoOrder.getId(), fofoOrder.getFofoId());
663
            }
664
        } catch (Exception e) {
665
            e.printStackTrace();
666
            throw e;
667
        }
31886 tejbeer 668
        List<UserWalletHistory> uwhs = userWalletHistoryRepository.selectAllByDateType(LocalDate.now().atStartOfDay(), endDate, Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
31697 amit.gupta 669
        System.out.println("Amount\tReference\tReferenceType\tTimestamp\tDescription");
670
        for (UserWalletHistory uwh : uwhs) {
31886 tejbeer 671
            System.out.println(String.format("%d\t%d\t%s\t%s\t%s", uwh.getAmount(), uwh.getReference(), uwh.getReferenceType(), uwh.getTimestamp().toString(), uwh.getDescription()));
31697 amit.gupta 672
        }
673
        LOGGER.info("Schemes processed successfully.");
674
        if (dryRun) {
675
            throw new Exception();
676
        }
677
    }
29160 amit.gupta 678
 
31697 amit.gupta 679
    public void processRechargeCashback() throws Throwable {
680
        LocalDateTime cashbackTime = LocalDateTime.now();
681
        int referenceId = (int) Timestamp.valueOf(cashbackTime).getTime() / 1000;
31886 tejbeer 682
        List<RechargeTransaction> pendingTransactions = rechargeTransactionRepository.getPendingCashBackRehargeTransactions();
31697 amit.gupta 683
        Map<Object, Double> totalRetailerCashbacks = pendingTransactions.stream().collect(
31724 amit.gupta 684
                groupingBy(x -> x.getRetailerId(), Collectors.summingDouble(x -> x.getCommission())));
33452 amit.gupta 685
        for (Entry<Object, Double> totalRetailerCashback : totalRetailerCashbacks.entrySet()) {
31697 amit.gupta 686
            int retailerId = (Integer) totalRetailerCashback.getKey();
687
            float amount = totalRetailerCashback.getValue().floatValue();
688
            if (Math.round(amount) > 0) {
31886 tejbeer 689
                walletService.addAmountToWallet(retailerId, referenceId, WalletReferenceType.CASHBACK, "Recharge Cashback", Math.round(amount), LocalDateTime.now());
31697 amit.gupta 690
            }
691
        }
692
        for (RechargeTransaction rt : pendingTransactions) {
693
            rt.setCashbackTimestamp(cashbackTime);
694
            rt.setCashbackReference(referenceId);
695
            rechargeTransactionRepository.persist(rt);
696
        }
697
        LOGGER.info("Cashbacks for Recharge processed Successfully");
698
    }
29160 amit.gupta 699
 
35521 amit 700
    public void rollOutUpgardedMarginsNextMonth(List<Integer> fofoIds) throws Exception {
31697 amit.gupta 701
        LocalDate startOfPreviousMonth = LocalDate.now().with(ChronoField.DAY_OF_MONTH, 1).minusMonths(1);
35521 amit 702
        List<FofoStore> stores;
703
        if (fofoIds != null || fofoIds.isEmpty()) {
704
            stores = fofoStoreRepository.selectActiveStores();
705
        } else {
706
            stores = fofoStoreRepository.selectByRetailerIds(fofoIds);
707
        }
31697 amit.gupta 708
        for (FofoStore store : stores) {
32003 amit.gupta 709
            this.rolloutMarginForStoreOnMonth(store, startOfPreviousMonth);
710
        }
711
    }
29252 amit.gupta 712
 
32003 amit.gupta 713
    public void rolloutMarginForStoreOnMonth(FofoStore store, LocalDate startOfMonth) throws ProfitMandiBusinessException {
714
        int fofoId = store.getId();
29252 amit.gupta 715
 
32003 amit.gupta 716
        PartnerType startOfPreviousMonthPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, startOfMonth);
34777 amit.gupta 717
        PartnerType todayPartnerType = partnerTypeChangeService.getTypeOnMonth(fofoId, YearMonth.from(startOfMonth));
32003 amit.gupta 718
        if (!startOfPreviousMonthPartnerType.nextPartnerTypes().contains(todayPartnerType)) {
719
            return;
720
        }
721
        if (!startOfPreviousMonthPartnerType.equals(todayPartnerType)) {
722
            LOGGER.info("Partner Type has been changed for code {} from {} to {}", store.getCode(), startOfPreviousMonthPartnerType, todayPartnerType);
723
            List<FofoOrder> fofoOrders = fofoOrderRepository.selectByFofoId(fofoId, startOfMonth.atStartOfDay(), startOfMonth.plusMonths(1).atStartOfDay(), 0, 0);
724
            for (FofoOrder fofoOrder : fofoOrders) {
725
                schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
31697 amit.gupta 726
            }
727
        }
728
    }
29252 amit.gupta 729
 
32003 amit.gupta 730
 
35521 amit 731
    public void rollOutUpgardedMargins(List<Integer> fofoIds) throws Exception {
31697 amit.gupta 732
        LocalDate today = LocalDate.now();
733
        LocalDate yesterday = today.minusDays(1);
734
        int upgradedCount = 0;
35521 amit 735
        List<FofoStore> stores;
736
        if (fofoIds == null || fofoIds.isEmpty()) {
737
            stores = fofoStoreRepository.selectActiveStores();
738
        } else {
739
            stores = fofoStoreRepository.selectByRetailerIds(fofoIds);
740
        }
35461 amit 741
 
742
        // Bulk fetch partner types to avoid N+1 queries
743
        Map<Integer, PartnerType> yesterdayTypeMap = partnerTypeChangeService.getTypesForFofoIds(fofoIds, yesterday);
744
        Map<Integer, PartnerType> todayTypeMap = partnerTypeChangeService.getTypesForFofoIds(fofoIds, today);
745
 
31697 amit.gupta 746
        StringBuilder sb = new StringBuilder();
747
        for (FofoStore store : stores) {
748
            int fofoId = store.getId();
23724 amit.gupta 749
 
35461 amit 750
            PartnerType yesterdayPartnerType = yesterdayTypeMap.get(fofoId);
751
            PartnerType todayPartnerType = todayTypeMap.get(fofoId);
752
            if (yesterdayPartnerType == null || todayPartnerType == null) {
753
                continue;
754
            }
31697 amit.gupta 755
            if (!yesterdayPartnerType.nextPartnerTypes().contains(todayPartnerType)) {
756
                continue;
757
            }
758
            if (!yesterdayPartnerType.equals(todayPartnerType)) {
759
                upgradedCount++;
31886 tejbeer 760
                sb.append(String.format("Partner Type has been changed for code %s from %s to %s", store.getCode(), yesterdayPartnerType.toString(), todayPartnerType.toString()));
31697 amit.gupta 761
                sb.append("<br>");
31886 tejbeer 762
                LOGGER.info("Partner Type has been changed for code {} from {} to {}", store.getCode(), yesterdayPartnerType, todayPartnerType);
763
                List<FofoOrder> fofoOrders = fofoOrderRepository.selectByFofoId(fofoId, yesterday.withDayOfMonth(1).atStartOfDay(), yesterday.atStartOfDay(), 0, 0);
31697 amit.gupta 764
                for (FofoOrder fofoOrder : fofoOrders) {
765
                    schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
766
                }
30390 amit.gupta 767
 
31697 amit.gupta 768
            }
769
        }
770
        if (upgradedCount > 0) {
32439 tejbeer 771
            sendMailOfHtmlFormat(googleMailSender, new String[]{"amit.gupta@smartdukaan.com", "tarun.verma@smartdukaan.com", "neeraj.gupta@smartdukaan.com"}, sb.toString(), null, "Few Partners Category have been Upgraded");
31697 amit.gupta 772
        } else {
32439 tejbeer 773
            sendMailOfHtmlFormat(googleMailSender, new String[]{"amit.gupta@smartdukaan.com", "tarun.verma@smartdukaan.com", "neeraj.gupta@smartdukaan.com"}, sb.toString(), null, "No partners Category have been upgraded today");
31697 amit.gupta 774
        }
775
    }
30393 amit.gupta 776
 
31697 amit.gupta 777
    @Autowired
778
    private PartnerStatsService partnerStatsService;
30393 amit.gupta 779
 
35521 amit 780
// Temporary Method
30393 amit.gupta 781
 
31697 amit.gupta 782
    public void fetchParnterStats() throws Exception {
783
        Map<Integer, PartnerDetailModel> partnerStats = partnerStatsService.getAllPartnerStats();
784
        ObjectOutputStream oos = null;
785
        FileOutputStream fout = null;
786
        try {
34666 ranu 787
//            fout = new FileOutputStream("/tmp/partnerStat.tmp", false);
788
            fout = new FileOutputStream("/var/www/partner_stats/partnerStat.tmp", false);
31697 amit.gupta 789
            oos = new ObjectOutputStream(fout);
790
            oos.writeObject(partnerStats);
30637 amit.gupta 791
 
31697 amit.gupta 792
        } catch (Exception ex) {
793
            ex.printStackTrace();
794
        } finally {
795
            if (oos != null) {
796
                oos.close();
797
            }
798
        }
32421 amit.gupta 799
        ReporticoCacheTable reporticoCacheTable = reporticoCacheTableRepository.selectByTableName("partnerStat");
800
        if (reporticoCacheTable == null) {
801
            reporticoCacheTable = new ReporticoCacheTable();
802
            reporticoCacheTable.setTableName("partnerStat");
803
            reporticoCacheTable.setLastCreatedTimestamp(LocalDateTime.now());
804
            reporticoCacheTableRepository.persist(reporticoCacheTable);
31697 amit.gupta 805
        } else {
32421 amit.gupta 806
            reporticoCacheTable.setLastCreatedTimestamp(LocalDateTime.now());
31697 amit.gupta 807
        }
808
    }
31008 amit.gupta 809
 
31697 amit.gupta 810
    public void processPriceDrop() throws Exception {
31886 tejbeer 811
        List<PriceDrop> priceDrops = priceDropRepository.selectAllByDatesBetween(LocalDateTime.now(), LocalDateTime.now().minusYears(1));
31697 amit.gupta 812
        for (PriceDrop priceDrop : priceDrops) {
813
            if (priceDrop.getDropAmount() > 0) {
814
                priceDropService.processPriceDrop(priceDrop.getId(), true);
815
            }
816
        }
817
    }
31008 amit.gupta 818
 
31697 amit.gupta 819
    @Autowired
820
    CreditNoteService creditNoteService;
25598 amit.gupta 821
 
31697 amit.gupta 822
    public void sendCreditNote(YearMonth yearMonth) throws Exception {
823
        creditNoteService.issueMonthlyMarginsCN(yearMonth);
824
    }
25598 amit.gupta 825
 
31918 amit.gupta 826
    @Autowired
827
    BrandAgeingLimitRepository brandAgeingLimitRepository;
828
 
829
    @Autowired
830
    AgeingService ageingService;
831
 
33928 ranu 832
    @Autowired
833
    RbmTargetService rbmTargetService;
834
 
31918 amit.gupta 835
    public void sendMailForAgeingAlert() throws Exception {
836
        //brandAgeingLimitRepository.selectAll();
837
        Map<String, AgeingModel> ageingModelMap = ageingService.getAllAgeingForSecondary();
838
 
839
        System.out.println(ageingModelMap.size());
840
        List<PartnerAgeingModel> partnerAgeingModels = ageingService.getAllAgeingForTertiary();
841
 
842
 
33452 amit.gupta 843
        ByteArrayOutputStream byteArrayOutputStream = FileUtil.getCSVByteStream(Arrays.asList("InventoryItemId", "Serial Number", "Item Id", "Brand", "Model Name", "ModelNumber", "Color", "Exceed Days", "Last ScanType", "Supplier Name", "Current Warehouse", "First Warehouse", "Invoice Number", "Invoice Date"), ageingModelMap.values().stream().map(x -> Arrays.asList(x.getInventoryItemId(), x.getSerialNumber(), x.getItemId(), x.getBrand(), x.getModelName(), x.getModelNumber(), x.getColor(), x.getExceedDays(), x.getLastScanType(), x.getSupplierName(), x.getCurrentWarehouse(), x.getFirstWarehouse(), x.getInvoiceNumber(), FormattingUtils.formatDate(x.getInvoiceDate()))).collect(Collectors.toList()));
31918 amit.gupta 844
 
33452 amit.gupta 845
        ByteArrayOutputStream byteArrayOutputStream2 = FileUtil.getCSVByteStream(Arrays.asList("InventoryItemId", "Serial Number", "Item Id", "Brand", "Model Name", "ModelNumber", "Color", "Partner Id", "Partner Code", "Partner Name", "Activation Type", "City", "State", "Billing Date", "Exceed Days", "Max Ageing", "Activation Date"), partnerAgeingModels.stream().map(x -> Arrays.asList(x.getInventoryItemId(), x.getSerialNumber(), x.getItemId(), x.getBrand(), x.getModelName(), x.getModelNumber(), x.getColor(), x.getFofoId(), x.getFofoCode(), x.getFofoName(), x.getActivationType(), x.getFofoCity(), x.getFofoState(), FormattingUtils.formatDate(x.getBillingDate()), x.getExceedDays(), x.getMaxAgeingDays(), x.getActivationDate())).collect(Collectors.toList()));
846
        Attachment attachment1 = new Attachment("secondary-alert.csv", new ByteArrayResource(byteArrayOutputStream.toByteArray()));
847
        Attachment attachment2 = new Attachment("tertiary-alert.csv", new ByteArrayResource(byteArrayOutputStream2.toByteArray()));
31918 amit.gupta 848
 
849
        String mailSubject = "Stock ageing Alert";
850
        Utils.sendMailWithAttachments(mailSender, new String[]{"deena.nath@smartdukaan.com"}, null, mailSubject, "PFA", attachment1, attachment2);
851
    }
852
 
32724 amit.gupta 853
    public void rejectPriceDropsOfApprovedImeis() throws ProfitMandiBusinessException {
32690 amit.gupta 854
        priceDropService.rejectPriceDropsOfApprovedImeis();
855
    }
856
 
33357 amit.gupta 857
    public void processDeductions() {
858
        sidbiService.processDeductions();
859
    }
860
 
35521 amit 861
    public void resetHardLimit() throws ProfitMandiBusinessException {
33904 amit.gupta 862
        sdCreditService.resetHardLimit();
863
    }
864
 
35021 amit 865
    public void testInvoiceFormat() throws ProfitMandiBusinessException {
866
        InvoicePdfModel invoicePdfModel = orderService.getInvoicePdfModel(560280);
867
        //System.out.println(InvoiceFormatter.buildInvoiceLines(invoicePdfModel, InvoiceFormatter.WIDTH_80MM));
868
    }
869
 
35326 amit 870
    public void sendTrialExpiry() {
871
        List<FofoStore> stores = fofoStoreRepository.selectAllTrial();
35521 amit 872
        List<FofoStore> twoDaysToExpiry = stores.stream().filter(x -> x.getTrialEnd().minusDays(2).equals(LocalDate.now())).collect(Collectors.toList());
35326 amit 873
 
35521 amit 874
        List<FofoStore> fiveDaysToExpiry = stores.stream().filter(x -> x.getTrialEnd().minusDays(5).equals(LocalDate.now())).collect(Collectors.toList());
875
        List<FofoStore> expiredToday = stores.stream().filter(x -> x.getTrialEnd().equals(LocalDate.now())).collect(Collectors.toList());
876
        List<FofoStore> expired = stores.stream().filter(x -> x.getTrialEnd().isAfter(LocalDate.now())).collect(Collectors.toList());
35326 amit 877
    }
878
 
34710 amit.gupta 879
    /*public void processCashDiscount() throws ProfitMandiBusinessException {
880
        System.out.println("processing cash discount");
881
        List<Loan> loansSettledYesterday = loanRepository.selectLoansSettledOn(LocalDate.now().minusDays(1));
882
        loansSettledYesterday.addAll(loanRepository.selectLoansSettledOn(LocalDate.now()));
883
        Map<Integer, List<Loan>> partnerSettledLoans = loansSettledYesterday.stream().collect(Collectors.groupingBy(x -> x.getFofoId()));
884
        for (Entry<Integer, List<Loan>> partnerLoans : partnerSettledLoans.entrySet()) {
885
            List<Loan> fullCdLoans = partnerLoans.getValue().stream().filter(x -> x.getInvoiceNumber() != null && x.getDays() <= ProfitMandiConstants.LOAN_PARTIAL_CREDIT_DAYS).collect(toList());
886
            List<Loan> partialCdLoans = partnerLoans.getValue().stream().filter(x -> x.getInvoiceNumber() != null && x.getDays() > ProfitMandiConstants.LOAN_PARTIAL_CREDIT_DAYS &&
887
                    x.getDays() <= ProfitMandiConstants.LOAN_FULL_CREDIT_DAYS).collect(toList());
888
            //List<Loan> noCdLoans = loanRepository.selectLoansDueByDays()
889
            //
890
            for (Loan fullCdLoan : fullCdLoans) {
891
                LOGGER.info("FullCdLoan - {}", fullCdLoan);
892
                schemeService.processFullCD(fullCdLoan.getInvoiceNumber());
893
            }
894
 
895
            for (Loan partialCdLoan : partialCdLoans) {
896
                schemeService.processPartialCD(partialCdLoan.getInvoiceNumber());
897
            }
898
 
899
            *//*for (Loan noCdLoan : noCdLoans) {
900
                schemeService.processNoCD(noCdLoan.getInvoiceNumber());
901
            }*//*
902
        }
903
 
904
    }*/
905
 
31697 amit.gupta 906
    private class SaleRoles {
25598 amit.gupta 907
 
31697 amit.gupta 908
        private List<String> l1;
909
        private List<String> l2;
25598 amit.gupta 910
 
31697 amit.gupta 911
        public SaleRoles() {
912
            l1 = new ArrayList<>();
913
            l2 = new ArrayList<>();
914
        }
25598 amit.gupta 915
 
31697 amit.gupta 916
        public List<String> getL1() {
917
            return l1;
918
        }
25598 amit.gupta 919
 
31697 amit.gupta 920
        public List<String> getL2() {
921
            return l2;
922
        }
26945 amit.gupta 923
 
31697 amit.gupta 924
    }
26945 amit.gupta 925
 
31697 amit.gupta 926
    private class FofoReportingModel {
927
        private String code;
928
        private int fofoId;
929
        private String businessName;
930
        private String territoryManager;
931
        private String regionalManager;
932
        private String businessManager;
26945 amit.gupta 933
 
31697 amit.gupta 934
        public String getCode() {
935
            return code;
936
        }
26945 amit.gupta 937
 
31697 amit.gupta 938
        public void setCode(String code) {
939
            this.code = code;
940
        }
26945 amit.gupta 941
 
31697 amit.gupta 942
        public String getBusinessName() {
943
            return businessName;
944
        }
26945 amit.gupta 945
 
31697 amit.gupta 946
        public void setBusinessName(String businessName) {
947
            this.businessName = businessName;
948
        }
26945 amit.gupta 949
 
31697 amit.gupta 950
        public String getTerritoryManager() {
951
            return territoryManager;
952
        }
26945 amit.gupta 953
 
31697 amit.gupta 954
        public void setTerritoryManager(String territoryManager) {
955
            this.territoryManager = territoryManager;
956
        }
26945 amit.gupta 957
 
31697 amit.gupta 958
        public String getRegionalManager() {
959
            return regionalManager;
960
        }
26945 amit.gupta 961
 
31697 amit.gupta 962
        public void setRegionalManager(String regionalManager) {
963
            this.regionalManager = regionalManager;
964
        }
26945 amit.gupta 965
 
31697 amit.gupta 966
        private ScheduledTasks getOuterType() {
967
            return ScheduledTasks.this;
968
        }
26945 amit.gupta 969
 
31697 amit.gupta 970
        @Override
971
        public String toString() {
31886 tejbeer 972
            return "FofoReportingModel{" + "code='" + code + '\'' + ", fofoId=" + fofoId + ", businessName='" + businessName + '\'' + ", territoryManager='" + territoryManager + '\'' + ", regionalManager='" + regionalManager + '\'' + ", businessManager='" + businessManager + '\'' + '}';
31697 amit.gupta 973
        }
26945 amit.gupta 974
 
31697 amit.gupta 975
        @Override
976
        public boolean equals(Object o) {
977
            if (this == o) return true;
978
            if (o == null || getClass() != o.getClass()) return false;
979
            FofoReportingModel that = (FofoReportingModel) o;
980
            return fofoId == that.fofoId && Objects.equals(code, that.code) && Objects.equals(businessName, that.businessName) && Objects.equals(territoryManager, that.territoryManager) && Objects.equals(regionalManager, that.regionalManager) && Objects.equals(businessManager, that.businessManager);
981
        }
26945 amit.gupta 982
 
31697 amit.gupta 983
        @Override
984
        public int hashCode() {
985
            return Objects.hash(code, fofoId, businessName, territoryManager, regionalManager, businessManager);
986
        }
26945 amit.gupta 987
 
31697 amit.gupta 988
        public String getBusinessManager() {
989
            return businessManager;
990
        }
26945 amit.gupta 991
 
31697 amit.gupta 992
        public void setBusinessManager(String businessManager) {
993
            this.businessManager = businessManager;
994
        }
25351 tejbeer 995
 
31697 amit.gupta 996
        public int getFofoId() {
997
            return fofoId;
998
        }
25598 amit.gupta 999
 
31697 amit.gupta 1000
        public void setFofoId(int fofoId) {
1001
            this.fofoId = fofoId;
1002
        }
25598 amit.gupta 1003
 
31697 amit.gupta 1004
    }
26945 amit.gupta 1005
 
31697 amit.gupta 1006
    @Autowired
1007
    WarehouseInventoryItemRepository warehouseInventoryItemRepository;
26945 amit.gupta 1008
 
31746 amit.gupta 1009
    @Autowired
1010
    OfferService offerService;
1011
 
1012
    @Autowired
1013
    PurchaseReturnItemRepository purchaseReturnItemRepository;
1014
 
31918 amit.gupta 1015
    @Autowired
1016
    BrandRegionMappingRepository brandRegionMappingRepository;
1017
 
32161 tejbeer 1018
    @Autowired
1019
    StandAlone standAlone;
32214 jai.hind 1020
    @Autowired
1021
    ItelImeiActivationNewService itelImeiActivationNewService;
32350 amit.gupta 1022
 
1023
    public void checkItelImeiActivationNew(LocalDate date, Integer day) throws Exception {
32063 amit.gupta 1024
        try {
32223 amit.gupta 1025
            itelImeiActivationNewService.checkItelImeiActivationNew(date, day);
32063 amit.gupta 1026
        } catch (Throwable e) {
1027
            throw new Exception(e);
1028
        }
32223 amit.gupta 1029
    }
32062 amit.gupta 1030
 
32511 amit.gupta 1031
    @Autowired
1032
    PurchaseReturnService purchaseReturnService;
1033
 
32682 amit.gupta 1034
    @Autowired
1035
    JavaMailSender javaMailSender;
1036
 
32795 amit.gupta 1037
    @Autowired
1038
    OfferPayoutRepository offerPayoutRepository;
1039
 
1040
    @Autowired
1041
    OfferRepository offerRepository;
1042
 
32817 amit.gupta 1043
    @Autowired
1044
    BluedartAuthService bluedartAuthService;
1045
    @Autowired
1046
    BluedartService bluedartService;
1047
 
1048
    @Autowired
1049
    TransactionRelatedTasks transactionRelatedTasks;
1050
 
32872 amit.gupta 1051
    @Autowired
1052
    PsiSmartService psiSmartService;
32948 amit.gupta 1053
 
32961 amit.gupta 1054
    private void migrateValentine() throws ProfitMandiBusinessException {
1055
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.now().atStartOfDay(), LocalDateTime.now());
1056
        for (FofoOrder fofoOrder : fofoOrders) {
1057
            orderService.processScratchOffer(fofoOrder);
1058
        }
1059
    }
33051 amit.gupta 1060
 
32990 amit.gupta 1061
    @Autowired
1062
    InvoiceService invoiceService;
1063
 
33384 amit.gupta 1064
    @Autowired
1065
    WarehouseService warehouseService;
1066
 
33452 amit.gupta 1067
    @Autowired
1068
    GenericRepository genericRepository;
1069
 
1070
    @Autowired
1071
    PriceCircularService priceCircularService;
1072
 
34611 ranu 1073
    /*@Autowired
1074
    RedisCacheManager redisFortnightlyCacheManage;*/
33638 amit.gupta 1075
 
1076
    @Autowired
1077
    GstProAuthService gstProAuthService;
33664 amit.gupta 1078
 
33817 amit.gupta 1079
    @Autowired
1080
    GstProService gstProService;
1081
 
1082
    @Autowired
1083
    WarehouseProviderRepository warehouseProviderRepository;
33928 ranu 1084
 
34160 tejus.loha 1085
    @Autowired
1086
    LoiFormRepository loiFormRepository;
1087
    @Autowired
1088
    PartnerOnBoardingPanelRepository partnerOnBoardingPanelRepository;
1089
    @Autowired
1090
    StoreTimelineTatService storeTimelineTatService;
1091
    @Autowired
1092
    PartnerDealerRepository partnerDealerRepository;
33664 amit.gupta 1093
 
34275 tejus.loha 1094
    @Autowired
1095
    PurSaleService purSaleService;
1096
 
34502 amit.gupta 1097
    @Autowired
1098
    CatalogRepository catalogRepository;
1099
 
34510 amit.gupta 1100
    private void rolloutOppoPayout() throws Exception {
34504 amit.gupta 1101
        //List<Integer> schemeIds = Arrays.asList(5540, 5542, 5544,5918, 5919, 5920, 5921, 5922);
1102
        List<Integer> schemeIds = Arrays.asList(5540, 5542, 5544, 5545, 5550, 5555, 5556, 5557, 5564, 5565, 5566, 5567, 5569, 5570, 5582, 5590, 5592, 5593, 5594,
34502 amit.gupta 1103
                5595, 5598, 5602, 5604, 5605, 5606, 5607, 5608, 5611, 5618, 5620, 5621, 5622, 5623, 5624, 5625, 5626, 5629, 5631,
1104
                5633, 5634, 5635, 5637, 5644, 5649, 5655, 5659, 5662, 5668, 5672, 5674, 5679, 5683, 5684, 5685, 5688, 5689, 5690,
1105
                5692, 5694, 5697, 5699, 5700, 5706, 5718, 5729, 5730, 5754, 5756, 5758, 5759, 5761, 5762, 5766, 5769, 5771, 5772,
1106
                5773, 5774, 5775, 5776, 5781, 5782, 5783, 5786, 5788, 5790, 5795, 5800, 5803, 5804, 5807, 5809, 5815, 5816, 5819,
1107
                5820, 5821, 5822, 5823, 5824, 5825, 5826, 5827, 5828, 5829, 5830, 5832, 5833, 5834, 5835, 5836, 5837, 5839, 5840,
1108
                5841, 5842, 5843, 5844, 5845, 5846, 5847, 5848, 5849, 5850, 5851, 5852, 5853, 5854, 5855, 5857, 5859, 5860, 5863,
1109
                5864, 5866, 5869, 5870, 5871, 5872, 5873, 5874, 5875, 5877, 5878, 5879, 5880, 5885, 5888, 5889, 5891, 5892, 5894,
1110
                5899, 5901, 5903, 5905, 5908, 5910, 5913, 5916, 5917, 5918, 5919, 5920, 5921, 5922, 5923, 5924, 5925, 5926, 5927,
1111
                5928, 5929, 5930, 5931, 5932, 5933, 5934, 5935, 5936, 5938, 5939, 5940, 5941, 5942, 5943, 5944, 5945, 5946, 5947,
1112
                5948, 5949, 5950, 5951, 5952, 5953, 5954, 5955, 5956, 5957, 5958, 5959, 5960, 5961, 5962, 5963, 5964, 5965, 5966,
1113
                5967, 5968, 5969, 5970, 5971, 5972, 5973, 5974, 5975, 5976, 5977, 5979, 5980, 5981, 5982, 5983, 5984, 5985, 5986,
1114
                5987, 5989, 5990, 5991, 5992, 5996, 5997, 5998, 5999, 6000, 6001, 6002, 6003, 6004, 6005, 6006, 6007, 6008, 6010,
1115
                6011, 6012, 6013, 6014, 6015, 6016, 6017, 6018, 6019, 6020, 6021, 6022, 6023, 6024, 6025, 6026, 6028, 6029, 6030,
1116
                6031, 6032, 6033, 6034, 6035, 6036, 6037, 6038, 6039, 6040, 6041, 6042, 6043, 6044, 6045, 6046, 6047, 6048, 6049,
1117
                6050, 6051, 6052, 6053, 6054, 6055, 6056, 6057, 6058, 6059, 6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068,
1118
                6069, 6070, 6071, 6072, 6073, 6078, 6079, 6080, 6081, 6082, 6083, 6084, 6085, 6086, 6087, 6088, 6089, 6091, 6092,
34504 amit.gupta 1119
                6093, 6094, 6095, 6098, 6102);
34502 amit.gupta 1120
        Map<Integer, List<SchemeInOut>> inventoryItemSiosMap = schemeInOutRepository.selectBySchemeIds(new HashSet<>(schemeIds)).stream().collect(Collectors.groupingBy(x -> x.getInventoryItemId()));
1121
        Map<Integer, InventoryItem> inventoryItemMap = inventoryItemRepository.selectByIds(inventoryItemSiosMap.keySet()).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
1122
        Set<Integer> itemIds = itemRepository.selectAllByBrand("Oppo", 10006).stream().map(x -> x.getId()).collect(toSet());
1123
        List<InventoryItem> filteredInventoryItems = inventoryItemMap.values().stream().filter(x -> itemIds.contains(x.getItemId())).collect(Collectors.toList());
34510 amit.gupta 1124
 
1125
        Map<Integer, List<InventoryItem>> purchaseInventoryItemsMap = filteredInventoryItems.stream().filter(x -> x.getCreateTimestamp().isAfter(YearMonth.now().atDay(1).atStartOfDay())).collect(Collectors.groupingBy(x -> x.getPurchaseId()));
1126
        List<Purchase> purchases = purchaseRepository.selectAllByIds(new ArrayList<>(purchaseInventoryItemsMap.keySet()));
1127
        for (Purchase purchase : purchases) {
1128
            String invoiceNumber = purchase.getPurchaseReference();
1129
            LocalDateTime billingTime = orderRepository.selectByInvoiceNumber(invoiceNumber).get(0).getBillingTimestamp();
1130
            if (billingTime.isAfter(YearMonth.now().atDay(1).atStartOfDay())) {
1131
                schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
1132
            }
1133
        }
1134
 
34502 amit.gupta 1135
        for (InventoryItem filteredInventoryItem : filteredInventoryItems) {
34504 amit.gupta 1136
            //System.out.println("Serial Number is - " + filteredInventoryItem.getSerialNumber());
34502 amit.gupta 1137
            List<ScanRecord> scanRecords = scanRecordRepository.selectByInventoryItemId(filteredInventoryItem.getId());
1138
            ScanRecord scanRecord = scanRecords.stream().filter(x -> x.getType().equals(ScanType.SALE)).findFirst().orElse(null);
1139
            if (scanRecord == null) {
1140
                continue;
1141
            }
34510 amit.gupta 1142
            schemeService.processSchemeOut(scanRecord.getOrderId(), scanRecord.getFofoId());
34502 amit.gupta 1143
        }
1144
    }
1145
 
35021 amit 1146
    @Autowired
1147
    AbmReportSender abmReportSender;
34510 amit.gupta 1148
 
35021 amit 1149
    public void sendOverDueReport() {
1150
        List<Loan> loans = loanRepository.selectAllActiveLoan();
35521 amit 1151
        Map<Integer, List<Loan>> partnerLoansMap = loans.stream().filter(x -> x.isOverdue()).collect(Collectors.groupingBy(x -> x.getFofoId()));
35021 amit 1152
        //sdCreditService.getDueDateCrossLoan()
35521 amit 1153
        partnerLoansMap.entrySet().stream().forEach(x -> {
34858 amit 1154
 
35021 amit 1155
            x.getKey();
1156
            x.getValue().size();
1157
        });
34858 amit 1158
 
35021 amit 1159
    }
1160
 
35295 amit 1161
    @Autowired
1162
    OnBoardingRelatedSchelduleTask onBoardingRelatedSchelduleTask;
1163
 
1164
    @Autowired
1165
    Migrations migrations;
1166
 
1167
    /*@Autowired
1168
    BenowService benowService;*/
1169
 
1170
    @Autowired
1171
    TrialFormRepository trialFormRepository;
1172
 
1173
    @Autowired
1174
    CreditBlockedExceptionPartnersRepository creditBlockedExceptionPartnersRepository;
1175
 
1176
    @Autowired
1177
    SDCreditService sdCreditService;
1178
 
35393 amit 1179
    @Autowired
1180
    com.spice.profitmandi.service.integrations.pinelabs.PinelabsAffordabilityService pinelabsAffordabilityService;
1181
 
1182
    @Autowired
1183
    com.spice.profitmandi.service.integrations.pinelabs.PinelabsAuthService pinelabsAuthService;
35521 amit 1184
 
35393 amit 1185
    public void testAffordability() {
1186
        Money orderAmount = new Money("1000000", "INR");
1187
        Money discountAmount = new Money("0", "INR");
1188
        List<ProductDetails> productDetails = Arrays.asList(new ProductDetails(orderAmount, discountAmount, "Alpha_2"));
1189
        OfferDiscoveryRequest offerDiscoveryRequest = new com.spice.profitmandi.service.integrations.pinelabs.dto.OfferDiscoveryRequest(orderAmount, productDetails, new AffordabilityIssuer("12345678"));
1190
        OfferDiscoveryResponse offerDiscoveryResponse = pinelabsAffordabilityService.discoverOffers(offerDiscoveryRequest);
1191
        System.out.println(offerDiscoveryResponse);
1192
    }
35521 amit 1193
 
35021 amit 1194
    public void test() throws Exception {
35393 amit 1195
 
1196
        System.out.println(pinelabsAuthService.getAccessToken());
1197
        testAffordability();
1198
 
35295 amit 1199
        //System.out.println(trialFormRepository.selectByEmailOrMobile("9990381568"));
1200
        /*CreditBlockedExceptionPartner creditBlockedExceptionPartner = creditBlockedExceptionPartnersRepository.select(175139430);
1201
        System.out.println(creditBlockedExceptionPartner);*/
35330 amit 1202
        //this.updatePartnerLimit(175139595);
35393 amit 1203
        //this.releaseBlockedLimit();
35326 amit 1204
        //sdCreditService.resetHardLimit();
35295 amit 1205
        //migrations.migrateSerialInvoiceMap();
35151 amit 1206
        //runOnceTasks.checkRewardsEligibility();
35295 amit 1207
        //hybridEncryptor.getJwt();
1208
        /*System.out.printf("Date|Transaction Id|Serial Number|Sale Amount|Swipe Payout|Discount Payout%n");
1209
        for(int i=0;i<10;i++){
1210
            benowService.parseBenowTransaction(LocalDate.now().minusDays(i));
1211
        }*/
1212
        //onBoardingRelatedSchelduleTask.onboardingEventDelays();
35177 amit 1213
        //runOnceTasks.migrateLimit();866009067657118
1214
        //TODO -- Sales Return Pending
1215
        //runOnceTasks.moveSaleReturnScanToDoa("866009067657118");
35295 amit 1216
        //runOnceTasks.sendCreditExposureReport();
35177 amit 1217
        //runOnceTasks.moveDoaScanToSaleReturn("868770072438608");
35150 vikas 1218
        //runOnceTasks.purchasePolicy();
35105 vikas 1219
        //purSaleService.moreThen10DaysEgedStockReport();
35102 amit 1220
        //System.out.println(schemeService.testRedis(1, 2L));
1221
        //System.out.println(schemeService.testRedis(1, null));
35177 amit 1222
        // abmReportSender.sendAbmSmartCartReport();
1223
        //this.sendOverDueReport();
35053 amit 1224
        /*List<Integer> orderIds = Arrays.asList(1929879,1932372,1932377,1932386,1932396,1935221,1935563,1935564,1945144,1955256,1955271,1955294,1961255,1961256,1972821,1972823,1972824,1972825,1972826,1974250,1974252,1974253,1974254,1974255,1974256,1974242,1974244,1974245,1974246,1974247,1974248,1976610,1978095,1978136,1978130,1978174,1978156,1978158,1978167,1978169,1978160,1978179,1978175,1978180,1978201,1978200,1978202,1978192,1978198,1978207,1978204,1978457,1979781,1979783,1979784,1979787,1982412,1982413,1986531,1986532,1986533,1991006,1991628,1991629,2016001,2018921,2042948,2047031,2058500,2058522,2058519,2058520,2058546,2058559,2058568,2058575,2058574,2058598,2058594,2058618,2058633,2066491,2067110,2067113,2067118,2067120,2067123,2067132,2067125,2067127,2069974,2069970,2069976,2069985,2069987);
35021 amit 1225
        for (Integer orderId : orderIds) {
1226
            System.out.println("Refund Started - " + orderId);
1227
            orderRepository.refundOrder(orderId, "vinay.p", "Long awaited cancellation", OrderStatus.CANCELLED_DUE_TO_LOW_INVENTORY);
1228
            System.out.println("Refund Ended");
35053 amit 1229
        }*/
1230
        //System.out.println(warehouseSupplierInvoiceRepository.selectWarehouseItemAgeing(LocalDateTime.now().minusDays(10), LocalDateTime.now(), null, 0, null));
35102 amit 1231
        /*Offer offer = offerRepository.selectById(6820);
1232
        offerService.sendWhatsapp(offer, Arrays.asList(175140233),"https://images.smartdukaan.com/uploads/campaigns/image2025-09-24/offer-6820.png");*/
1233
        /*List<String> invoices = Arrays.asList("NSDLNOI16527","NSDLNOI16366", "NSDLNOI16394", "NSDLNOI16460");
35056 amit 1234
        List<Loan> loans = new ArrayList<>();
1235
        for (String invoice : invoices) {
1236
            loans.add(loanRepository.selectLoanByInvoice(invoice));
1237
        }
1238
        loans.stream().sorted(Comparator.comparing(x->x.getCreatedOn())).forEach(x-> {
1239
            try {
1240
                sdCreditService.settleLoan(x);
1241
            } catch (ProfitMandiBusinessException e) {
1242
                throw new RuntimeException(e);
1243
            }
35102 amit 1244
        });*/
35021 amit 1245
        //Utils.sendMailWithAttachments(googleMailSender, new String[]{"amit.gupta@smartdukaan.com"}, null, "DTDC AWb", "PFA");*/
33452 amit.gupta 1246
    }
1247
 
35330 amit 1248
    private void releaseBlockedLimit() throws ProfitMandiBusinessException {
1249
        List<Loan> blockedLoans = loanRepository.selectAllBlockedLoans();
1250
        for (Loan blockedLoan : blockedLoans) {
1251
            LoanTransaction loanTransaction = loanTransactionRepository.selectByLoanId(blockedLoan.getId());
1252
            int transactionId = loanTransaction.getTransactionId();
1253
            List<UserWalletHistory> userWalletHistory = walletService.getAllByReference(blockedLoan.getFofoId(), transactionId, WalletReferenceType.PURCHASE);
35521 amit 1254
            int amount = userWalletHistory.get(userWalletHistory.size() - 1).getAmount();
35330 amit 1255
            int loanAmount = blockedLoan.getIntialAmount().intValue();
35521 amit 1256
            if (loanAmount > -amount) {
1257
                sdCreditService.settleBlockedLoan(transactionId, loanAmount + amount);
35330 amit 1258
            }
1259
 
1260
 
1261
        }
1262
    }
1263
 
34731 amit.gupta 1264
    @Autowired
1265
    LoanTransactionRepository loanTransactionRepository;
1266
 
1267
    private void fixBlockedCredit() throws ProfitMandiBusinessException {
1268
        List<Loan> unsettledBlockedLoans = loanRepository.selectAllActiveLoan().stream().filter(x -> x.getFreeDays() >= 365).collect(toList());
1269
        //unsettledBlockedLoans = unsettledBlockedLoans.stream().filter(x -> x.getId() == 52310).collect(toList());
1270
        for (Loan unsettledBlockedLoan : unsettledBlockedLoans) {
1271
            LoanTransaction loanTransaction = loanTransactionRepository.selectByLoanId(unsettledBlockedLoan.getId());
1272
            if (loanTransaction == null) {
1273
                System.out.println("Cant find Transaction Id for Loan - " + unsettledBlockedLoan.getId() + "-- Created On ->" + unsettledBlockedLoan.getCreatedOn());
1274
                continue;
1275
            }
1276
            List<Order> processedOrders = orderRepository.selectAllByTransactionId(loanTransaction.getTransactionId()).stream()
1277
                    .filter(x -> !x.getStatus().equals(OrderStatus.SUBMITTED_FOR_PROCESSING)).collect(toList());
1278
            List<OrderStatus> processedOrderIds = processedOrders.stream().map(x -> x.getStatus()).collect(Collectors.toList());
1279
            System.out.println("processedOrderIds " + processedOrderIds);
1280
            //if(unsettledBlockedLoan !=null) continue;
1281
            double limitToRelease = processedOrders.stream().collect(Collectors.summingDouble(x -> x.getWalletAmount()));
1282
            sdCreditService.releaseBlockedLimit(unsettledBlockedLoan, limitToRelease);
1283
 
1284
 
1285
        }
1286
    }
1287
 
34710 amit.gupta 1288
    public static byte[] toByteArray(InputStream input) throws IOException {
1289
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
1290
        int nRead;
1291
        byte[] data = new byte[16384];
1292
        while ((nRead = input.read(data, 0, data.length)) != -1) {
1293
            buffer.write(data, 0, nRead);
1294
        }
1295
        return buffer.toByteArray();
1296
    }
1297
 
34547 vikas.jang 1298
    private void whatsappTest() throws Exception {
34603 ranu 1299
        //liquidationService.processBids(ProfitMandiConstants.BID_CRON_ENUM.TODAY);
34612 ranu 1300
        Utils.sendMailWithAttachments(googleMailSender, new String[]{"ranu.rajput@smartdukaan.com"}, null, "Test Mail", "Mail is working");
34532 amit.gupta 1301
    }
1302
 
34510 amit.gupta 1303
    private void debitLoanAmountFromWallet() {
1304
        List l1 = Arrays.asList(1234, 1420, 2694, 8129, 12182, 12880, 16289, 16462, 16551, 16625, 16819, 17606, 18902, 19152, 19663, 22409, 22410, 23924, 24058, 24206, 24215, 24220, 24459, 25977, 30585, 31590);
1305
        l1.addAll(Arrays.asList(11849, 12702, 14554, 14643, 19166, 19638, 32824, 33467, 33954, 34017, 34514, 35128, 35229, 35355, 36007, 36351, 36435, 36586, 36608, 36612, 36665, 37076, 37495, 37678, 38519, 38563, 38638, 38690, 38815, 38840, 39015, 39084, 39142, 39379, 39384, 39586, 39636, 39657, 39755, 39788, 39908, 40054, 40220, 40534, 41731, 41962, 42692));
1306
        l1.addAll(Arrays.asList());
1307
    }
1308
 
33452 amit.gupta 1309
    public void test4() throws Exception {
1310
        List<Integer> offerIds = Arrays.asList(2882, 2881, 2880, 2879, 2878, 2877, 2876, 2875, 2874, 2873, 2872, 2871, 2870, 2869, 2868, 2867, 2866, 2865, 2864, 2863, 2862, 2861, 2860, 2859, 2858, 2857, 2856, 2855, 2854, 2853, 2852, 2851, 2850, 2849, 2847, 2846, 2845, 2844, 2843, 2842, 2841, 2840, 2839, 2838, 2837, 2836, 2835, 2834, 2833, 2832, 2831, 2830, 2829, 2828, 2827, 2826, 2825, 2824, 2823, 2822, 2821, 2820, 2819, 2818, 2817, 2816, 2815, 2814, 2813, 2812, 2811, 2810, 2809, 2808, 2807, 2806, 2805, 2804, 2803, 2802, 2801, 2800, 2799, 2798, 2797, 2796, 2795, 2794, 2793, 2792, 2791, 2790, 2789, 2788, 2787, 2786, 2785, 2784, 2783, 2782, 2781, 2780, 2777, 2776, 2775, 2774, 2773, 2772, 2771, 2770, 2769, 2768, 2767, 2766, 2765, 2764, 2763, 2762, 2761, 2760, 2759, 2758, 2757, 2756, 2755, 2754, 2753, 2752, 2751, 2750, 2749, 2748, 2747, 2746, 2745, 2744, 2723, 2722, 2721, 2720, 2719, 2718, 2717, 2716, 2715, 2714, 2713, 2712, 2711, 2710, 2709, 2708, 2707, 2706, 2705, 2704, 2703, 2702, 2701, 2700, 2699, 2698, 2697, 2696, 2695, 2694, 2693, 2692, 2691, 2690, 2494, 2493, 2492, 2491, 2490, 2489, 2488, 2487, 2486, 2485, 2484, 2483, 2482, 2481, 2480, 2479, 2478, 2477, 2476, 2475, 2474, 2473, 2472, 2471, 2470, 2469, 2466, 2465, 2464, 2463, 2462, 2461, 2460, 2459, 2458, 2457, 2456, 2455, 2454, 2453, 2452, 2451, 2450, 2449, 2448, 2447, 2446, 2445, 2444, 2443, 2442, 2441, 2440, 2439, 2407, 2406, 2405, 2404, 2403, 2402, 2401, 2400, 2399, 2398, 2397, 2396, 2395, 2394, 2393, 2392, 2391, 2390, 2389, 2388, 2387, 2386, 2385, 2384, 2383, 2382, 2381, 2117, 2116, 2115, 2114, 2113, 2112, 2111, 2110, 2109, 2108, 2107, 2106, 2105, 2104, 2103, 2102, 2101, 2100, 2099, 2098, 2077);
1311
        for (Integer offerId : offerIds) {
1312
            Offer fromOffer = offerRepository.selectById(offerId);
1313
            CreateOfferRequest createOfferRequest = offerService.getCreateOfferRequest(fromOffer);
1314
            System.out.println("Processing offer Id " + fromOffer);
1315
            offerService.processActivationtOffer(createOfferRequest);
1316
        }
34160 tejus.loha 1317
 
33433 amit.gupta 1318
        this.processSidbiDeductions();
32817 amit.gupta 1319
    }
1320
 
1321
    public void test3() throws Exception {
1322
        List<Long> payoutIds = Arrays.asList();
32795 amit.gupta 1323
        List<OfferPayout> offerPayouts = offerPayoutRepository.selectAllByIds(payoutIds);
33452 amit.gupta 1324
        Map<Integer, List<OfferPayout>> offerPayoutMap = offerPayouts.stream().collect(groupingBy(x -> (int) x.getOfferId()));
1325
        for (Entry<Integer, List<OfferPayout>> offerPayoutEntry : offerPayoutMap.entrySet()) {
32795 amit.gupta 1326
            int offerId = offerPayoutEntry.getKey();
1327
            List<OfferPayout> offerPayoutList = offerPayoutEntry.getValue();
33452 amit.gupta 1328
            Map<Integer, List<OfferPayout>> partnerOfferPayoutMap = offerPayoutList.stream().collect(groupingBy(x -> (int) x.getFofoId()));
32795 amit.gupta 1329
            for (Entry<Integer, List<OfferPayout>> partnerOfferPayoutEntry : partnerOfferPayoutMap.entrySet()) {
1330
                int fofoId = partnerOfferPayoutEntry.getKey();
1331
                List<OfferPayout> partnerPayouts = partnerOfferPayoutEntry.getValue();
1332
                float amount = 0;
1333
                for (OfferPayout offerPayout : partnerPayouts) {
1334
                    amount += offerPayout.getAmount();
1335
                    offerPayout.setStatus(SchemePayoutStatus.REJECTED);
1336
                    offerPayout.setRejectTimestamp(LocalDateTime.now());
1337
                }
1338
                walletService.rollbackAmountFromWallet(fofoId, amount, offerId,
1339
                        WalletReferenceType.ADDITIONAL_SCHEME, "Imeis returned - " + partnerPayouts.size() + "pc(s)", LocalDateTime.now());
1340
            }
1341
        }
1342
    }
1343
 
33316 amit.gupta 1344
    public void test1() throws Exception {
32690 amit.gupta 1345
        System.out.println("Hello from test");
32724 amit.gupta 1346
        //this.calculateInterestAccured();
32690 amit.gupta 1347
        //sendMailOfHtmlFormat(javaMailSender, new String[]{"amit.gupta@smartdukaan.com"}, "hello", null, "Hello");
32698 amit.gupta 1348
        //priceDropService.rejectPriceDropsOfApprovedImeis();
32511 amit.gupta 1349
        //Create return
32600 amit.gupta 1350
        //this.updatePartnerLimit();
32607 ranu 1351
        //creditNoteService.sendCnMails(YearMonth.now().minusMonths(2));
32690 amit.gupta 1352
        //orderService.createMissingScratchOffers();
33315 amit.gupta 1353
        LocalDateTime debitNoteDate = LocalDate.of(2024, Month.APRIL, 30).atStartOfDay();
32698 amit.gupta 1354
        Map<Integer, Set<String>> fofoIdImeiReturnMap = new LinkedHashMap<>();
33355 amit.gupta 1355
        /*fofoIdImeiReturnMap.put(175139690,	new HashSet<>(Arrays.asList("862054078463472","863862077158219","866202075810858","866202077654494","866335072023651","866518078002718")));
33315 amit.gupta 1356
        fofoIdImeiReturnMap.put(175139414,	new HashSet<>(Arrays.asList("356494471684303","356494471857164","356494472062590","861753065078075","863511068904178","863511069732933","864179068109203","864179068112504","864259078789978","866202076254130","866202076254775","866657078259165","866657078272846","867492065809718","867907071107955","868565073021423","868565073022223","868565073386347")));
1357
        fofoIdImeiReturnMap.put(175139603,	new HashSet<>(Arrays.asList("350886063151961","356412387787135","357594162824701","357594162874771","860600078193972","863862077025350","863862077875796","863967075815072","866335073794995","866335074287874","869116067546048")));
1358
        fofoIdImeiReturnMap.put(175139657,	new HashSet<>(Arrays.asList("350933415734746","354324787135850","354324788766356","354990352512960","354990352580181","358142881241184","866611064207332","869116067600464")));
1359
        fofoIdImeiReturnMap.put(175139223,	new HashSet<>(Arrays.asList("350210770983048","350210771169027","350210771179844","350210771180784","863975067090596","866611060326797","868565075758196","869452074016992","869452074609515","869452074609556","869452074976674","869452074978654")));
1360
        fofoIdImeiReturnMap.put(175139557,	new HashSet<>(Arrays.asList("861977073551795","861977073552678","861977074486819","862046062571245","862046067278226","862046067734921","862046067756866","864468070394741","864468071225506","864468071668341","864468073604740","864468074854625","866993074734475")));
1361
        fofoIdImeiReturnMap.put(175139079,	new HashSet<>(Arrays.asList("862046068861921","862282079169299","865388071283496","866335072007753","866335073946256","866518073601712","866518077425993","866518078760471","868938062675394","868938062690799","868938064895552")));
1362
        fofoIdImeiReturnMap.put(175139711,	new HashSet<>(Arrays.asList("861753065266498","861888066009099","864468073703369","866993071640154","869116062800465")));
1363
        fofoIdImeiReturnMap.put(175139488,	new HashSet<>(Arrays.asList("862054076866114","862054076866650","866335071879079","866335077875998","866335077876095","866518078758939","868938062692878")));
1364
        fofoIdImeiReturnMap.put(175138934,	new HashSet<>(Arrays.asList("862054072810231","862054072823150","862054076867674","862054078659590","863862075768456","863862077158193","863975064472490","863975064473233","865388071160033","865610079408035","866335072117370","866335073899471","866335074306153","866335075664477","868938062669876","868938062677895","868938062685997")));
1365
        fofoIdImeiReturnMap.put(4149607	 ,   new HashSet<>(Arrays.asList("864468073415741","864468075548523","864468075549927","864468079499426","866657074106022","868938062686656","868938062696978","868938062699352","868938064895198","868938066363799")));
1366
        fofoIdImeiReturnMap.put(175139138,	new HashSet<>(Arrays.asList("862286066217631","864259076533691","864468073358842","864487061610014","864487061675918","866083066080028","866518078760950","866518078768979","866657075343848","868544061108518","868544061138432","869116065510848","869116065519781","869452074116891","869452074972939")));
1367
        fofoIdImeiReturnMap.put(175139608,	new HashSet<>(Arrays.asList("350201087552063","350201087559944","350201087635660","350201087649760","350201087843140","350201088470224","350201088696687","350201088697180","354324783756923","354324786101366","355472822024008","355472822025625","860388068055779","860388068262219","866518078762337","866518078767534","868544061141493","868544061141774","868544061141816","868938064895719","868938066360910")));
1368
        fofoIdImeiReturnMap.put(175139731,	new HashSet<>(Arrays.asList("860600079214413","861753063502217","861753065084172","861753065084636","863975064472094","863975064473076","863975064477218","864468074456462","865883068726994","866657074641481","866657078016946","868938062699832","868938062700754")));
1369
        fofoIdImeiReturnMap.put(175138958,	new HashSet<>(Arrays.asList("863862075766393","864179064784108","866202075811732","866202076252654","866202078005571","868544060277439")));
1370
        fofoIdImeiReturnMap.put(175139612,	new HashSet<>(Arrays.asList("864468073474946","864468073477808","864468075031082","864468075280689","864468075745723","864468079481747","864468079483123","866657074538125","866657074538141","866657074573106","867467071856465","867467071875465","867467071891223","867467071913845","867467072729125","867467072760088")));
1371
        fofoIdImeiReturnMap.put(175139479,	new HashSet<>(Arrays.asList("863975062106595","863975064472672","863975064472870","863975064472953","863975064482333","863975064483570","863975064484719","863975064662694","863975064666455","863975064668931","863975067090257","863975067090810","863975067230218","863975067232230","866186062852892","866186062853973","866186062855051","866186062855077","866186063250773","866186063251094","866186063251219","866186063251318")));
1372
        fofoIdImeiReturnMap.put(175139245,	new HashSet<>(Arrays.asList("354324787133962","354324787569397","354324787602750","863816078139719","863816078448318","866335070534139")));
1373
        fofoIdImeiReturnMap.put(175139324,	new HashSet<>(Arrays.asList("863718060410316","863862075060755","865610074109257","866518078844457","866518079735159")));
1374
        fofoIdImeiReturnMap.put(175139576,	new HashSet<>(Arrays.asList("354324789013261","861128071288044","862736064686138","863718062236859","863816074642674","863816074646691","864259078939631","867467071870367","867467072760625","868565073047048")));
1375
        fofoIdImeiReturnMap.put(175139150,	new HashSet<>(Arrays.asList("860492060436217","861977073052257","862054073026738","862054073052056","863862077158938","866993074147710","867907071407074","868938060257450","868956064835055")));
1376
        fofoIdImeiReturnMap.put(175139463,	new HashSet<>(Arrays.asList("862181066909552","863816077757719","863816078448516","864214068977273","866335070447936","866335071699212","866335071699592","866335071700291")));
1377
        fofoIdImeiReturnMap.put(175139722,	new HashSet<>(Arrays.asList("358250293364682","358250294683627","358250295102007","861858064421273","861888066009537","864214068983198","864259078491112","864259078787733","865883068445694","866335072878930","866518078371014","868492068014968","868565072254660","868565073401468","868565073465661")));
1378
        fofoIdImeiReturnMap.put(168311083,	new HashSet<>(Arrays.asList("863718064506176","864468070873488","865883068175572","866335071204435","866335072093738","866518077064313","866657077386209","866657077862282","868938061427359")));
1379
        fofoIdImeiReturnMap.put(175139691,	new HashSet<>(Arrays.asList("863718061338714","863718061339258")));
1380
        fofoIdImeiReturnMap.put(175139395,	new HashSet<>(Arrays.asList("860492060436910","861220079009850","862054077288730","863511068660374","863718060300574","863718060617936","866335072874111","869452070894897")));
1381
        fofoIdImeiReturnMap.put(175139621,	new HashSet<>(Arrays.asList("351240553452191","351240553483527","351240553502920","354990353485570","860492062979750","860492062980998","864214068585274","864214068784398","864214068795378","864214068946534","864214068946757","864214068982075","868938061418754","868938061427391","868938062623139")));
1382
        fofoIdImeiReturnMap.put(175139638,	new HashSet<>(Arrays.asList("863862077159191","866518078780438","866518079750471","868428060238049","868938061532836","868938062619517")));
1383
        fofoIdImeiReturnMap.put(175139313,	new HashSet<>(Arrays.asList("350837023070346","350837023075022","350837023075568","350837023075782","352256988699643","862054076944275","863862075060359","863862075520055","864468075575948","865388072943635","868938060248574","868938061422830","868938062630894","869116061122184","869452070893717","869452073157912","869452074054373","869452075220890")));
1384
        fofoIdImeiReturnMap.put(175139513,	new HashSet<>(Arrays.asList("861977073670355","863718060618439","864468075204986","868024064295935","868024065473754","868024065567811","868024065763972","868956063947893")));
1385
        fofoIdImeiReturnMap.put(175139524,	new HashSet<>(Arrays.asList("350933416006946","350933416007944","351115165469199","351115165471237","351115167775437","351115167778431","351115167784413","351688420101625","355300592141142","358250295005267","358250295284607","359197386833520","359197386864947","862054073974671","862054073979597","862054074261730","862054074425954","862054074426036","864468073609384","866518078777392","868544060023239","868938060253772","868938060258516","868938061419018")));
1386
        fofoIdImeiReturnMap.put(175139359,	new HashSet<>(Arrays.asList("358250293060942","358250293061387","863718063044252","863862077160991","866335072536793","866335072536975","866335072537130","866335072726691","866335072726733","866335073628532","866335073925250","866335073925292","866335073926233","866335075267156")));
1387
        fofoIdImeiReturnMap.put(175139397,	new HashSet<>(Arrays.asList("861977073659010","863511069721050","864468071611101","864468074432844","864468074435284")));
1388
        fofoIdImeiReturnMap.put(175139677,	new HashSet<>(Arrays.asList("351115165472839","351115165476095","351115165476251","351115165477739","351115165483430","351115165485377","351115165486516","351115165487191","351115166897992","351115166898438","351115166900416","351115166900879","351115166902438","351115166903816","351115166903857","351115166903915","351115166904475","351115166905753","351115166906454","351115166906595","351115166907015","351115166907759","351115166907957","351115166908872","351115166909813","864259078771372","864468075692644","864468079730101","864468079736744","866657076858687","868565073398649","869116061118042","869116061261081")));
1389
        fofoIdImeiReturnMap.put(175139460,	new HashSet<>(Arrays.asList("860492061918494","862054079983072","862054079983171","866335070533032","866518078995119","866518079014993","868938060095017")));
1390
        fofoIdImeiReturnMap.put(175139585,	new HashSet<>(Arrays.asList("358250293614706","358250293614904","358250294602908","358250294603120","358250295002181","861977074487718","863718061173699","863816078050254","865883068445777","866335070453439","866335070526812","866335071204351","866518078640293","869116067596803")));
1391
        fofoIdImeiReturnMap.put(175139726,	new HashSet<>(Arrays.asList("861858064489411","863718063927654","864468073702221","864468073928784","864468074193149","865883068445819","866657078378742","866657078498904","867949078179850","867949078180494","868544060023197")));
1392
        fofoIdImeiReturnMap.put(175139532,	new HashSet<>(Arrays.asList("863718060615096","863718060615617","863718060727537","863816077797897","866335073405139","868565072217287","868565072264560","868956065132510")));
1393
        fofoIdImeiReturnMap.put(175139462,	new HashSet<>(Arrays.asList("865610074119819","865610074120536","866335072878658","866335072882098","866335073617030")));
1394
        fofoIdImeiReturnMap.put(175139259,	new HashSet<>(Arrays.asList("350210771180644","355300593052348","860492061918213","861858064422651","864259078402572","864259078924310","866335070769719","866335071700556","866335071742558","866657073553208","867949078178530","867949078692472","868024065518616","868024065619091","869116067492540")));
1395
        fofoIdImeiReturnMap.put(175139344,	new HashSet<>(Arrays.asList("350115571135781","354990352587723","358250293362843","358250293363148","862736064732510","865610070849617","865610070851290","866518078899998","868938062623378","868956065234613")));
1396
        fofoIdImeiReturnMap.put(175139602,	new HashSet<>(Arrays.asList("861128070090482","868565072242160","868565072243044","868565072261004","868565073051644")));
1397
        fofoIdImeiReturnMap.put(175139605,	new HashSet<>(Arrays.asList("861515075217922","861515076369466","863816074206397","863816075080072","864259078661755","864468075627368","867467071860541","868565072177903","868565073075726","868565073401625","868938060248012","868938066709652","869452074088611","869452074609234")));
1398
        fofoIdImeiReturnMap.put(175139640,	new HashSet<>(Arrays.asList("358250293363429","358250293363684","861753065277792","863511069733998","864214068943713","864259078496574","864259078518773","864487060042870","864487060050352","865883069366170","866518079782391","867949078692639","867949078692852","868273068551617","868938066464571","869452073150115")));
1399
        fofoIdImeiReturnMap.put(175139346,	new HashSet<>(Arrays.asList("356494471614953","860600076022215","861765072074616","861977070097412","864468074885181","864468076046105","865610073263139","865883065558994","866335075002538","866657079093605","867907070983216")));
1400
        fofoIdImeiReturnMap.put(175139489,	new HashSet<>(Arrays.asList("354324789015209","354324789081797","861515075189824","861515075575501","861977070268997","864468072790144","864468072983921","864468075233225","866657077951960","869452071082492","869452071982378","869452074617070")));
1401
        fofoIdImeiReturnMap.put(175139508,	new HashSet<>(Arrays.asList("861515075367024","864468072781283","864468074453386","864468075200448","864468076050669","866083062293849")));
1402
        fofoIdImeiReturnMap.put(175139716,	new HashSet<>(Arrays.asList("350832440575209","358250295571425","860600076019492","861753063494373","861753063501151","864468073696100","864468074855689","865883065542311","865883067956030","866202075825450","866202077663297","866335073632591","866657078023769")));
1403
        fofoIdImeiReturnMap.put(175139727,	new HashSet<>(Arrays.asList("355300592353325","355300593005387","861765072344258","862046060196128","864468073908604","864468073910121","864468073911269","867437074118411","868024064300099","868024065464977","868024065468218","869116065414389")));
1404
        fofoIdImeiReturnMap.put(175139521,	new HashSet<>(Arrays.asList("860600071402594","860600071416719","861888064397496","861977073658616","864468070509587","864468073866406","866335074999056","866657077949642","866657078406964","866993072229072","867437070891698")));
1405
        fofoIdImeiReturnMap.put(175139523,	new HashSet<>(Arrays.asList("354324785409950","354324788632830","354990352587939","358250295736085","358250295805187","358311601935629","863967076359575","866657074163502","867907070986318","869452071963378","869452074611750")));
1406
        fofoIdImeiReturnMap.put(175139697,	new HashSet<>(Arrays.asList("862282078030112","862282078867117","863975067709930","863975068443810","864468072828860","864468073705786","864468075276489","864468075277685","865610073830739","866335073264577","866518079802116","866657074518903","866657077949980","868565073058664","868938060985639","869116065613949")));
1407
        fofoIdImeiReturnMap.put(175139622,	new HashSet<>(Arrays.asList("358250293381926","358250293382304","358250293382601","358250294076046","358250294078109","358250294078463","358250294602064","358250294602429","358250294603062","358250294603203")));
1408
        fofoIdImeiReturnMap.put(175139699,	new HashSet<>(Arrays.asList("863718064441317","865610074942897","866202077653173","866202077653553","866335072262671","866335073632211","866335074805519")));
1409
        fofoIdImeiReturnMap.put(175139741,	new HashSet<>(Arrays.asList("861515071386101","861515074123402","861515074124186","861977073047752","861977073658574","864468075082804","864468076049869","865883065542139","865883067957111","866518070599679","866518079800672","866657078018587","866657078270162","866657079236220")));
1410
        fofoIdImeiReturnMap.put(175139114,	new HashSet<>(Arrays.asList("861888066708856","861977074487692","866335070051217","866335070517274","866993074145631")));
1411
        fofoIdImeiReturnMap.put(175139531,	new HashSet<>(Arrays.asList("863816077976194","863816079685710","866335070997336","866335074729354","866335075514698")));
1412
        fofoIdImeiReturnMap.put(175139386,	new HashSet<>(Arrays.asList("350210771192805","358250295053846","860388068563434","863862077333374","864468075193221","864562077193757","864718076084310","866202077464092","866202077742190","866518077001513","868565079682020","868956065252516")));
1413
        fofoIdImeiReturnMap.put(175139452,	new HashSet<>(Arrays.asList("350835033581484","350835034344999","350835035973283","350886063052599","351115165490559","351115165492290","351115165492811","354324788947428","354996630411503","354996631256261","355480685142494","355480686969416","359197386860549","861977073020494","862046067791525","862054077982977","866335072889499","867467072712048","868938062127511")));
1414
        fofoIdImeiReturnMap.put(175139306,	new HashSet<>(Arrays.asList("863718064547394","864718076075516","864718076083478","866202077463631","866202077470057")));
1415
        fofoIdImeiReturnMap.put(175139733,	new HashSet<>(Arrays.asList("350210771180008","861515071845668","861888067164877","866335070489094","866518076378276","868565072242269")));
1416
        fofoIdImeiReturnMap.put(175138824,	new HashSet<>(Arrays.asList("862054078573478","863862074697490","863862075442375","864468074485545","866335070216315","866657078016169","866657078449402","869116065542247")));
1417
        fofoIdImeiReturnMap.put(175139511,	new HashSet<>(Arrays.asList("862054075642557","862054075643530","862054076379357","862054077978934","863816078158016","868938062108974")));
1418
        fofoIdImeiReturnMap.put(175139701,	new HashSet<>(Arrays.asList("863862078258331","866611061131790")));
1419
        fofoIdImeiReturnMap.put(175139552,	new HashSet<>(Arrays.asList("861753065084958","866202075814439","866202075825633","866202075864194","866202076138754","866202076252811","866202077646870","866202077651094","866202077653876","866202077659956","866202077660293","866202077663339","866202078006397","866202078006611","866202078008914","866657078023280")));
1420
        fofoIdImeiReturnMap.put(175139499,	new HashSet<>(Arrays.asList("351115165467359","351115166905951","355358277809813","355358277814052","356049795822532","358250290682060","863862075504950","864468073944906","864468076048721","866657079234365")));
1421
        fofoIdImeiReturnMap.put(175139630,	new HashSet<>(Arrays.asList("357349229650288","358250290499184","358250294552947","358250294590301","860946078570556","860946078571059","861977073552215","861977073657790","861977073657832","861977073658731","861977074660850","862054075627517","862054075632756","862054075642979","862054076374879","863967071220830")));
1422
        fofoIdImeiReturnMap.put(175139720,	new HashSet<>(Arrays.asList("865388072300075","866335073071691","866335073073697","866335073390398")));
1423
        fofoIdImeiReturnMap.put(175138854,	new HashSet<>(Arrays.asList("50115570082950","351688420279827","351688420575703","354324788647382","357594162666201","359333606194530","863862075760198")));
1424
        fofoIdImeiReturnMap.put(175139569,	new HashSet<>(Arrays.asList("350201087565545","350201087948386","350201087949087","350210771180081","351088890316094","351088890318454","351088896121530","351088896127776","351088896127958","351088896133410","351088896133832","352476512881224","352476512979242","354448512964985","357888147926932","357888147928292","357888147928557","357888147929050","357888147929795","357888147933094","861128070182420","861753065277115","863511069713933","866657077333680","868273068567092","868565072301768","869116062743905","869452071985157","869452073161393")));
1425
        fofoIdImeiReturnMap.put(175139610,	new HashSet<>(Arrays.asList("862736063981738","863718063044617","866335072870176","866335072870598")));
1426
        fofoIdImeiReturnMap.put(175139366,	new HashSet<>(Arrays.asList("354324783144864","354324788632608","354889661849990","354990353239423","863967070558271","864718076129396","866657077789543","866657078285368","866657078508066","869116060977828","869116061054429","869116061208546")));
1427
        fofoIdImeiReturnMap.put(175139412,	new HashSet<>(Arrays.asList("351115165488595","351115165491318","351115165491359","351115165491458","351115165492332","355358278026573","355358278081610","861888063460717","861977073052018","863816078633919","865883069477035","866335074538870","866993071639594")));
1428
        fofoIdImeiReturnMap.put(175139504,	new HashSet<>(Arrays.asList("862054072660792","862054075971873","862054076312374","862054077948630","863816075363171","863862075442334","864718075894230","868938062122017","868938065268932","869452071940632","869452073034897","869452073158233","869452073158498","869452074159735")));
1429
        fofoIdImeiReturnMap.put(175139201,	new HashSet<>(Arrays.asList("863718061956671","863862075497734","863862075596915","864718076078510","864718076134834","866335070211639","866611060437032","866611061133812")));
1430
        fofoIdImeiReturnMap.put(175139362,	new HashSet<>(Arrays.asList("350201087545646","350201087547048","350201087547709","350201087548764","350201087597043","350201087597167","350201087597464","350201087597787","350201087598165","350201087600789","863718062929271","865883069477191","865883069477530","866335071174133","866518078023870","866518078243072","868938061053494")));
33355 amit.gupta 1431
        fofoIdImeiReturnMap.put(175139661,	new HashSet<>(Arrays.asList("860946077691031","861977074661155","862054073218855","866335070523694","867940069973476","868938062656477")));*/
33452 amit.gupta 1432
        fofoIdImeiReturnMap.put(175139556, new HashSet<>(Arrays.asList("863718063534013", "866335072895173", "866335073390810")));
1433
        fofoIdImeiReturnMap.put(175139721, new HashSet<>(Arrays.asList("358250294549067", "865883067508138", "866993072210619")));
33355 amit.gupta 1434
        /*fofoIdImeiReturnMap.put(175139455,	new HashSet<>(Arrays.asList("358293804087913","866518078020694","866518078021650","866518078243676","866518078571936")));
33315 amit.gupta 1435
        fofoIdImeiReturnMap.put(175138674,	new HashSet<>(Arrays.asList("351115165482275","359197386868583","862054074428875","862054077945693","862054078556879","863967070559535","863975068705671","863975068705770","864468076196124","866186064235971","866186066185117","866186066186917","866518073607370","866518079641514","868938060476456","868938060501535","868938060717990","868938062656931")));
1436
        fofoIdImeiReturnMap.put(175139559,	new HashSet<>(Arrays.asList("863718069016890","863816078879256","864468075283881","866335073245436","866335073403571","866657074268327","868024065473853","868956065899993","869452070362895","869452074030274")));
1437
        fofoIdImeiReturnMap.put(175139575,	new HashSet<>(Arrays.asList("354324786659199","860388067452035","861220078009919","863816078878134","863862075841154","865388070857498","867907071407116")));
33355 amit.gupta 1438
        fofoIdImeiReturnMap.put(175139686,	new HashSet<>(Arrays.asList("866657078019106","866657078032869")));*/
33315 amit.gupta 1439
 
33355 amit.gupta 1440
        //this.processOrdersToRebill(fofoIdImeiReturnMap, debitNoteDate);
1441
        purchaseReturnService.fixReturns(fofoIdImeiReturnMap, debitNoteDate);
32513 amit.gupta 1442
 
32698 amit.gupta 1443
    }
1444
 
1445
 
33315 amit.gupta 1446
    private void processOrdersToRebill(Map<Integer, Set<String>> fofoIdImeiReturnMap, LocalDateTime debitNoteDate) throws Exception {
32698 amit.gupta 1447
 
1448
 
1449
        for (Entry<Integer, Set<String>> fofoIdImeiReturnEntry : fofoIdImeiReturnMap.entrySet()) {
32511 amit.gupta 1450
            int fofoId = fofoIdImeiReturnEntry.getKey();
1451
            Set<String> imeis = fofoIdImeiReturnEntry.getValue();
1452
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(fofoId, imeis, true);
1453
            for (InventoryItem inventoryItem : inventoryItems) {
1454
                //inventoryItem.getId();
1455
                purchaseReturnService.returnInventoryItem(fofoId, true, inventoryItem.getId(), ReturnType.GOOD);
1456
                //Approve return
1457
                PurchaseReturnItem purchaseReturnItem = purchaseReturnItemRepository.selectByInventoryItemId(inventoryItem.getId());
1458
                purchaseReturnItem.setStatus(PurchaseReturnStatus.APPROVED);
1459
                purchaseReturnItem.setApproveTimestamp(LocalDateTime.now());
1460
            }
1461
            Map<Purchase, List<InventoryItem>> purchaseInventoryItemsMap = purchaseReturnService.getPurchaseMapForApprovedReturns(fofoId);
1462
            int walletAmount = walletService.getWalletAmount(fofoId);
1463
            List<DebitNote> debitNotes = purchaseReturnService.generateDebitNotes(purchaseInventoryItemsMap);
1464
            int walletDiff = walletAmount - walletService.getWalletAmount(fofoId);
1465
            if (walletDiff > 0) {
1466
                int reference = walletService.getManualReference(WalletReferenceType.OTHERS);
32514 amit.gupta 1467
                walletService.addAmountToWallet(fofoId, reference, WalletReferenceType.ADVANCE_AMOUNT, "Sytematically added for internal PO", (float) walletDiff + 5000, LocalDateTime.now());
32511 amit.gupta 1468
            }
32698 amit.gupta 1469
            List<CartItem> cartItems = new ArrayList<>();
32511 amit.gupta 1470
            for (DebitNote debitNote : debitNotes) {
33315 amit.gupta 1471
                debitNote.setCreateTimestamp(debitNoteDate);
32511 amit.gupta 1472
                //Try to refund amount per debit note
32698 amit.gupta 1473
                cartItems.addAll(this.refundDnAmount(debitNote));
32511 amit.gupta 1474
            }
32698 amit.gupta 1475
            //If order created
33452 amit.gupta 1476
            Map<Integer, List<CartItem>> warehouseCartItemsMap = cartItems.stream().collect(groupingBy(x -> x.getWarehouseId()));
1477
            for (Entry<Integer, List<CartItem>> warehouseCartItemsEntry : warehouseCartItemsMap.entrySet()) {
32223 amit.gupta 1478
 
32698 amit.gupta 1479
                List<CartItem> warehouseCartItems = warehouseCartItemsEntry.getValue();
1480
 
1481
                List<CartItem> mergedCartItems = warehouseCartItems.stream()
1482
                        .collect(Collectors.collectingAndThen(
33452 amit.gupta 1483
                                groupingBy(x -> x.getItemId(), Collectors.collectingAndThen(
32724 amit.gupta 1484
                                        Collectors.reducing((a, b) -> {
32698 amit.gupta 1485
                                            a.setQuantity(a.getQuantity() + b.getQuantity());
1486
                                            return a;
1487
                                        }), Optional::get)),
1488
                                m -> new ArrayList<>(m.values())));
1489
 
32724 amit.gupta 1490
                double walletTotalAmount = mergedCartItems.stream().mapToDouble(x -> x.getQuantity() * x.getSellingPrice()).sum();
32698 amit.gupta 1491
 
1492
                com.spice.profitmandi.dao.entity.user.User user = userRepository.selectById(fofoId);
1493
                cartService.clearCart(user.getActiveCartId());
1494
                cartService.addItemsToCart(user.getActiveCartId(), mergedCartItems);
1495
 
1496
                UserCart userCart = new UserCart();
1497
                userCart.setCartId(user.getActiveCartId());
1498
                userCart.setUserId(user.getId());
1499
 
1500
                int transactionId = transactionService.createTransactionInternally(userCart, walletTotalAmount, warehouseCartItemsEntry.getKey());
1501
                commonPaymentService.payThroughWallet(transactionId);
34352 amit.gupta 1502
                transactionService.processTransaction(transactionId, 0);
32698 amit.gupta 1503
            }
1504
        }
31697 amit.gupta 1505
    }
32048 tejbeer 1506
 
32384 amit.gupta 1507
    @Autowired
32511 amit.gupta 1508
    CartService cartService;
1509
    @Autowired
1510
    UserRepository userRepository;
1511
 
1512
    @Autowired
1513
    WarehouseScanRepository warehouseScanRepository;
1514
 
1515
    @Autowired
1516
    WarehouseInventoryService warehouseInventoryService;
1517
 
1518
    @Autowired
1519
    CommonPaymentService commonPaymentService;
1520
 
32533 amit.gupta 1521
    @Autowired
1522
    LineItemImeisRepository lineItemImeisRepository;
1523
 
32698 amit.gupta 1524
 
32511 amit.gupta 1525
    //Also create order
32698 amit.gupta 1526
    private List<CartItem> refundDnAmount(DebitNote debitNote) throws ProfitMandiBusinessException {
32511 amit.gupta 1527
        List<Integer> inventoryItemIds = purchaseReturnItemRepository.selectAllByDebitNoteId(debitNote.getId()).stream().map(x -> x.getInventoryItemId()).collect(Collectors.toList());
33452 amit.gupta 1528
        Map<Integer, Long> inventoryItemCountMap = inventoryItemIds.stream().collect(groupingBy(x -> x, Collectors.counting()));
32511 amit.gupta 1529
        List<InventoryItem> inventoryItems = inventoryItemRepository.selectAllByIds(new ArrayList<>(inventoryItemCountMap.keySet()));
1530
        Purchase purchase = purchaseRepository.selectById(inventoryItems.get(0).getPurchaseId());
1531
        String invoice = purchase.getPurchaseReference();
1532
        List<Order> orders = orderRepository.selectByInvoiceNumber(invoice);
1533
        Set<Integer> orderIds = orders.stream().map(x -> x.getId()).collect(Collectors.toSet());
1534
        Order order = orders.get(0);
1535
        float totalAmount = 0;
1536
        int totalQty = 0;
1537
        Map<Integer, CartItem> itemIdCartItemMap = new HashMap<>();
1538
 
35447 amit 1539
        // Batch fetch all TagListings by itemIds to avoid N+1 queries
1540
        Set<Integer> allItemIds = inventoryItems.stream()
1541
                .map(InventoryItem::getItemId)
1542
                .collect(Collectors.toSet());
1543
        List<TagListing> allTagListings = tagListingRepository.selectByItemIdsAndTagIds(allItemIds, null);
1544
        Map<Integer, TagListing> itemIdTagListingMap = allTagListings.stream()
1545
                .collect(Collectors.toMap(TagListing::getItemId, t -> t, (u, v) -> u));
1546
 
32511 amit.gupta 1547
        List<CartItem> cartItems = new ArrayList<>();
1548
        for (InventoryItem inventoryItem : inventoryItems) {
35447 amit 1549
            TagListing tagListing = itemIdTagListingMap.get(inventoryItem.getItemId());
32511 amit.gupta 1550
            long quantity = inventoryItemCountMap.get(inventoryItem.getId());
1551
            totalAmount += inventoryItem.getUnitPrice() * quantity;
1552
            totalQty += quantity;
1553
            if (!itemIdCartItemMap.containsKey(inventoryItem.getItemId())) {
1554
                CartItem cartItem = new CartItem();
1555
                cartItem.setItemId(inventoryItem.getItemId());
1556
                cartItem.setSellingPrice(tagListing.getSellingPrice());
32698 amit.gupta 1557
                cartItem.setWarehouseId(order.getWarehouseId());
32511 amit.gupta 1558
                cartItems.add(cartItem);
1559
                itemIdCartItemMap.put(inventoryItem.getItemId(), cartItem);
1560
            }
1561
            CartItem cartItem = itemIdCartItemMap.get(inventoryItem.getItemId());
1562
            cartItem.setQuantity((int) quantity + cartItem.getQuantity());
1563
        }
1564
        String rollbackDescription = String.format("Refunded against DN %s, %d pc(s)", debitNote.getDebitNoteNumber(), totalQty);
1565
        walletService.addAmountToWallet(debitNote.getFofoId(), order.getTransactionId(), WalletReferenceType.PURCHASE, rollbackDescription, totalAmount, LocalDateTime.now());
1566
        //Before creating order lets try to in the stock
1567
 
1568
        //All scans pertaining to specific Invoices
1569
        List<WarehouseScan> warehouseScans = warehouseScanRepository.selectAllByOrderIds(new ArrayList<>(orderIds));
32698 amit.gupta 1570
        Map<Integer, Integer> inventoryItemIdOrderIdMap = new HashMap<>();
1571
        try {
1572
            inventoryItemIdOrderIdMap = warehouseScans.stream().collect(Collectors.toMap(x -> x.getInventoryItemId(), x -> x.getQuantity()));
32724 amit.gupta 1573
        } catch (Exception e) {
32698 amit.gupta 1574
            LOGGER.info("Could not process for fofoId - {}, {}", debitNote.getFofoId(), warehouseScans);
1575
        }
32511 amit.gupta 1576
        List<Integer> warehouseInventoryItemIds = warehouseScans.stream().filter(x -> !(x.getType().equals(in.shop2020.warehouse.ScanType.SALE_RET) || x.getType().equals(in.shop2020.warehouse.ScanType.SALE_RET_UNUSABLE)))
1577
                .map(x -> x.getInventoryItemId()).collect(Collectors.toList());
1578
        List<WarehouseInventoryItem> warehouseInventoryItems = warehouseInventoryItemRepository.selectAllByIds(warehouseInventoryItemIds);
1579
 
1580
        Map<String, WarehouseInventoryItem> serialNumberWarehouseInventoryItemMap = warehouseInventoryItems.stream().filter(x -> StringUtils.isNotBlank(x.getSerialNumber())).collect(Collectors.toMap(x -> x.getSerialNumber(), x -> x));
1581
 
1582
        for (InventoryItem inventoryItem : inventoryItems) {
1583
            if (StringUtils.isBlank(inventoryItem.getSerialNumber())) {
1584
                //As of now this should be happening as  dn are specifically for serialized devices
1585
                /*int returnQty = inventoryItemCountMap.get(inventoryItem.getId()).intValue();
1586
                List<WarehouseInventoryItem> warehouseInventoryItemList = itemIdWarehouseInventoryItemsMap.get(inventoryItem.getItemId());
1587
                warehouseInventoryService.returnNonSerializedQty(warehouseInventoryItem)*/
1588
            } else if (StringUtils.isNotBlank(inventoryItem.getSerialNumber())) {
1589
                String serialNumber = inventoryItem.getSerialNumber();
1590
                WarehouseInventoryItem warehouseInventoryItem = serialNumberWarehouseInventoryItemMap.get(serialNumber);
1591
                warehouseInventoryItem.setLastScanType(in.shop2020.warehouse.ScanType.SALE_RET);
1592
                warehouseInventoryService.addQuantity(warehouseInventoryItem.getId(), 1);
1593
                WarehouseScan warehouseScan = new WarehouseScan();
1594
                warehouseScan.setInventoryItemId(warehouseInventoryItem.getId());
1595
                warehouseScan.setQuantity(1);
1596
                warehouseScan.setOrderId(inventoryItemIdOrderIdMap.get(warehouseInventoryItem.getItemId()));
1597
                warehouseScan.setScannedAt(LocalDateTime.now());
1598
                warehouseScan.setType(in.shop2020.warehouse.ScanType.SALE_RET);
1599
                warehouseScanRepository.persist(warehouseScan);
1600
 
1601
            }
1602
        }
1603
 
1604
        //Create Order as well
32724 amit.gupta 1605
        return cartItems;
32698 amit.gupta 1606
    }
32511 amit.gupta 1607
 
32698 amit.gupta 1608
    void addToCartAndCreateOrder() {
32511 amit.gupta 1609
 
1610
    }
1611
 
1612
    @Autowired
32384 amit.gupta 1613
    WarehouseDebitNoteRepository warehouseDebitNoteRepository;
1614
    @Autowired
1615
    WarehouseDebitNoteLineRepository warehouseDebitNoteLineRepository;
1616
 
1617
    @Autowired
1618
    WarehouseInvoiceItemRepository warehouseInvoiceItemRepository;
1619
    @Autowired
1620
    WarehouseSupplierInvoiceRepository warehouseSupplierInvoiceRepository;
1621
 
1622
    @Autowired
1623
    PurchaseOrderService purchaseOrderService;
1624
 
32482 amit.gupta 1625
    @Autowired
1626
    VendorCatalogPricingLogRepository vendorCatalogPricingLogRepository;
32384 amit.gupta 1627
 
32214 jai.hind 1628
//    private void checkItelImeiActivationNew(LocalDate now, int i) {
1629
//    }
1630
 
32169 amit.gupta 1631
    @Autowired
1632
    SessionFactory sessionFactory;
1633
 
1634
 
31697 amit.gupta 1635
    public void sendMailForSamsungRebilling() throws Exception {
1636
        List<BilledImeiModel> samsungModels = warehouseInventoryItemRepository.findByBillingDateBrand(LocalDate.now(), "Samsung");
1637
        LOGGER.info("SamsungModels {}", samsungModels);
1638
        samsungModels = samsungModels.stream().sorted(Comparator.comparing(x -> x.getPcmDate() == null ? -1 : 1)).collect(Collectors.toList());
1639
        if (samsungModels.size() > 0) {
1640
            List<String> headers = Arrays.asList("Partner Id", "Code", "Name", "City", "Brand", "Model Name", "Model Number", "Color", "Serial Number", "Remarks");
1641
            List<List<?>> rows = new ArrayList<>();
1642
            for (BilledImeiModel billedImeiModel : samsungModels) {
31886 tejbeer 1643
                List<Serializable> row = Arrays.asList(billedImeiModel.getFofoId(), billedImeiModel.getStoreCode(), billedImeiModel.getStoreName(), billedImeiModel.getStoreCity(), billedImeiModel.getBrand(), billedImeiModel.getModelName(), billedImeiModel.getModelNumber(), billedImeiModel.getColor(), billedImeiModel.getSerialNumber(), billedImeiModel.getPcmDate() == null ? "PCM date Missing" : "Rebill Imeis");
31697 amit.gupta 1644
                rows.add(row);
1645
            }
1646
            ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
1647
            String[] sendToArray = new String[]{"kamini.sharma@smartdukaan.com", "praveen.sharma@smartdukaan.com"};
1648
            String fileName = "Imeis need Rebilling -" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
31886 tejbeer 1649
            Utils.sendMailWithAttachment(googleMailSender, sendToArray, new String[]{"tarun.verma@smartdukaan.com"}, "Samsung Rebilling IMEI Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
31697 amit.gupta 1650
        }
1651
    }
24002 amit.gupta 1652
 
31697 amit.gupta 1653
    public void sendPartnerInvestmentDetails(List<String> sendTo) throws Exception {
1654
        LocalDate yesterDay = LocalDate.now().minusDays(1);
1655
        List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
31886 tejbeer 1656
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
25312 amit.gupta 1657
 
32169 amit.gupta 1658
        List<String> headers = Arrays.asList("Code", "Outlet name", "State Manager", "Territory/Team Lead", "Wallet Amount", "In Stock Amount", "Activated Stock", "Return In Transit Stock", "Unbilled Amount", "Grn Pending Amount", "Min Investment", "Investment Amount", "Investment Short", "Unbilled Qty", "Short Days");
31697 amit.gupta 1659
        List<List<?>> rows = new ArrayList<>();
1660
        Map<Integer, List<?>> partnerRowsMap = new HashMap<>();
25598 amit.gupta 1661
 
31697 amit.gupta 1662
        Map<Integer, FofoReportingModel> partnerIdSalesHeaderMap = this.getPartnerIdSalesHeaders();
25312 amit.gupta 1663
 
31886 tejbeer 1664
        Map<Integer, Integer> shortDaysMap = partnerDailyInvestmentRepository.selectAll(LocalDate.now().withDayOfMonth(1), LocalDate.now()).stream().collect(groupingBy(
1665
                x -> x.getFofoId(), Collectors.summingInt(x -> x.getShortPercentage() > 10 ? 1 : 0)));
24271 amit.gupta 1666
 
31697 amit.gupta 1667
        for (FofoStore fofoStore : fofoStores) {
1668
            LOGGER.info("Fofo Store {},  {}", fofoStore.getId(), fofoStore.getCode());
1669
            int fofoId = fofoStore.getId();
1670
            PartnerDailyInvestment partnerDailyInvestment = partnerInvestmentService.getInvestment(fofoId, 1);
1671
            partnerDailyInvestment.setDate(yesterDay);
24177 govind 1672
 
31697 amit.gupta 1673
            try {
1674
                partnerDailyInvestmentRepository.persist(partnerDailyInvestment);
31886 tejbeer 1675
                shortDaysMap.put(fofoId, shortDaysMap.get(fofoId) + (partnerDailyInvestment.getShortPercentage() > 10 ? 1 : 0));
31697 amit.gupta 1676
            } catch (Exception e) {
1677
                // ignore the exceptions during persist
1678
            }
25598 amit.gupta 1679
 
31697 amit.gupta 1680
            CustomRetailer retailer = customRetailerMap.get(fofoStore.getId());
1681
            if (retailer == null || partnerIdSalesHeaderMap.get(fofoStore.getId()) == null) {
1682
                LOGGER.info("Could not find retailer with retailer Id {}", fofoStore.getId());
1683
                continue;
1684
            }
1685
            FofoReportingModel reportingModel = partnerIdSalesHeaderMap.get(fofoStore.getId());
1686
            List<Serializable> row = new ArrayList<>();
31886 tejbeer 1687
            row.addAll(Arrays.asList(reportingModel.getCode(), reportingModel.getBusinessName(), reportingModel.getRegionalManager(), reportingModel.getTerritoryManager()));
31697 amit.gupta 1688
            row.addAll(
31886 tejbeer 1689
                    Arrays.asList(partnerDailyInvestment.getWalletAmount(), partnerDailyInvestment.getInStockAmount(), partnerDailyInvestment.getActivatedStockAmount() == 0 ? "-" : "(" + partnerDailyInvestment.getActivatedStockAmount() + ")", 0, partnerDailyInvestment.getUnbilledAmount(), partnerDailyInvestment.getGrnPendingAmount(), partnerDailyInvestment.getMinInvestment(), partnerDailyInvestment.getTotalInvestment(), partnerDailyInvestment.getShortInvestment(), partnerDailyInvestment.getUnbilledQty(), shortDaysMap.get(fofoId)));
31697 amit.gupta 1690
            partnerRowsMap.put(fofoStore.getId(), row);
1691
            rows.add(row);
25837 amit.gupta 1692
 
31697 amit.gupta 1693
        }
25837 amit.gupta 1694
 
34611 ranu 1695
        String fileName = "InvestmentSummary-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
25837 amit.gupta 1696
 
34337 amit.gupta 1697
        if (sendTo == null) {
33452 amit.gupta 1698
            for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMapping().entrySet()) {
31886 tejbeer 1699
                List<List<?>> filteredRows = storeGuyEntry.getValue().stream().map(x -> partnerRowsMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
31697 amit.gupta 1700
                ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, filteredRows);
1701
                String[] sendToArray = new String[]{storeGuyEntry.getKey()};
31886 tejbeer 1702
                Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
31697 amit.gupta 1703
            }
34578 vikas.jang 1704
            sendTo = Arrays.asList("tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com", "neeraj.gupta@smartdukaan.com", "amit.gupta@shop2020.in", "manish.gupta1@smartdukaan.com", "niranjan.kala@smartdukaan.com");
31697 amit.gupta 1705
        }
25837 amit.gupta 1706
 
31697 amit.gupta 1707
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
1708
        String[] sendToArray = sendTo.toArray(new String[sendTo.size()]);
34611 ranu 1709
        Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
25837 amit.gupta 1710
 
31697 amit.gupta 1711
    }
25598 amit.gupta 1712
 
33256 amit.gupta 1713
    private Map<Integer, FofoReportingModel> getPartnerIdSalesHeaders() throws ProfitMandiBusinessException {
31697 amit.gupta 1714
        Map<String, SaleRoles> partnerEmailSalesMap = new HashMap<>();
1715
        Map<String, SaleRoles> partnerEmailRBMMap = new HashMap<>();
34903 ranu 1716
        Map<String, SaleRoles> partnerEmailABMMap = new HashMap<>();
24271 amit.gupta 1717
 
35521 amit 1718
        List<Position> positions = positionRepository.selectPositionByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_ABM));
31886 tejbeer 1719
        Map<Integer, AuthUser> authUsersMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
31697 amit.gupta 1720
        Map<Integer, List<CustomRetailer>> positionIdRetailerMap = csService.getPositionCustomRetailerMap(positions);
1721
        for (Position position : positions) {
1722
            List<CustomRetailer> crList = positionIdRetailerMap.get(position.getId());
1723
            if (crList == null)
1724
                continue;
1725
            if (position.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_SALES) {
1726
                for (CustomRetailer cr : crList) {
1727
                    if (!partnerEmailSalesMap.containsKey(cr.getEmail())) {
1728
                        partnerEmailSalesMap.put(cr.getEmail(), new SaleRoles());
1729
                    }
1730
                    SaleRoles saleRoles = partnerEmailSalesMap.get(cr.getEmail());
1731
                    AuthUser authUser = authUsersMap.get(position.getAuthUserId());
1732
                    if (authUser == null) {
1733
                        continue;
1734
                    }
1735
                    String name = authUser.getFirstName() + " " + authUser.getLastName();
1736
                    if (position.getEscalationType().equals(EscalationType.L1)) {
1737
                        saleRoles.getL1().add(name);
1738
                    } else if (position.getEscalationType().equals(EscalationType.L2)) {
1739
                        saleRoles.getL2().add(name);
1740
                    }
1741
                }
1742
            }
1743
            if (position.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_RBM) {
1744
                for (CustomRetailer cr : crList) {
1745
                    if (!partnerEmailRBMMap.containsKey(cr.getEmail())) {
1746
                        partnerEmailRBMMap.put(cr.getEmail(), new SaleRoles());
1747
                    }
1748
                    SaleRoles saleRoles = partnerEmailRBMMap.get(cr.getEmail());
1749
                    AuthUser authUser = authUsersMap.get(position.getAuthUserId());
1750
                    if (authUser == null) {
1751
                        continue;
1752
                    }
1753
                    String name = authUser.getFirstName() + " " + authUser.getLastName();
1754
                    if (position.getEscalationType().equals(EscalationType.L1) || position.getEscalationType().equals(EscalationType.L1)) {
1755
                        saleRoles.getL1().add(name);
1756
                    }
1757
                    /*else if (position.getEscalationType().equals(EscalationType.L2)) {
1758
                        saleRoles.getL2().add(name);
1759
                    }*/
1760
                }
1761
            }
24692 amit.gupta 1762
 
34903 ranu 1763
            if (position.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_ABM) {
1764
                for (CustomRetailer cr : crList) {
1765
                    if (!partnerEmailABMMap.containsKey(cr.getEmail())) {
1766
                        partnerEmailABMMap.put(cr.getEmail(), new SaleRoles());
1767
                    }
1768
                    SaleRoles saleRoles = partnerEmailABMMap.get(cr.getEmail());
1769
                    AuthUser authUser = authUsersMap.get(position.getAuthUserId());
1770
                    if (authUser == null) {
1771
                        continue;
1772
                    }
1773
                    String name = authUser.getFirstName() + " " + authUser.getLastName();
1774
                    if (position.getEscalationType().equals(EscalationType.L1) || position.getEscalationType().equals(EscalationType.L1)) {
1775
                        saleRoles.getL1().add(name);
35521 amit 1776
                    } else if (position.getEscalationType().equals(EscalationType.L2)) {
34903 ranu 1777
                        saleRoles.getL2().add(name);
1778
                    }
1779
                }
1780
            }
1781
 
31697 amit.gupta 1782
        }
25418 amit.gupta 1783
 
31697 amit.gupta 1784
        Set<CustomRetailer> allCrList = new HashSet<>();
1785
        for (List<CustomRetailer> cr : positionIdRetailerMap.values()) {
1786
            allCrList.addAll(cr);
1787
        }
25609 amit.gupta 1788
 
31886 tejbeer 1789
        Map<Integer, FofoStore> fofoStoresMap = fofoStoreRepository.selectActiveStores().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
25503 amit.gupta 1790
 
31697 amit.gupta 1791
        Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = new HashMap<>();
25503 amit.gupta 1792
 
31697 amit.gupta 1793
        for (CustomRetailer cr : allCrList) {
1794
            FofoStore fofoStore = fofoStoresMap.get(cr.getPartnerId());
1795
            if (fofoStore == null) {
1796
                LOGGER.info("Could not find Store {} in active Store", cr.getBusinessName());
1797
                continue;
1798
            }
1799
            String code = fofoStore.getCode();
1800
            // String storeName = "SmartDukaan-" +
1801
            // fofoStore.getCode().replaceAll("[a-zA-Z]", "");
1802
            String businessName = cr.getBusinessName();
1803
            try {
1804
                String stateManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL2(), ", ");
1805
                String territoryManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL1(), ", ");
1806
                String bdm = StringUtils.join(partnerEmailRBMMap.get(cr.getEmail()).getL1(), ", ");
1807
                FofoReportingModel reportingModel = new FofoReportingModel();
1808
                reportingModel.setBusinessName(businessName);
1809
                reportingModel.setCode(code);
1810
                reportingModel.setFofoId(fofoStore.getId());
1811
                reportingModel.setRegionalManager(stateManager);
1812
                reportingModel.setTerritoryManager(territoryManager);
1813
                reportingModel.setBusinessManager(bdm);
1814
                partnerIdSalesHeadersMap.put(fofoStore.getId(), reportingModel);
1815
            } catch (Exception e) {
1816
                LOGGER.warn("Could not find partner with email - {}", cr.getEmail());
1817
            }
1818
        }
1819
        return partnerIdSalesHeadersMap;
24533 govind 1820
 
31697 amit.gupta 1821
    }
28709 amit.gupta 1822
 
34275 tejus.loha 1823
    public void persistRbmTodayTargets() throws Exception {
33928 ranu 1824
        rbmTargetService.setMovementWiseRbmTargets();
1825
    }
1826
 
34275 tejus.loha 1827
    public void persistRbmTodayAchievements() throws Exception {
33986 ranu 1828
        rbmTargetService.setMovementWiseRbmAchievement();
1829
    }
1830
 
31697 amit.gupta 1831
    public void sendPartnerInvestmentDetails() throws Exception {
1832
        this.sendPartnerInvestmentDetails(null);
1833
    }
28709 amit.gupta 1834
 
31697 amit.gupta 1835
    public void sendAgeingReport(String... sendTo) throws Exception {
28790 amit.gupta 1836
 
31886 tejbeer 1837
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.WAREHOUSENEW, "itemstockageing.xml");
1838
        InputStreamSource isr1 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "ItemwiseOverallPendingIndent.xml");
31697 amit.gupta 1839
        Attachment attachment = new Attachment(
1840
                "ageing-report-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr);
1841
        Attachment attachment1 = new Attachment(
1842
                "pending-indent-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr1);
28790 amit.gupta 1843
 
31886 tejbeer 1844
        Utils.sendMailWithAttachments(googleMailSender, STOCK_AGEING_MAIL_LIST, null, "Stock Ageing Report", "PFA", attachment);
1845
        Utils.sendMailWithAttachments(googleMailSender, ITEMWISE_PENDING_INDENT_MAIL_LIST, null, "Itemwise Pending indent", "PFA", attachment1);
28790 amit.gupta 1846
 
31697 amit.gupta 1847
        // Reports to be sent to mapped partners
1848
        Map<String, Set<String>> storeGuysMap = csService.getAuthUserPartnerEmailMapping();
28790 amit.gupta 1849
 
33452 amit.gupta 1850
        for (Entry<String, Set<String>> storeGuyEntry : storeGuysMap.entrySet()) {
31697 amit.gupta 1851
            Map<String, String> params = new HashMap<>();
1852
            if (storeGuyEntry.getValue().size() == 0)
1853
                continue;
1854
            params.put("MANUAL_email", String.join(",", storeGuyEntry.getValue()));
31886 tejbeer 1855
            InputStreamSource isr3 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "focostockreport.xml", params);
31697 amit.gupta 1856
            Attachment attache = new Attachment(
1857
                    "Franchise-stock-report" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr3);
1858
            System.out.println(storeGuyEntry.getValue());
31886 tejbeer 1859
            Utils.sendMailWithAttachments(googleMailSender, new String[]{storeGuyEntry.getKey()}, null, "Franchise Stock Report", "PFA", attache);
31697 amit.gupta 1860
        }
28839 tejbeer 1861
 
31697 amit.gupta 1862
    }
28839 tejbeer 1863
 
31697 amit.gupta 1864
    public void sendIndentTertiary() throws Exception {
28790 amit.gupta 1865
 
31886 tejbeer 1866
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "indentandtertiary.xml");
31697 amit.gupta 1867
        Attachment attachment = new Attachment(
1868
                "indentandtertiary-report-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr);
31886 tejbeer 1869
        Utils.sendMailWithAttachments(googleMailSender, INDENT_TERTIARY_MAIL_LIST, null, "Indent Tertiary Report", "PFA", attachment);
28790 amit.gupta 1870
 
31697 amit.gupta 1871
    }
28790 amit.gupta 1872
 
31697 amit.gupta 1873
    public void sendAttendanceMorningAlert() throws Exception {
1874
        LocalDateTime moriningTime = LocalDate.now().atTime(10, 31);
1875
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
31886 tejbeer 1876
        Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28775 amit.gupta 1877
 
31697 amit.gupta 1878
        List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
1879
        Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28790 amit.gupta 1880
 
31886 tejbeer 1881
        List<EmployeeAttendance> employeeAttendances = employeeAttendanceRepository.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now());
28784 amit.gupta 1882
 
31886 tejbeer 1883
        Map<Integer, Optional<EmployeeAttendance>> employeeMorningAttendance = employeeAttendances.stream().collect(groupingBy(EmployeeAttendance::getUserId, Collectors.minBy(Comparator.comparing(EmployeeAttendance::getCreateTimestamp))));
31697 amit.gupta 1884
        for (AuthUser authUser : authUsers) {
1885
            User user = userMap.get(authUser.getEmailId());
1886
            Optional<EmployeeAttendance> employeeAttendanceOptional = employeeMorningAttendance.get(user.getId());
1887
            LOGGER.info("AuthUser - {}, employeeAttendanceOptional {}", authUser.getName(), employeeAttendanceOptional);
1888
            if (employeeAttendanceOptional != null) {
1889
                LOGGER.info("employeeAttendanceOptional.orElse {}", employeeAttendanceOptional.orElse(null));
1890
                if (employeeAttendanceOptional.orElse(null) != null) {
31886 tejbeer 1891
                    LOGGER.info("employeeAttendanceOptional.get().getCreateTimestamp() {}", employeeAttendanceOptional.get().getCreateTimestamp());
31697 amit.gupta 1892
                }
1893
            }
31886 tejbeer 1894
            if (employeeAttendanceOptional == null || employeeAttendanceOptional.orElse(null) == null || employeeAttendanceOptional.get().getCreateTimestamp().isAfter(moriningTime)) {
31697 amit.gupta 1895
                LOGGER.info("Will Send Email to {}", authUser.getFullName());
1896
                String body = String.format(
31886 tejbeer 1897
                        "Dear %s,\n Pls note that you haven't punched your attendance by 10:30am%s. You have been marked absent for half the day.\n\nRegards\nHR Team", authUser.getFullName(), (employeeAttendanceOptional == null || employeeAttendanceOptional.orElse(null) == null) ? "" : "(Punched at " + FormattingUtils.format(employeeAttendanceOptional.get().getCreateTimestamp()) + ")");
28790 amit.gupta 1898
 
31886 tejbeer 1899
                Utils.sendMailWithAttachments(googleMailSender, new String[]{authUser.getEmailId()}, new String[]{"kangan.monga@smartdukaan.com"}, "Attendance Alert", body);
28790 amit.gupta 1900
 
31697 amit.gupta 1901
            }
1902
        }
28790 amit.gupta 1903
 
31697 amit.gupta 1904
    }
28790 amit.gupta 1905
 
31697 amit.gupta 1906
    public void sendAttendanceEveningAlert() throws Exception {
1907
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
31886 tejbeer 1908
        Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28709 amit.gupta 1909
 
31697 amit.gupta 1910
        List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
1911
        Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28709 amit.gupta 1912
 
31886 tejbeer 1913
        Map<Integer, List<EmployeeAttendance>> employeeAttendancesMap = employeeAttendanceRepository.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now()).stream().collect(groupingBy(x -> x.getUserId()));
28709 amit.gupta 1914
 
31697 amit.gupta 1915
        for (AuthUser authUser : authUsers) {
1916
            User user = userMap.get(authUser.getEmailId());
1917
            String body = null;
1918
            List<EmployeeAttendance> employeeAttendances = employeeAttendancesMap.get(user.getId());
1919
            if (employeeAttendances == null) {
1920
                body = String.format(
31886 tejbeer 1921
                        "Dear %s,\n No attendance has been registered by you today. You have been marked absent for the day.\n\nRegards\nHR Team", authUser.getFullName());
31697 amit.gupta 1922
            } else {
31886 tejbeer 1923
                List<LocalDateTime> punchTimes = employeeAttendances.stream().sorted(Comparator.comparing(EmployeeAttendance::getCreateTimestamp)).map(x -> x.getCreateTimestamp()).collect(Collectors.toList());
31697 amit.gupta 1924
                if (punchTimes.size() == 1) {
1925
                    // body = String.format("Dear %s,\n Pls note that you haven't punched out yet.
1926
                    // You have been marked absent for half the day. You may contact your manager
1927
                    // and get it regularise.\n\nRegards\nHR Team", authUser.getFullName());
1928
                } else {
1929
                    LocalDateTime firstPunch = punchTimes.get(0);
1930
                    LocalDateTime lastPunch = punchTimes.get(punchTimes.size() - 1);
1931
                    Duration duration = Duration.between(firstPunch, lastPunch);
1932
                    boolean hoursCompleted = lastPunch.isAfter(firstPunch.plusHours(8).plusMinutes(30));
1933
                    if (!hoursCompleted) {
1934
                        body = String.format(
31886 tejbeer 1935
                                "Dear %s,\n Pls note that you haven't completed 8.30 Hrs (%d.%d Hrs). You have been marked absent for half the day.\n\nRegards\nHR Team", authUser.getFullName(), duration.toHours(), duration.toMinutes() - duration.toHours() * 60);
31697 amit.gupta 1936
                    }
1937
                }
28709 amit.gupta 1938
 
31697 amit.gupta 1939
            }
1940
            if (body != null) {
31886 tejbeer 1941
                Utils.sendMailWithAttachments(googleMailSender, new String[]{authUser.getEmailId()}, new String[]{"kangan.monga@smartdukaan.com"}, "Attendance Alert", body);
31697 amit.gupta 1942
            }
1943
        }
28709 amit.gupta 1944
 
31697 amit.gupta 1945
        this.sendMailToHR();
28709 amit.gupta 1946
 
31697 amit.gupta 1947
    }
28709 amit.gupta 1948
 
31697 amit.gupta 1949
    private void sendMailToHR() throws Exception {
1950
        Map<String, String> map = new HashMap<>();
1951
        String reporticoDate = FormattingUtils.formatReporitcoDate(LocalDateTime.now());
1952
        map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
1953
        map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
31886 tejbeer 1954
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "employeeattendance.xml");
1955
        Attachment attachment = new Attachment("attendance-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr);
1956
        Utils.sendMailWithAttachments(googleMailSender, EMPLOYEE_ATTENDANCE_MAIL_LIST, null, "Attendance - " + FormattingUtils.formatDate(LocalDateTime.now()), "PFA Attendance", attachment);
31697 amit.gupta 1957
    }
28709 amit.gupta 1958
 
31697 amit.gupta 1959
    public void checkPartnerActiveStore() throws Exception {
24697 amit.gupta 1960
 
31697 amit.gupta 1961
        List<FofoStore> fofoStores = fofoStoreRepository.selectByStatus(true);
23929 amit.gupta 1962
 
31697 amit.gupta 1963
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
1964
        if (!fofoStores.isEmpty()) {
1965
            for (FofoStore fofoStore : fofoStores) {
24551 amit.gupta 1966
 
31697 amit.gupta 1967
                if (currentDate.isBefore(fofoStore.getActiveTimeStamp())) {
24542 amit.gupta 1968
 
31697 amit.gupta 1969
                    fofoStore.setActive(true);
1970
                    fofoStoreRepository.persist(fofoStore);
1971
                    LOGGER.info("inserted into InActiveFofoStore successfully");
29160 amit.gupta 1972
 
31697 amit.gupta 1973
                } else {
1974
                    fofoStore.setActive(false);
1975
                    fofoStore.setActiveTimeStamp(null);
1976
                    fofoStoreRepository.persist(fofoStore);
1977
                    LOGGER.info("inserted into InActiveFofoStore successfully");
1978
                }
24542 amit.gupta 1979
 
31697 amit.gupta 1980
            }
1981
        }
24542 amit.gupta 1982
 
31697 amit.gupta 1983
    }
24548 amit.gupta 1984
 
31697 amit.gupta 1985
    public void sendAgeingReport() throws Exception {
33820 ranu 1986
        sendAgeingReport("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com", "niranjan.kala@smartdukaan.com", "kuldeep.kumar@smartdukaan.com");
31697 amit.gupta 1987
    }
24542 amit.gupta 1988
 
31697 amit.gupta 1989
    public void moveImeisToPriceDropImeis() throws Exception {
1990
        List<PriceDrop> priceDrops = priceDropRepository.selectAll();
1991
        for (PriceDrop priceDrop : priceDrops) {
1992
            priceDropService.priceDropStatus(priceDrop.getId());
1993
        }
1994
    }
29160 amit.gupta 1995
 
31697 amit.gupta 1996
    public void walletmismatch() throws Exception {
1997
        LocalDate curDate = LocalDate.now();
1998
        List<PartnerDailyInvestment> pdis = partnerDailyInvestmentRepository.selectAll(curDate.minusDays(2));
1999
        System.out.println(pdis.size());
2000
        for (PartnerDailyInvestment pdi : pdis) {
2001
            int fofoId = pdi.getFofoId();
31886 tejbeer 2002
            for (PartnerDailyInvestment investment : Lists.reverse(partnerDailyInvestmentRepository.selectAll(fofoId, null, null))) {
2003
                float statementAmount = walletService.getOpeningTill(fofoId, investment.getDate().plusDays(1).atTime(LocalTime.of(4, 0)));
31697 amit.gupta 2004
                CustomRetailer retailer = retailerService.getFofoRetailer(fofoId);
31886 tejbeer 2005
                LOGGER.info("{}\t{}\t{}\t{}\t{}", fofoId, retailer.getBusinessName(), retailer.getMobileNumber(), investment.getDate().toString(), investment.getWalletAmount(), statementAmount);
29160 amit.gupta 2006
 
31697 amit.gupta 2007
            }
2008
        }
29160 amit.gupta 2009
 
31697 amit.gupta 2010
    }
29160 amit.gupta 2011
 
31697 amit.gupta 2012
    @Autowired
2013
    StateRepository stateRepository;
29160 amit.gupta 2014
 
31697 amit.gupta 2015
    public void gst() throws Exception {
31886 tejbeer 2016
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.of(2021, 8, 16).atStartOfDay(), LocalDateTime.now());
31697 amit.gupta 2017
        for (FofoOrder fofoOrder : fofoOrders) {
31886 tejbeer 2018
            int retailerAddressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoOrder.getFofoId());
24548 amit.gupta 2019
 
31697 amit.gupta 2020
            Address retailerAddress = addressRepository.selectById(retailerAddressId);
2021
            CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
2022
            Integer stateId = null;
2023
            if (customerAddress.getState().equals(retailerAddress.getState())) {
2024
                try {
2025
                    stateId = stateRepository.selectByName(customerAddress.getState()).getId();
2026
                } catch (Exception e) {
2027
                    LOGGER.error("Cannot found state named {}", customerAddress.getState());
2028
                    continue;
2029
                }
2030
            }
2031
            Map<Integer, GstRate> itemIdStateTaxRateMap = null;
24542 amit.gupta 2032
 
31697 amit.gupta 2033
            List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
2034
            List<Integer> itemIds = fofoOrderItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
2035
            if (stateId != null) {
2036
                itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(itemIds, stateId);
2037
            } else {
32145 tejbeer 2038
                itemIdStateTaxRateMap = stateGstRateRepository.getIgstTaxRate(itemIds);
31697 amit.gupta 2039
            }
24580 amit.gupta 2040
 
31697 amit.gupta 2041
            for (FofoOrderItem foi : fofoOrderItems) {
2042
                float sgstRate = foi.getSgstRate();
2043
                float cgstRate = foi.getCgstRate();
2044
                float igstRate = foi.getIgstRate();
32145 tejbeer 2045
                foi.setCgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate());
2046
                foi.setSgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
2047
                foi.setIgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getIgstRate());
24587 amit.gupta 2048
 
32145 tejbeer 2049
                LOGGER.info("Invoice {}, Date {}", fofoOrder.getInvoiceNumber(), fofoOrder.getCreateTimestamp());
2050
                LOGGER.info("customerAddress.getState() {}, retailerAddress.getState() {}", customerAddress.getState(), retailerAddress.getState());
2051
                LOGGER.info("Rates getIgstRate() {}", itemIdStateTaxRateMap.get(foi.getItemId()).getIgstRate());
2052
                LOGGER.info("Rates getCgstRate() {}, getSgstRate() {}", itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate(), itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
24587 amit.gupta 2053
 
2054
 
31697 amit.gupta 2055
            }
2056
        }
26092 amit.gupta 2057
 
31697 amit.gupta 2058
    }
24590 amit.gupta 2059
 
33256 amit.gupta 2060
    public void schemewalletmismatch() throws ProfitMandiBusinessException {
31697 amit.gupta 2061
        LocalDate dateToReconcile = LocalDate.of(2018, 4, 1);
2062
        while (dateToReconcile.isBefore(LocalDate.now())) {
2063
            reconcileSchemes(dateToReconcile);
2064
            // reconcileOrders(dateTime);
2065
            // reconcileRecharges(dateTime);
2066
            dateToReconcile = dateToReconcile.plusDays(1);
2067
        }
2068
    }
24587 amit.gupta 2069
 
33256 amit.gupta 2070
    private void reconcileSchemes(LocalDate date) throws ProfitMandiBusinessException {
31697 amit.gupta 2071
        LocalDateTime startDate = date.atStartOfDay();
2072
        LocalDateTime endDate = startDate.plusDays(1);
2073
        List<SchemeInOut> siosCreated = schemeInOutRepository.selectAllByCreateDate(startDate, endDate);
2074
        List<SchemeInOut> siosRefunded = schemeInOutRepository.selectAllByRefundDate(startDate, endDate);
2075
        double totalSchemeDisbursed = siosCreated.stream().mapToDouble(x -> x.getAmount()).sum();
2076
        double totalSchemeRolledback = siosRefunded.stream().mapToDouble(x -> x.getAmount()).sum();
2077
        double netSchemeDisbursed = totalSchemeDisbursed - totalSchemeRolledback;
31886 tejbeer 2078
        List<WalletReferenceType> walletReferenceTypes = Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT);
2079
        List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByDateType(startDate, endDate, walletReferenceTypes);
31697 amit.gupta 2080
        double schemeAmountWalletTotal = history.stream().mapToDouble(x -> x.getAmount()).sum();
2081
        if (Math.abs(netSchemeDisbursed - schemeAmountWalletTotal) > 10d) {
2082
            LOGGER.info("Scheme Amount mismatched for Date {}", date);
24590 amit.gupta 2083
 
31724 amit.gupta 2084
            Map<Integer, Double> inventoryItemSchemeIO = siosCreated.stream().collect(groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
24635 amit.gupta 2085
 
31886 tejbeer 2086
            Map<Integer, Double> userSchemeMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIO.keySet()).stream().collect(groupingBy(x -> x.getFofoId(), Collectors.summingDouble(x -> inventoryItemSchemeIO.get(x.getId()))));
24635 amit.gupta 2087
 
31724 amit.gupta 2088
            Map<Integer, Double> inventoryItemSchemeIORefunded = siosRefunded.stream().collect(groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
24635 amit.gupta 2089
 
31886 tejbeer 2090
            Map<Integer, Double> userSchemeRefundedMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIORefunded.keySet()).stream().collect(groupingBy(x -> x.getFofoId(), Collectors.summingDouble(x -> inventoryItemSchemeIORefunded.get(x.getId()))));
24635 amit.gupta 2091
 
31697 amit.gupta 2092
            Map<Integer, Double> finalUserSchemeAmountMap = new HashMap<>();
24635 amit.gupta 2093
 
33452 amit.gupta 2094
            for (Entry<Integer, Double> schemeAmount : userSchemeRefundedMap.entrySet()) {
31697 amit.gupta 2095
                if (!finalUserSchemeAmountMap.containsKey(schemeAmount.getKey())) {
2096
                    finalUserSchemeAmountMap.put(schemeAmount.getKey(), schemeAmount.getValue());
2097
                } else {
31886 tejbeer 2098
                    finalUserSchemeAmountMap.put(schemeAmount.getKey(), finalUserSchemeAmountMap.get(schemeAmount.getKey()) + schemeAmount.getValue());
31697 amit.gupta 2099
                }
2100
            }
31886 tejbeer 2101
            Map<Integer, Integer> userWalletMap = userWalletRepository.selectByRetailerIds(finalUserSchemeAmountMap.keySet()).stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24635 amit.gupta 2102
 
31724 amit.gupta 2103
            Map<Integer, Double> walletAmountMap = history.stream().collect(groupingBy(
31697 amit.gupta 2104
                    UserWalletHistory::getWalletId, Collectors.summingDouble((UserWalletHistory::getAmount))));
33452 amit.gupta 2105
            for (Entry<Integer, Double> userAmount : walletAmountMap.entrySet()) {
31697 amit.gupta 2106
                double diff = Math.abs(finalUserSchemeAmountMap.get(userAmount.getKey()) - userAmount.getValue());
2107
                if (diff > 5) {
2108
                    LOGGER.info("Partner scheme mismatched for Userid {}", userWalletMap.get(userAmount.getKey()));
2109
                }
2110
            }
2111
        }
24635 amit.gupta 2112
 
31697 amit.gupta 2113
    }
24635 amit.gupta 2114
 
31697 amit.gupta 2115
    public void sendDailySalesNotificationToPartner(Integer fofoIdInt) throws Exception {
30982 tejbeer 2116
 
31697 amit.gupta 2117
        LocalDateTime now = LocalDateTime.now();
2118
        LocalDateTime from = now.with(LocalTime.MIN);
2119
        String timeString = "Today %s";
2120
        // Send yesterday's report
2121
        /*
2122
         * if (now.getHour() < 13) { timeString = "Yesterday %s"; from =
2123
         * now.minusDays(1).; now = from.with(LocalTime.MAX);
2124
         *
2125
         * }
2126
         */
30982 tejbeer 2127
 
31697 amit.gupta 2128
        List<Integer> fofoIds = null;
31886 tejbeer 2129
        Map<Integer, FofoStore> fofoStoreMap = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getId(), x -> x));
30982 tejbeer 2130
 
24653 govind 2131
 
31697 amit.gupta 2132
        if (fofoIdInt == null) {
2133
            fofoIds = new ArrayList<>(fofoStoreMap.keySet());
2134
        } else {
2135
            fofoIds = Arrays.asList(fofoIdInt);
2136
        }
2137
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
28368 tejbeer 2138
 
31886 tejbeer 2139
        Map<Integer, Float> partnerPolicyAmountMap = insurancePolicyRepository.selectAmountSumGroupByRetailerId(now, null);
31697 amit.gupta 2140
        Map<Integer, Long> partnerPolicyQtyMap = insurancePolicyRepository.selectQtyGroupByRetailerId(now, null);
28368 tejbeer 2141
 
31886 tejbeer 2142
        Map<Integer, Double> spPartnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0, true);
28377 tejbeer 2143
 
31886 tejbeer 2144
        Map<Integer, Double> spPartner3DaysOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from.minusDays(3), now, 0, true);
31697 amit.gupta 2145
        Map<Integer, Long> spPartnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, true);
28368 tejbeer 2146
 
31886 tejbeer 2147
        Map<Integer, Double> partnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0, false);
31697 amit.gupta 2148
        Map<Integer, Long> partnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, false);
28377 tejbeer 2149
 
31697 amit.gupta 2150
        //4 days + current day running
2151
        Map<Integer, Double> partnerBilledValueMap = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(from.minusDays(4), now);
28377 tejbeer 2152
 
31697 amit.gupta 2153
        Map<Integer, SaleTargetReportModel> saleTargetReportModelMap = new HashMap<>();
2154
        for (int fofoId : fofoIds) {
2155
            SaleTargetReportModel model = new SaleTargetReportModel();
2156
            model.setInsuranceSale(
2157
                    partnerPolicyAmountMap.containsKey(fofoId) ? partnerPolicyAmountMap.get(fofoId).doubleValue() : 0);
2158
            model.setInsruanceQty(partnerPolicyQtyMap.containsKey(fofoId) ? partnerPolicyQtyMap.get(fofoId) : 0);
2159
            model.setSecondary(partnerBilledValueMap.containsKey(fofoId) ? partnerBilledValueMap.get(fofoId) : 0);
2160
            model.setSmartphoneSale(spPartnerOrderValMap.containsKey(fofoId) ? spPartnerOrderValMap.get(fofoId) : 0);
2161
            model.setSmartphoneQty(spPartnerOrderQtyMap.containsKey(fofoId) ? spPartnerOrderQtyMap.get(fofoId) : 0);
2162
            model.setTotalSale(partnerOrderValMap.containsKey(fofoId) ? partnerOrderValMap.get(fofoId) : 0);
2163
            model.setTotalQty(partnerOrderQtyMap.containsKey(fofoId) ? partnerOrderQtyMap.get(fofoId) : 0);
2164
            model.setPast3daysSale(
2165
                    spPartner3DaysOrderValMap.containsKey(fofoId) ? spPartner3DaysOrderValMap.get(fofoId) : 0);
2166
            model.setFofoId(fofoId);
2167
            model.setCode(fofoStoreMap.get(fofoId).getCode());
31724 amit.gupta 2168
            model.setActivationType(fofoStoreMap.get(fofoId).getActivationType());
31697 amit.gupta 2169
            saleTargetReportModelMap.put(fofoId, model);
2170
        }
28377 tejbeer 2171
 
31697 amit.gupta 2172
        Map<Integer, FofoReportingModel> partnerSalesHeadersMap = this.getPartnerIdSalesHeaders();
2173
        for (Integer fofoId : fofoIds) {
2174
            SaleTargetReportModel model = saleTargetReportModelMap.get(fofoId);
28368 tejbeer 2175
 
31697 amit.gupta 2176
            // com.spice.profitmandi.dao.entity.user.User user =
2177
            // userUserRepository.selectById(fofoId);
28377 tejbeer 2178
 
31697 amit.gupta 2179
            // Address address = addressRepository.selectById(user.getAddressId());
28377 tejbeer 2180
 
31697 amit.gupta 2181
            String title = "Sale Update";
31886 tejbeer 2182
            String messageTemplate = String.format("Smartphones Rs.%.0f, Insurance Rs.%.0f, Total Rs.%.0f till %s.", model.getSmartphoneSale(), model.getInsuranceSale(), model.getTotalSale(), String.format(timeString, now.format(timeFormatter)));
31697 amit.gupta 2183
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
2184
            sendNotificationModel.setCampaignName("Sales update alert");
2185
            sendNotificationModel.setTitle(title);
2186
            sendNotificationModel.setMessage(messageTemplate);
2187
            sendNotificationModel.setType("url");
2188
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
2189
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
2190
            sendNotificationModel.setMessageType(MessageType.notification);
2191
            int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
2192
            sendNotificationModel.setUserIds(Arrays.asList(userId));
2193
            notificationService.sendNotification(sendNotificationModel);
2194
            String whatsappMessageTemplate = String.format(
31886 tejbeer 2195
                    "Dear Partner, Your sale update is Smartphones Rs.%.0f, Insurance Rs.%.0f, Total Rs.%.0f till %s.", model.getSmartphoneSale(), model.getInsuranceSale(), model.getTotalSale(), String.format(timeString, now.format(timeFormatter)));
31697 amit.gupta 2196
            // notificationService.sendWhatsappMessage(whatsappMessageTemplate, title,
2197
            // address.getPhoneNumber());
28377 tejbeer 2198
 
31697 amit.gupta 2199
        }
2200
        // String saleReport = this.getDailySalesReportHtml(partnerSalesHeadersMap,
2201
        // saleTargetReportModelMap);
2202
        this.getStateWiseSales(saleTargetReportModelMap, partnerSalesHeadersMap);
2203
    }
28377 tejbeer 2204
 
31697 amit.gupta 2205
    public void checkRazorPayPaymentStatus() throws Exception {
31886 tejbeer 2206
        List<PendingOrder> pendingOrder = pendingOrderRepository.selectAllByStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PENDING);
28377 tejbeer 2207
 
31697 amit.gupta 2208
        for (PendingOrder po : pendingOrder) {
2209
            RazorPay razorPay = razorPayRepository.selectByOrdeId(po.getId());
2210
            List<PendingOrderItem> poItems = pendingOrderItemRepository.selectByOrderId(po.getId());
28369 tejbeer 2211
 
31697 amit.gupta 2212
            LOGGER.info("razorPay" + razorPay);
2213
            if (razorPay != null) {
2214
                List<Payment> payments = razorPaymentService.fetchOrderForPayment(razorPay.getRazorOrderId());
28368 tejbeer 2215
 
31697 amit.gupta 2216
                if (!payments.isEmpty()) {
2217
                    List<String> statusList = new ArrayList<>();
2218
                    for (Payment payment : payments) {
25880 amit.gupta 2219
 
31697 amit.gupta 2220
                        JSONObject jsonObj = new JSONObject(payment.toString());
25880 amit.gupta 2221
 
31697 amit.gupta 2222
                        String status = jsonObj.getString("status");
25880 amit.gupta 2223
 
31697 amit.gupta 2224
                        statusList.add(status);
25865 amit.gupta 2225
 
31697 amit.gupta 2226
                    }
2227
                    LOGGER.info("statusList" + statusList);
26941 amit.gupta 2228
 
31697 amit.gupta 2229
                    if (statusList.contains("authorized") || statusList.contains("captured")) {
2230
                        po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
2231
                        po.setPaidAmount(po.getTotalAmount());
2232
                        for (PendingOrderItem poi : poItems) {
2233
                            poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
2234
                        }
2235
                        Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(po);
26941 amit.gupta 2236
 
31697 amit.gupta 2237
                        CustomRetailer customRetailer = retailerService.getFofoRetailer(po.getFofoId());
2238
                        Customer customer = customerRepository.selectById(po.getCustomerId());
2239
                        String[] customerEmail = null;
2240
                        if (customer.getEmailId() != null) {
2241
                            customerEmail = new String[]{customer.getEmailId()};
2242
                        }
31886 tejbeer 2243
                        List<String> bccTo = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com", "niranjan.kala@smartdukaan.com", "sm@smartdukaan.com", "tejbeer.kaur@shop2020.in", customRetailer.getEmail());
31697 amit.gupta 2244
                        List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
2245
                        if (authUserEmails != null) {
2246
                            authUserEmails = new ArrayList<>();
2247
                        }
2248
                        authUserEmails.addAll(bccTo);
26945 amit.gupta 2249
 
31697 amit.gupta 2250
                        // emailService.sendMailWithAttachments("Order Created with SmartDukaan",
2251
                        // "order-confirm.vm",
2252
                        // emailModel, customerEmail, null, authUserEmails.toArray(new String[0]));
26945 amit.gupta 2253
 
31697 amit.gupta 2254
                    } else if (statusList.contains("refunded") || statusList.contains("failed")) {
2255
                        for (PendingOrderItem poi : poItems) {
2256
                            poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
2257
                        }
25865 amit.gupta 2258
 
31697 amit.gupta 2259
                        po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
2260
                    }
25865 amit.gupta 2261
 
31697 amit.gupta 2262
                }
2263
                // LOGGER.info("payment" + payments);
25865 amit.gupta 2264
 
31697 amit.gupta 2265
            }
2266
        }
2267
    }
25865 amit.gupta 2268
 
31697 amit.gupta 2269
    public static class SaleTargetReportModel {
2270
        private double totalSale;
2271
        private long totalQty;
2272
        private double past3daysSale;
2273
        private int fofoId;
2274
        private String code;
31724 amit.gupta 2275
        private ActivationType activationType;
25865 amit.gupta 2276
 
31724 amit.gupta 2277
 
2278
        @Override
2279
        public boolean equals(Object o) {
2280
            if (this == o) return true;
2281
            if (o == null || getClass() != o.getClass()) return false;
2282
            SaleTargetReportModel that = (SaleTargetReportModel) o;
2283
            return Double.compare(that.totalSale, totalSale) == 0 && totalQty == that.totalQty && Double.compare(that.past3daysSale, past3daysSale) == 0 && fofoId == that.fofoId && Double.compare(that.secondary, secondary) == 0 && Double.compare(that.smartphoneSale, smartphoneSale) == 0 && smartphoneQty == that.smartphoneQty && Double.compare(that.insuranceSale, insuranceSale) == 0 && insruanceQty == that.insruanceQty && Objects.equals(code, that.code) && activationType == that.activationType;
2284
        }
2285
 
2286
        @Override
2287
        public int hashCode() {
2288
            return Objects.hash(totalSale, totalQty, past3daysSale, fofoId, code, activationType, secondary, smartphoneSale, smartphoneQty, insuranceSale, insruanceQty);
2289
        }
2290
 
2291
        public ActivationType getActivationType() {
2292
            return activationType;
2293
        }
2294
 
2295
        public void setActivationType(ActivationType activationType) {
2296
            this.activationType = activationType;
2297
        }
2298
 
31697 amit.gupta 2299
        public double getSecondary() {
2300
            return secondary;
2301
        }
25865 amit.gupta 2302
 
31697 amit.gupta 2303
        public void setSecondary(double secondary) {
2304
            this.secondary = secondary;
2305
        }
25865 amit.gupta 2306
 
31697 amit.gupta 2307
        private double secondary;
25865 amit.gupta 2308
 
31697 amit.gupta 2309
        public int getFofoId() {
2310
            return fofoId;
2311
        }
25865 amit.gupta 2312
 
31697 amit.gupta 2313
        @Override
2314
        public String toString() {
31886 tejbeer 2315
            return "SaleTargetReportModel{" + "totalSale=" + totalSale + ", totalQty=" + totalQty + ", past3daysSale=" + past3daysSale + ", fofoId=" + fofoId + ", code='" + code + '\'' + ", secondary=" + secondary + ", smartphoneSale=" + smartphoneSale + ", smartphoneQty=" + smartphoneQty + ", insuranceSale=" + insuranceSale + ", insruanceQty=" + insruanceQty + '}';
31697 amit.gupta 2316
        }
25865 amit.gupta 2317
 
31697 amit.gupta 2318
        public String getCode() {
2319
            return code;
2320
        }
25865 amit.gupta 2321
 
31697 amit.gupta 2322
        public void setCode(String code) {
2323
            this.code = code;
2324
        }
25865 amit.gupta 2325
 
31697 amit.gupta 2326
        public void setFofoId(int fofoId) {
2327
            this.fofoId = fofoId;
2328
        }
25872 tejbeer 2329
 
31697 amit.gupta 2330
        private double smartphoneSale;
2331
        private long smartphoneQty;
2332
        private double insuranceSale;
2333
        private long insruanceQty;
26945 amit.gupta 2334
 
31697 amit.gupta 2335
        public long getTotalQty() {
2336
            return totalQty;
2337
        }
30765 tejbeer 2338
 
31697 amit.gupta 2339
        public void setTotalQty(long totalQty) {
2340
            this.totalQty = totalQty;
2341
        }
2342
 
2343
        public double getPast3daysSale() {
2344
            return past3daysSale;
2345
        }
2346
 
2347
        public void setPast3daysSale(double past3daysSale) {
2348
            this.past3daysSale = past3daysSale;
2349
        }
2350
 
2351
        public double getTotalSale() {
2352
            return totalSale;
2353
        }
2354
 
2355
        public void setTotalSale(double totalSale) {
2356
            this.totalSale = totalSale;
2357
        }
2358
 
2359
        public double getSmartphoneSale() {
2360
            return smartphoneSale;
2361
        }
2362
 
2363
        public void setSmartphoneSale(double smartphoneSale) {
2364
            this.smartphoneSale = smartphoneSale;
2365
        }
2366
 
2367
        public long getSmartphoneQty() {
2368
            return smartphoneQty;
2369
        }
2370
 
2371
        public void setSmartphoneQty(long smartphoneQty) {
2372
            this.smartphoneQty = smartphoneQty;
2373
        }
2374
 
2375
        public double getInsuranceSale() {
2376
            return insuranceSale;
2377
        }
2378
 
2379
        public void setInsuranceSale(double insuranceSale) {
2380
            this.insuranceSale = insuranceSale;
2381
        }
2382
 
2383
        public long getInsruanceQty() {
2384
            return insruanceQty;
2385
        }
2386
 
2387
        public void setInsruanceQty(long insruanceQty) {
2388
            this.insruanceQty = insruanceQty;
2389
        }
2390
 
2391
    }
2392
 
32482 amit.gupta 2393
    private void getStateWiseSales
2394
            (Map<Integer, SaleTargetReportModel> saleTargetReportModelMap, Map<Integer, FofoReportingModel> partnerSalesHeadersMap) throws
2395
            Exception {
31697 amit.gupta 2396
        String timeString = "Today %s";
2397
        LocalDateTime now = LocalDateTime.now();
2398
 
2399
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
35521 amit 2400
        List<Integer> categoryIds = Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_LOGISTICS, ProfitMandiConstants.TICKET_CATEGORY_FINANCIAL_SERVICES, ProfitMandiConstants.TICKET_CATEGORY_CATEGORY, ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_ABM, ProfitMandiConstants.TICKET_CATEGORY_MARKETING, ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS, ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT, ProfitMandiConstants.TICKET_CATEGORY_TECHNOLOGY);
31697 amit.gupta 2401
 
2402
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false);
2403
 
31746 amit.gupta 2404
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
2405
            String email = storeGuyEntry.getKey();
2406
            Set<Integer> fofoIds = storeGuyEntry.getValue();
2407
            LOGGER.info("fofoIds {}", fofoIds);
24683 amit.gupta 2408
 
31746 amit.gupta 2409
            if (!fofoIds.isEmpty()) {
31886 tejbeer 2410
                List<FofoStore> stores = fofoStoreRepository.selectActivePartnersByRetailerIds(new ArrayList<>(fofoIds));
26945 amit.gupta 2411
 
31724 amit.gupta 2412
                Map<String, List<Integer>> stateMap = stores.stream().collect(groupingBy(
2413
                        x -> x.getCode().substring(0, 2), mapping(x -> x.getId(), Collectors.toList())));
31697 amit.gupta 2414
                List<List<Serializable>> stateWiseSales = new ArrayList<>();
33452 amit.gupta 2415
                for (Entry<String, List<Integer>> stateMapEntry : stateMap.entrySet()) {
31886 tejbeer 2416
                    long totalQty = stateMapEntry.getValue().stream().collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getTotalQty()));
2417
                    double totalSale = stateMapEntry.getValue().stream().collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getTotalSale()));
2418
                    long smartPhoneQty = stateMapEntry.getValue().stream().collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getSmartphoneQty()));
31697 amit.gupta 2419
                    double smartPhoneSale = stateMapEntry.getValue().stream().collect(
2420
                            Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getSmartphoneSale()));
2421
                    stateWiseSales.add(
2422
                            Arrays.asList(stateMapEntry.getKey(), smartPhoneQty, smartPhoneSale, totalQty, totalSale));
2423
                }
2424
                StringBuilder sb = new StringBuilder();
2425
                sb.append("<html><body>");
2426
                sb.append("<p>Statewise Sale Report:</p><br/><table style=\"border-collapse: collapse;\">");
31886 tejbeer 2427
                sb.append("<tbody>\n" + "	    <tr>" + "	    					<th style='border:1px solid black;padding: 5px'>State</th>" + "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Qty</th>" + "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Value</th>" + "	    					<th style='border:1px solid black;padding: 5px'>Total Qty</th>" + "	    					<th style='border:1px solid black;padding: 5px'>Total Value</th>" + "	    				</tr>");
31697 amit.gupta 2428
                for (List<Serializable> stateSale : stateWiseSales) {
2429
                    sb.append("<tr>");
2430
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(0) + "</td>");
2431
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(1) + "</td>");
2432
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(2) + "</td>");
2433
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(3) + "</td>");
2434
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(4) + "</td>");
2435
                    sb.append("</tr>");
2436
                }
2437
                sb.append("</tbody></table><br><br>");
26945 amit.gupta 2438
 
31697 amit.gupta 2439
                sb.append("<p>Partnerwise Report:</p><br/><table style=\"border-collapse: collapse;\">");
31886 tejbeer 2440
                sb.append("<tbody>\n" + "	    				<tr>\n" + "	    					<th style='border:1px solid black;padding: 5px'>Code</th>" + "	    					<th style='border:1px solid black;padding: 5px'>Business Name</th>" + "	    					<th style='border:1px solid black;padding: 5px'>BDM Name</th>" + "	    					<th style='border:1px solid black;padding: 5px'>Regional Manager</th>" + "	    					<th style='border:1px solid black;padding: 5px'>Territory Manager</th>" + "	    					<th style='border:1px solid black;padding: 5px'>Billed(4 days)</th>" + "	    					<th style='border:1px solid black;padding: 5px'>Sale</th>" + "	    					<th style='border:1px solid black;padding: 5px'>Smartphone Sale</th>" + "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Qty</th>" + "	    				</tr>");
31169 tejbeer 2441
 
2442
 
31886 tejbeer 2443
                List<Integer> sortedSaleTargetReport = saleTargetReportModelMap.values().stream().filter(x -> fofoIds.contains(x.getFofoId())).sorted(Comparator.comparing(SaleTargetReportModel::getCode).thenComparing(SaleTargetReportModel::getSecondary)).map(SaleTargetReportModel::getFofoId).collect(Collectors.toList());
31169 tejbeer 2444
 
31697 amit.gupta 2445
                String subject = String.format("Sale till %s", String.format(timeString, now.format(timeFormatter)));
31169 tejbeer 2446
 
31886 tejbeer 2447
                List<String> headers = Arrays.asList("Store Id", "Store Code", "Store Name", "Activation Type", "BDM Name", "Regional Manager", "Territory Manager", "Secondary(4 days)", "Sale", "Smartphone Value", "Smartphone Qty");
31697 amit.gupta 2448
                List<List<?>> rows = new ArrayList<>();
2449
                for (Integer fofoId : sortedSaleTargetReport) {
2450
                    FofoReportingModel fofoReportingModel = partnerSalesHeadersMap.get(fofoId);
31886 tejbeer 2451
                    rows.add(Arrays.asList(fofoId, fofoReportingModel.getCode(), fofoReportingModel.getBusinessName(), saleTargetReportModelMap.get(fofoId).getActivationType(), fofoReportingModel.getBusinessManager(), fofoReportingModel.getRegionalManager(), fofoReportingModel.getTerritoryManager(), saleTargetReportModelMap.get(fofoId).getSecondary(), saleTargetReportModelMap.get(fofoId).getTotalSale(), saleTargetReportModelMap.get(fofoId).getSmartphoneSale(), saleTargetReportModelMap.get(fofoId).getSmartphoneQty()
31697 amit.gupta 2452
                    ));
31169 tejbeer 2453
 
31724 amit.gupta 2454
                    //Now try to populate html rows
2455
                    if (!saleTargetReportModelMap.get(fofoId).getActivationType().equals(ActivationType.ACTIVE)) {
31697 amit.gupta 2456
                        continue;
2457
                    }
2458
                    if (saleTargetReportModelMap.get(fofoId).getSecondary() == 0) {
2459
                        sb.append("<tr style='background-color:#D21F3C;color:white'>");
2460
                    } else {
2461
                        sb.append("<tr>");
2462
                    }
31886 tejbeer 2463
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getCode() + "</td>");
2464
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getBusinessName() + "</td>");
2465
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getBusinessManager() + "</td>");
2466
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getRegionalManager() + "</td>");
2467
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getTerritoryManager() + "</td>");
2468
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSecondary() + "</td>");
2469
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getTotalSale() + "</td>");
2470
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSmartphoneSale() + "</td>");
2471
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSmartphoneQty() + "</td>");
31697 amit.gupta 2472
                    sb.append("</tr>");
24841 govind 2473
 
25300 tejbeer 2474
 
31697 amit.gupta 2475
                }
2476
                sb.append("</tr>");
2477
                sb.append("</body></html>");
2478
                String statewiseSaleReport = sb.toString();
25300 tejbeer 2479
 
2480
 
31697 amit.gupta 2481
                ByteArrayOutputStream baos = null;
2482
                try {
2483
                    baos = FileUtil.getCSVByteStream(headers, rows);
2484
                } catch (Exception e2) {
2485
                    e2.printStackTrace();
2486
                }
2487
                Attachment attachment = new Attachment("PartnerSalePerformance.csv", new ByteArrayResource(baos.toByteArray()));
2488
                Utils.sendHtmlMailWithAttachments(googleMailSender, new String[]{email}, null, "Statewise " + subject, statewiseSaleReport, attachment);
2489
            }
2490
        }
2491
    }
29668 tejbeer 2492
 
32350 amit.gupta 2493
 
32482 amit.gupta 2494
    private void sendMailOfHtmlFormat(JavaMailSender sender, String[] email, String body, String cc[], String subject) throws
2495
            MessagingException, ProfitMandiBusinessException, IOException {
32350 amit.gupta 2496
        MimeMessage message = sender.createMimeMessage();
31697 amit.gupta 2497
        MimeMessageHelper helper = new MimeMessageHelper(message);
2498
        helper.setSubject(subject);
2499
        helper.setText(body, true);
2500
        helper.setTo(email);
2501
        if (cc != null) {
2502
            helper.setCc(cc);
2503
        }
2504
        InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
2505
        helper.setFrom(senderAddress);
2506
        mailSender.send(message);
2507
    }
25694 amit.gupta 2508
 
31697 amit.gupta 2509
    public void sendNotification() throws Exception {
34042 vikas.jang 2510
        LOGGER.info("FCM sendNotification");
32610 amit.gupta 2511
        List<PushNotifications> pushNotifications = pushNotificationRepository.selectAllPendingNotifications();
31697 amit.gupta 2512
        if (!pushNotifications.isEmpty()) {
34042 vikas.jang 2513
            InputStream serviceAccount = getClass().getClassLoader().getResourceAsStream("service-account.json");
34039 vikas.jang 2514
            GoogleCredentials googleCredentials = GoogleCredentials.fromStream(serviceAccount).createScoped(FCM_SCOPED);
2515
            googleCredentials.refreshIfExpired();
2516
            String accessToken = googleCredentials.getAccessToken().getTokenValue();
2517
 
31697 amit.gupta 2518
            for (PushNotifications pushNotification : pushNotifications) {
2519
                Device device = deviceRepository.selectById(pushNotification.getDeviceId());
31886 tejbeer 2520
                NotificationCampaign notificationCampaign = notificationCampaignRepository.selectById(pushNotification.getNotificationCampaignid());
2521
                SimpleCampaignParams scp = gson.fromJson(notificationCampaign.getImplementationParams(), SimpleCampaignParams.class);
31697 amit.gupta 2522
                Campaign campaign = new SimpleCampaign(scp);
2523
                String result_url = campaign.getUrl() + "&user_id=" + device.getUser_id();
34039 vikas.jang 2524
 
2525
                JSONObject message = new JSONObject();
2526
                message.put("token", device.getFcmId());
2527
 
2528
                JSONObject notification = new JSONObject();
2529
                notification.put("title", campaign.getTitle());
2530
                notification.put("body", campaign.getMessage());
2531
                message.put("notification", notification);
2532
 
2533
                JSONObject data = new JSONObject();
2534
                data.put("type", campaign.getType());
2535
                data.put("url", result_url);
2536
                data.put("time_to_live", campaign.getExpireTimestamp());
2537
                data.put("image", campaign.getImageUrl());
2538
                data.put("largeIcon", "large_icon");
2539
                data.put("smallIcon", "small_icon");
34043 vikas.jang 2540
                data.put("vibrate", "1");
34044 vikas.jang 2541
                data.put("pid", String.valueOf(pushNotification.getId()));
34043 vikas.jang 2542
                data.put("sound", "1");
34039 vikas.jang 2543
                data.put("priority", "high");
2544
                message.put("data", data);
2545
 
2546
                JSONObject payload = new JSONObject();
2547
                payload.put("message", message);
2548
 
31697 amit.gupta 2549
                try {
2550
                    CloseableHttpClient client = HttpClients.createDefault();
2551
                    HttpPost httpPost = new HttpPost(FCM_URL);
25694 amit.gupta 2552
 
34039 vikas.jang 2553
                    httpPost.setHeader("Authorization", "Bearer " + accessToken);
2554
                    httpPost.setHeader("Content-Type", "application/json");
2555
 
2556
                    StringEntity entity = new StringEntity(payload.toString());
31697 amit.gupta 2557
                    httpPost.setEntity(entity);
2558
                    CloseableHttpResponse response = client.execute(httpPost);
34275 tejus.loha 2559
                    LOGGER.info("google FCM status code: {}", response.getStatusLine().getStatusCode());
34043 vikas.jang 2560
                    String responseBody = new BufferedReader(new InputStreamReader(response.getEntity().getContent()))
2561
                            .lines().collect(Collectors.joining("\n"));
31697 amit.gupta 2562
                    if (response.getStatusLine().getStatusCode() == 200) {
2563
                        pushNotification.setSentTimestamp(LocalDateTime.now());
2564
                    } else {
2565
                        pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
34043 vikas.jang 2566
                        LOGGER.info("FCM Response message" + responseBody);
31697 amit.gupta 2567
                        response.toString();
2568
                    }
25694 amit.gupta 2569
 
31697 amit.gupta 2570
                } catch (Exception e) {
2571
                    e.printStackTrace();
2572
                    pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
2573
                    LOGGER.info("message " + "not sent " + e.getMessage());
2574
                }
2575
            }
2576
        }
2577
    }
25721 tejbeer 2578
 
31697 amit.gupta 2579
    public void grouping() throws Exception {
2580
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yyyy hh:mm");
2581
        List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByStatus(PriceDropImeiStatus.APPROVED);
31886 tejbeer 2582
        System.out.println(String.join("\t", Arrays.asList("IMEI", "ItemId", "Brand", "Model Name", "Model Number", "Franchise Id", "Franchise Name", "Grn On", "Price Dropped On", "Approved On", "Returned On", "Price Drop Paid", "Is Doa")));
31697 amit.gupta 2583
        Map<Integer, CustomRetailer> retailersMap = retailerService.getFofoRetailers(false);
2584
        for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
2585
            if (priceDropIMEI.getPartnerId() == 0)
2586
                continue;
2587
            HashSet<String> imeis = new HashSet<>();
2588
            PriceDrop priceDrop = priceDropRepository.selectById(priceDropIMEI.getPriceDropId());
2589
            imeis.add(priceDropIMEI.getImei());
31886 tejbeer 2590
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(priceDropIMEI.getPartnerId(), imeis, false);
31697 amit.gupta 2591
            if (inventoryItems.size() == 0) {
2592
                LOGGER.info("Need to investigate partnerId - {} imeis - {}", priceDropIMEI.getPartnerId(), imeis);
2593
                continue;
2594
            }
2595
            InventoryItem inventoryItem = inventoryItems.get(0);
2596
            CustomRetailer customRetailer = retailersMap.get(inventoryItem.getFofoId());
31886 tejbeer 2597
            if (inventoryItem.getLastScanType().equals(ScanType.DOA_OUT) || inventoryItem.getLastScanType().equals(ScanType.PURCHASE_RET)) {
31697 amit.gupta 2598
                // check if pricedrop has been rolled out
31886 tejbeer 2599
                List<UserWalletHistory> uwh = walletService.getAllByReference(inventoryItem.getFofoId(), priceDropIMEI.getPriceDropId(), WalletReferenceType.PRICE_DROP);
31697 amit.gupta 2600
                if (uwh.size() > 0) {
2601
                    Item item = itemRepository.selectById(inventoryItem.getItemId());
31886 tejbeer 2602
                    System.out.println(String.join("\t", Arrays.asList(priceDropIMEI.getImei(), inventoryItem.getItemId() + "", item.getBrand(), item.getModelName(), item.getModelNumber(), inventoryItem.getFofoId() + "", customRetailer.getBusinessName(), inventoryItem.getCreateTimestamp().format(dtf), priceDrop.getAffectedOn().format(dtf), priceDropIMEI.getUpdateTimestamp().format(dtf), inventoryItem.getUpdateTimestamp().format(dtf), priceDrop.getAutoPartnerPayout(inventoryItem.getUpdateTimestamp()) + "", inventoryItem.getLastScanType().equals(ScanType.DOA_OUT) + "")));
31697 amit.gupta 2603
                }
2604
            }
2605
        }
2606
    }
25721 tejbeer 2607
 
31697 amit.gupta 2608
    public void toffeeRollback() throws Exception {
2609
        toffeeService.cancelPolicyCopy("110143521986");
2610
        toffeeService.getOrderId("110143521986");
2611
    }
27212 tejbeer 2612
 
31697 amit.gupta 2613
    public void attachToffeeInvoices() throws Exception {
31886 tejbeer 2614
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(3, Optional.of(false));
31697 amit.gupta 2615
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
2616
            String invoiceNumber = insurancePolicy.getInvoiceNumber();
2617
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2618
            InvoicePdfModel pdfModel = orderService.getInvoicePdfModel(fofoOrder.getId());
2619
            java.io.ByteArrayOutputStream byteArrayOutputStream = new java.io.ByteArrayOutputStream();
2620
            PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
31886 tejbeer 2621
            String pdfInvoiceString = "data:application/pdf;base64," + Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());
2622
            boolean attached = toffeeService.attachInvoice(insurancePolicy.getPolicyNumber().split("#")[1], pdfInvoiceString);
31697 amit.gupta 2623
            if (attached) {
2624
                insurancePolicy.setPosted(true);
2625
            }
2626
        }
2627
    }
25721 tejbeer 2628
 
31697 amit.gupta 2629
    public void sendBAGPendingPolicies() throws Exception {
31886 tejbeer 2630
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(4, Optional.of(false));
31697 amit.gupta 2631
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
2632
            String invoiceNumber = insurancePolicy.getInvoiceNumber();
2633
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2634
            FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId()).get(0);
2635
            CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
2636
            Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
2637
            BAGInsuranceModel bagInsuranceModel = new BAGInsuranceModel();
2638
            // bagInsuranceModel.setModelId();
2639
            bagInsuranceModel.setAddressLine1(customerAddress.getLine1());
2640
            bagInsuranceModel.setAddressLine2(customerAddress.getLine2());
2641
            bagInsuranceModel.setCity(customerAddress.getCity());
2642
            bagInsuranceModel.setBrandWarranty("1 Year");
2643
            Item item = itemRepository.selectById(fofoOrderItem.getId());
2644
            bagInsuranceModel.setModelName(item.getItemDescription());
2645
            bagInsuranceModel.setDateOfPurchase(fofoOrder.getFormattedDate());
2646
            bagInsuranceModel.setEmail(customer.getEmailId());
2647
            bagInsuranceModel.setImei1(insurancePolicy.getSerialNumber());
2648
            bagInsuranceModel.setFirstName(customer.getFirstName());
2649
            bagInsuranceModel.setLastName(customer.getLastName());
2650
            bagInsuranceModel.setMobileNumber(customer.getMobileNumber());
2651
            bagInsuranceModel.setPlanId("");
2652
            insurancePolicy.setPosted(true);
2653
        }
2654
    }
25721 tejbeer 2655
 
31697 amit.gupta 2656
    public void schemeRollback(List<String> schemeIds) throws Exception {
2657
        List<Integer> schemeIdsInt = schemeIds.stream().map(x -> Integer.parseInt(x)).collect(Collectors.toList());
31886 tejbeer 2658
        Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIdsInt, 0, schemeIds.size()).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
31697 amit.gupta 2659
        List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectBySchemeIds(new HashSet<>(schemeIdsInt));
2660
        for (SchemeInOut sio : schemeInOuts) {
2661
            Scheme scheme = schemesMap.get(sio.getSchemeId());
34324 amit.gupta 2662
            if (scheme.getType().getTransactionType().equals(StockTransactionType.IN)) {
25721 tejbeer 2663
 
34324 amit.gupta 2664
            } else if (scheme.getType().getTransactionType().equals(StockTransactionType.OUT)) {
31697 amit.gupta 2665
                InventoryItem inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
2666
                List<ScanRecord> sr = scanRecordRepository.selectByInventoryItemId(sio.getInventoryItemId());
31886 tejbeer 2667
                ScanRecord scanRecord = sr.stream().filter(x -> x.getType().equals(ScanType.SALE)).max((x1, x2) -> x1.getCreateTimestamp().compareTo(x2.getCreateTimestamp())).get();
2668
                if (scanRecord.getCreateTimestamp().isAfter(scheme.getEndDateTime()) || scanRecord.getCreateTimestamp().isBefore(scheme.getStartDateTime())) {
31697 amit.gupta 2669
                    sio.setRolledBackTimestamp(LocalDateTime.now());
2670
                    FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(scanRecord.getOrderId());
31886 tejbeer 2671
                    String rollbackReason = "Scheme reversed for " + itemRepository.selectById(inventoryItem.getItemId()).getItemDescription() + "/Inv - " + fofoOrder.getInvoiceNumber();
2672
                    walletService.rollbackAmountFromWallet(scanRecord.getFofoId(), sio.getAmount(), scanRecord.getOrderId(), WalletReferenceType.SCHEME_OUT, rollbackReason, LocalDateTime.now());
2673
                    System.out.printf("Amount %f,SchemeId %d,Reason %s\n", sio.getAmount(), sio.getSchemeId(), rollbackReason);
31697 amit.gupta 2674
                }
2675
            }
2676
        }
2677
        // throw new Exception();
2678
    }
25721 tejbeer 2679
 
31697 amit.gupta 2680
    public void checkfocusedModelInPartnerStock() throws Exception {
25721 tejbeer 2681
 
35442 amit 2682
        // ========== PHASE 1: Batch fetch all data upfront ==========
2683
        Map<Integer, FofoStore> fofoStoreMap = fofoStoreRepository.selectActiveStores().stream()
2684
                .collect(Collectors.toMap(FofoStore::getId, x -> x));
2685
        List<Integer> allPartnerIds = new ArrayList<>(fofoStoreMap.keySet());
2686
 
31886 tejbeer 2687
        Map<Integer, Map<Integer, List<SaholicCIS>>> warehouseItemAvailabilityMap = saholicInventoryService.getSaholicStock();
31697 amit.gupta 2688
        Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
2689
        Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = this.getPartnerIdSalesHeaders();
35442 amit 2690
        Map<Integer, List<FocusedModel>> regionFocusedModelsMap = focusedModelRepository.selectAll().stream()
2691
                .collect(Collectors.groupingBy(FocusedModel::getRegionId));
2692
        LOGGER.info("regionFocusedModelsMap - {}", regionFocusedModelsMap);
31886 tejbeer 2693
        Map<Integer, Map<Integer, List<SaholicPOItem>>> warehousePoItemAvailabilityMap = saholicInventoryService.getSaholicPOItems();
35442 amit 2694
 
2695
        // Batch fetch all customRetailers upfront
2696
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(allPartnerIds);
2697
        LOGGER.info("Fetched {} customRetailers", customRetailerMap.size());
2698
 
2699
        // Batch fetch all inventory snapshots upfront
2700
        Map<Integer, List<CurrentInventorySnapshot>> allInventorySnapshotsMap = currentInventorySnapshotRepository
2701
                .selectByFofoId(allPartnerIds).stream()
2702
                .collect(Collectors.groupingBy(CurrentInventorySnapshot::getFofoId));
2703
        LOGGER.info("Fetched inventory snapshots for {} partners", allInventorySnapshotsMap.size());
2704
 
2705
        // Batch fetch all pending GRN orders upfront
2706
        Map<Integer, List<Order>> allGrnPendingOrdersMap = orderRepository.selectPendingGrnOrders(allPartnerIds).stream()
2707
                .collect(Collectors.groupingBy(Order::getRetailerId));
2708
        LOGGER.info("Fetched GRN pending orders for {} partners", allGrnPendingOrdersMap.size());
2709
 
2710
        // Batch fetch all processing orders upfront
2711
        Map<Integer, List<Order>> allProcessingOrdersMap = orderRepository.selectOrders(allPartnerIds, orderStatusList).stream()
2712
                .collect(Collectors.groupingBy(Order::getRetailerId));
2713
        LOGGER.info("Fetched processing orders for {} partners", allProcessingOrdersMap.size());
2714
 
2715
        // Collect all focused catalog IDs
2716
        Set<Integer> allFocusedCatalogIds = regionFocusedModelsMap.values().stream()
2717
                .flatMap(List::stream)
2718
                .map(FocusedModel::getCatalogId)
2719
                .collect(Collectors.toSet());
2720
 
2721
        // Batch fetch all items by catalog IDs upfront
35446 amit 2722
        List<Item> allItemsByCatalogId = itemRepository.selectAllByCatalogIds(allFocusedCatalogIds);
2723
        Map<Integer, List<Item>> itemsByCatalogIdMap = allItemsByCatalogId.stream()
35442 amit 2724
                .collect(Collectors.groupingBy(Item::getCatalogItemId));
2725
        LOGGER.info("Fetched items for {} catalog IDs", itemsByCatalogIdMap.size());
2726
 
35446 amit 2727
        // Batch fetch all tagListings using pre-fetched items to avoid duplicate item fetch
35442 amit 2728
        Map<Integer, TagListing> tagListingByCatalogIdMap = tagListingRepository
35446 amit 2729
                .selectAllByItems(allItemsByCatalogId);
35442 amit 2730
        LOGGER.info("Fetched {} tagListings", tagListingByCatalogIdMap.size());
2731
 
2732
        // Collect all item IDs from inventory, GRN orders, and processing orders for batch item lookup
2733
        Set<Integer> allItemIds = new HashSet<>();
2734
        allInventorySnapshotsMap.values().forEach(list ->
2735
                list.forEach(cis -> allItemIds.add(cis.getItemId())));
2736
        allGrnPendingOrdersMap.values().forEach(orders ->
2737
                orders.forEach(o -> allItemIds.add(o.getLineItem().getItemId())));
2738
        allProcessingOrdersMap.values().forEach(orders ->
2739
                orders.forEach(o -> allItemIds.add(o.getLineItem().getItemId())));
2740
 
2741
        // Batch fetch all items and create itemId -> catalogId mapping
2742
        Map<Integer, Integer> itemIdToCatalogIdMap = new HashMap<>();
2743
        if (!allItemIds.isEmpty()) {
2744
            itemRepository.selectByIds(allItemIds).forEach(item ->
2745
                    itemIdToCatalogIdMap.put(item.getId(), item.getCatalogItemId()));
2746
        }
2747
        LOGGER.info("Built itemId->catalogId mapping for {} items", itemIdToCatalogIdMap.size());
2748
 
2749
        // ========== PHASE 2: Build partner region mappings ==========
34352 amit.gupta 2750
        Map<Integer, Set<Integer>> partnerToRegions = partnerRegionRepository.selectAll().stream()
2751
                .collect(Collectors.groupingBy(
2752
                        pr -> pr.getFofoId(),
2753
                        Collectors.mapping(pr -> pr.getRegionId(), Collectors.toSet())
2754
                ));
2755
        Map<Set<Integer>, List<Integer>> regionPartnerMap = partnerToRegions.entrySet().stream()
2756
                .collect(Collectors.groupingBy(
2757
                        Map.Entry::getValue,
2758
                        Collectors.mapping(Map.Entry::getKey, Collectors.toList())
2759
                ));
35442 amit 2760
        LOGGER.info("regionPartnerMap - {}", regionPartnerMap.keySet());
2761
 
2762
        // ========== PHASE 3: Process partners using pre-fetched data ==========
2763
        Map<Integer, List<FocusedModelShortageModel>> focusedModelShortageReportMap = new HashMap<>();
2764
 
34352 amit.gupta 2765
        for (Map.Entry<Set<Integer>, List<Integer>> regionPartnerEntry : regionPartnerMap.entrySet()) {
2766
            Set<Integer> regionIds = regionPartnerEntry.getKey();
35442 amit 2767
            List<Integer> partnerIds = new ArrayList<>(regionPartnerEntry.getValue());
2768
 
34502 amit.gupta 2769
            if (regionIds.stream().anyMatch(x -> !regionFocusedModelsMap.containsKey(x))) continue;
34383 amit.gupta 2770
 
35442 amit 2771
            LOGGER.info("Processing regionIds: {}", regionIds);
2772
            if (regionIds == null || regionIds.isEmpty()) {
34352 amit.gupta 2773
                LOGGER.info("No region found for partner {}", partnerIds);
34343 amit.gupta 2774
                continue;
2775
            }
34502 amit.gupta 2776
            if (regionIds.contains(5)) {
34383 amit.gupta 2777
                partnerIds.addAll(fofoStoreMap.keySet());
2778
            }
35442 amit 2779
 
2780
            Map<Integer, Optional<Integer>> focusedCatalogIdAndQtyMap = regionIds.stream()
2781
                    .map(regionFocusedModelsMap::get)
2782
                    .flatMap(x -> x != null ? x.stream() : Stream.empty())
2783
                    .collect(groupingBy(FocusedModel::getCatalogId,
2784
                            mapping(FocusedModel::getObsMinimumQty, Collectors.maxBy(Integer::compareTo))));
2785
 
2786
            if (focusedCatalogIdAndQtyMap.isEmpty()) continue;
2787
 
34352 amit.gupta 2788
            for (int partnerId : partnerIds) {
34502 amit.gupta 2789
                if (partnerId == 0) continue;
34352 amit.gupta 2790
                FofoStore fofoStore = fofoStoreMap.get(partnerId);
35442 amit 2791
                if (fofoStore == null) continue;
2792
 
2793
                CustomRetailer customRetailer = customRetailerMap.get(partnerId);
2794
                if (customRetailer == null) continue;
2795
 
34352 amit.gupta 2796
                List<FocusedModelShortageModel> focusedModelShortageList = new ArrayList<>();
2797
                focusedModelShortageReportMap.put(fofoStore.getId(), focusedModelShortageList);
34343 amit.gupta 2798
 
35442 amit 2799
                // Build catalogIdAndQtyMap from pre-fetched inventory snapshots
2800
                Map<Integer, Integer> catalogIdAndQtyMap = new HashMap<>();
2801
                List<CurrentInventorySnapshot> inventorySnapshots = allInventorySnapshotsMap.get(partnerId);
2802
                if (inventorySnapshots != null) {
2803
                    Map<Integer, Integer> itemQtyMap = inventorySnapshots.stream()
2804
                            .collect(Collectors.toMap(CurrentInventorySnapshot::getItemId, CurrentInventorySnapshot::getAvailability));
2805
                    for (Map.Entry<Integer, Integer> e : itemQtyMap.entrySet()) {
2806
                        Integer catalogId = itemIdToCatalogIdMap.get(e.getKey());
2807
                        if (catalogId != null) {
2808
                            catalogIdAndQtyMap.merge(catalogId, e.getValue(), Integer::sum);
2809
                        }
2810
                    }
34352 amit.gupta 2811
                }
25721 tejbeer 2812
 
35442 amit 2813
                // Build grnPendingOrdersMap from pre-fetched orders
2814
                Map<Integer, Integer> grnPendingOrdersMap = new HashMap<>();
2815
                List<Order> grnOrders = allGrnPendingOrdersMap.get(partnerId);
2816
                if (grnOrders != null) {
2817
                    for (Order order : grnOrders) {
2818
                        Integer catalogId = itemIdToCatalogIdMap.get(order.getLineItem().getItemId());
2819
                        if (catalogId != null) {
2820
                            grnPendingOrdersMap.merge(catalogId, order.getLineItem().getQuantity(), Integer::sum);
2821
                        }
2822
                    }
34352 amit.gupta 2823
                }
25800 tejbeer 2824
 
35442 amit 2825
                // Build processingOrderMap from pre-fetched orders
2826
                Map<Integer, Integer> processingOrderMap = new HashMap<>();
2827
                List<Order> processingOrders = allProcessingOrdersMap.get(partnerId);
2828
                if (processingOrders != null) {
2829
                    for (Order order : processingOrders) {
2830
                        Integer catalogId = itemIdToCatalogIdMap.get(order.getLineItem().getItemId());
2831
                        if (catalogId != null) {
2832
                            processingOrderMap.merge(catalogId, order.getLineItem().getQuantity(), Integer::sum);
2833
                        }
2834
                    }
34352 amit.gupta 2835
                }
25721 tejbeer 2836
 
35442 amit 2837
                Map<Integer, List<SaholicCIS>> itemAvailabilityMap = warehouseItemAvailabilityMap.get(fofoStore.getWarehouseId());
2838
                Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = warehousePoItemAvailabilityMap.get(fofoStore.getWarehouseId());
25721 tejbeer 2839
 
34352 amit.gupta 2840
                for (Entry<Integer, Optional<Integer>> entry : focusedCatalogIdAndQtyMap.entrySet()) {
35442 amit 2841
                    int catalogId = entry.getKey();
2842
                    int minQty = entry.getValue().orElse(0);
2843
                    int inStockQty = catalogIdAndQtyMap.getOrDefault(catalogId, 0);
2844
                    int processingQty = processingOrderMap.getOrDefault(catalogId, 0);
2845
                    int grnPendingQty = grnPendingOrdersMap.getOrDefault(catalogId, 0);
28526 tejbeer 2846
 
34352 amit.gupta 2847
                    int grnStockQty = grnPendingQty + inStockQty;
2848
                    int totalQty = processingQty + grnPendingQty + inStockQty;
2849
                    int shortageQty = minQty - totalQty;
27213 tejbeer 2850
 
35442 amit 2851
                    // Use pre-fetched items
2852
                    List<Item> items = itemsByCatalogIdMap.get(catalogId);
2853
                    if (items == null || items.isEmpty()) continue;
25721 tejbeer 2854
 
35442 amit 2855
                    // Use pre-fetched tagListing
2856
                    TagListing tagListing = tagListingByCatalogIdMap.get(catalogId);
2857
                    if (tagListing == null) continue;
27208 tejbeer 2858
 
35442 amit 2859
                    int allColorNetAvailability = 0;
2860
                    int allColorPoAvailability = 0;
28528 tejbeer 2861
 
34352 amit.gupta 2862
                    for (Item item : items) {
2863
                        if (itemAvailabilityMap != null) {
35442 amit 2864
                            List<SaholicCIS> currentAvailability = itemAvailabilityMap.get(item.getId());
2865
                            if (currentAvailability != null) {
2866
                                allColorNetAvailability += currentAvailability.stream()
2867
                                        .mapToInt(SaholicCIS::getNetavailability).sum();
2868
                            }
34352 amit.gupta 2869
                        }
2870
                        if (poItemAvailabilityMap != null) {
35442 amit 2871
                            List<SaholicPOItem> poItemAvailability = poItemAvailabilityMap.get(item.getId());
2872
                            if (poItemAvailability != null) {
2873
                                allColorPoAvailability += poItemAvailability.stream()
2874
                                        .mapToInt(SaholicPOItem::getUnfulfilledQty).sum();
2875
                            }
34352 amit.gupta 2876
                        }
31697 amit.gupta 2877
                    }
25721 tejbeer 2878
 
34352 amit.gupta 2879
                    FocusedModelShortageModel fm = new FocusedModelShortageModel();
2880
                    fm.setFofoId(fofoStore.getId());
2881
                    fm.setStoreCode(fofoStore.getCode());
2882
                    fm.setStoreName(customRetailer.getBusinessName());
2883
                    fm.setBrandName(items.get(0).getBrand());
2884
                    fm.setModelName(items.get(0).getModelName());
2885
                    fm.setModelNumber(items.get(0).getModelNumber());
2886
                    fm.setGrnStockQty(grnStockQty);
2887
                    fm.setPendingIndentQty(processingQty);
2888
                    fm.setShortageQty(shortageQty);
2889
                    fm.setPoAvailability(allColorPoAvailability);
2890
                    fm.setDp(tagListing.getSellingPrice());
2891
                    fm.setWarehouseName(warehouseMap.get(customRetailer.getWarehouseId()));
35442 amit 2892
 
2893
                    // FIX: Use fofoStore.getId() instead of fofoStore object as key
2894
                    FofoReportingModel reportingModel = partnerIdSalesHeadersMap.get(fofoStore.getId());
2895
                    if (reportingModel != null) {
2896
                        fm.setStateManager(reportingModel.getRegionalManager());
2897
                        fm.setTerritoryManager(reportingModel.getTerritoryManager());
34352 amit.gupta 2898
                    } else {
2899
                        fm.setStateManager("");
2900
                        fm.setTerritoryManager("");
31697 amit.gupta 2901
                    }
25800 tejbeer 2902
 
34352 amit.gupta 2903
                    fm.setItemName(items.get(0).getBrand() + items.get(0).getModelNumber() + items.get(0).getModelName());
2904
                    fm.setAvailability(allColorNetAvailability);
25800 tejbeer 2905
 
34352 amit.gupta 2906
                    focusedModelShortageList.add(fm);
31697 amit.gupta 2907
                }
2908
            }
34352 amit.gupta 2909
        }
25721 tejbeer 2910
 
35442 amit 2911
        // ========== PHASE 4: Send emails ==========
2912
        LOGGER.info("focusedModelShortageReportMap size: {}", focusedModelShortageReportMap.size());
31697 amit.gupta 2913
        if (!focusedModelShortageReportMap.isEmpty()) {
2914
            String fileName = "Stock Alert-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
2915
            Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
2916
            Map<String, List<List<?>>> emailRowsMap = new HashMap<>();
28526 tejbeer 2917
 
35442 amit 2918
            for (Map.Entry<Integer, List<FocusedModelShortageModel>> x : focusedModelShortageReportMap.entrySet()) {
2919
                for (Map.Entry<String, Set<Integer>> y : storeGuyMap.entrySet()) {
2920
                    if (y.getValue().contains(x.getKey())) {
2921
                        emailRowsMap.computeIfAbsent(y.getKey(), k -> new ArrayList<>());
2922
                        List<List<? extends Serializable>> fms = x.getValue().stream()
2923
                                .map(r -> Arrays.asList(r.getStoreCode(), r.getStoreName(), r.getBrandName(),
2924
                                        r.getModelName(), r.getModelNumber(), r.getDp(), r.getWarehouseName(),
2925
                                        r.getStateManager(), r.getTerritoryManager(), r.getPendingIndentQty(),
2926
                                        r.getGrnStockQty(), r.getShortageQty(), r.getAvailability()))
2927
                                .collect(Collectors.toList());
2928
                        emailRowsMap.get(y.getKey()).addAll(fms);
2929
                    }
31697 amit.gupta 2930
                }
35442 amit 2931
            }
25721 tejbeer 2932
 
35442 amit 2933
            List<String> headers = Arrays.asList("Store Code", "Store Name", "Brand", "Model Name", "Model Number",
2934
                    "DP", "Warehouse Name", "State Manager", "Territory Manager", "Pending Indent", "InStock",
2935
                    "Shortage Qty", "Availability");
25721 tejbeer 2936
 
35442 amit 2937
            for (Map.Entry<String, List<List<?>>> entry : emailRowsMap.entrySet()) {
31697 amit.gupta 2938
                try {
35442 amit 2939
                    ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, entry.getValue());
2940
                    String[] sendToArray = new String[]{entry.getKey()};
2941
                    Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Stock Alert", "PFA",
2942
                            fileName, new ByteArrayResource(baos.toByteArray()));
2943
                } catch (Exception e) {
2944
                    LOGGER.error("Failed to send email to {}", entry.getKey(), e);
31697 amit.gupta 2945
                }
35442 amit 2946
            }
31697 amit.gupta 2947
        }
2948
    }
25721 tejbeer 2949
 
31697 amit.gupta 2950
    private String getNotificationMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2951
        StringBuilder sb = new StringBuilder();
2952
        sb.append("Focused Model Shortage in Your Stock : \n");
2953
        for (FocusedModelShortageModel entry : focusedModelShortageModel) {
25721 tejbeer 2954
 
31697 amit.gupta 2955
            sb.append(entry.getItemName() + "-" + entry.getShortageQty());
2956
            sb.append(String.format("%n", ""));
2957
        }
2958
        return sb.toString();
2959
    }
25721 tejbeer 2960
 
31697 amit.gupta 2961
    private void sendMailWithAttachments(String subject, String messageText, String email) throws Exception {
2962
        MimeMessage message = mailSender.createMimeMessage();
2963
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
25721 tejbeer 2964
 
31697 amit.gupta 2965
        helper.setSubject(subject);
2966
        helper.setText(messageText, true);
2967
        helper.setTo(email);
2968
        InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
2969
        helper.setFrom(senderAddress);
2970
        mailSender.send(message);
25721 tejbeer 2971
 
31697 amit.gupta 2972
    }
25721 tejbeer 2973
 
31697 amit.gupta 2974
    private String getMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2975
        StringBuilder sb = new StringBuilder();
31886 tejbeer 2976
        sb.append("<html><body><p>Alert</p><p>Focused Model Shortage in Your Stock:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
2977
        sb.append("<tbody>\n" + "	    				<tr>\n" + "	    					<th style='border:1px solid black;padding: 5px'>Item</th>\n" + "	    					<th style='border:1px solid black;padding: 5px'>Shortage Qty</th>\n" + "	    				</tr>");
31697 amit.gupta 2978
        for (FocusedModelShortageModel entry : focusedModelShortageModel) {
25721 tejbeer 2979
 
31697 amit.gupta 2980
            sb.append("<tr>");
2981
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getItemName() + "</td>");
25936 amit.gupta 2982
 
31697 amit.gupta 2983
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getShortageQty() + "</td>");
26790 tejbeer 2984
 
31697 amit.gupta 2985
            sb.append("</tr>");
25927 amit.gupta 2986
 
31697 amit.gupta 2987
        }
26790 tejbeer 2988
 
31697 amit.gupta 2989
        sb.append("</tbody></table></body></html>");
26945 amit.gupta 2990
 
31697 amit.gupta 2991
        return sb.toString();
2992
    }
26945 amit.gupta 2993
 
31697 amit.gupta 2994
    public void notifyLead() throws Exception {
31886 tejbeer 2995
        List<Lead> leadsToNotify = leadRepository.selectLeadsScheduledBetweenDate(null, LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
2996
        Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
31697 amit.gupta 2997
        LOGGER.info("authUserEmailMap {}", authUserEmailMap);
31886 tejbeer 2998
        Map<String, Integer> dtrEmailMap = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
25982 amit.gupta 2999
 
31697 amit.gupta 3000
        LOGGER.info("dtrEmailMap {}", dtrEmailMap);
26283 tejbeer 3001
 
31697 amit.gupta 3002
        Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26283 tejbeer 3003
 
33452 amit.gupta 3004
        for (Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
31697 amit.gupta 3005
            int authId = authUserEmail.getKey();
3006
            String email = authUserEmail.getValue();
3007
            authUserKeyMap.put(authId, dtrEmailMap.get(email));
3008
        }
3009
        LOGGER.info("authUserKeyMap", authUserKeyMap);
3010
        LOGGER.info("leadsToNotify {}", leadsToNotify);
26283 tejbeer 3011
 
31697 amit.gupta 3012
        String templateMessage = "Lead followup for %s %s, %s, %s is due by %s";
3013
        for (Lead lead : leadsToNotify) {
3014
            if (authUserKeyMap.get(lead.getAssignTo()) == null) {
3015
                LOGGER.info("Assignee no longer part of system {}", lead.getAssignTo());
3016
                continue;
3017
            }
3018
            String title = "Leads followup Reminder";
31886 tejbeer 3019
            String notificationMessage = String.format(templateMessage, lead.getFirstName(), lead.getLastName(), lead.getAddress(), lead.getLeadMobile(), leadTimeFormatter.format(lead.getScheduledTimestamp()));
31697 amit.gupta 3020
            String url = "https://app.smartdukaan.com/pages/home/leadUpdate?leadId=" + lead.getId();
3021
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
3022
            sendNotificationModel.setCampaignName("Lead Reminder");
3023
            sendNotificationModel.setTitle(title);
3024
            sendNotificationModel.setMessage(notificationMessage);
3025
            sendNotificationModel.setType("url");
3026
            sendNotificationModel.setUrl(url);
3027
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
3028
            sendNotificationModel.setMessageType(MessageType.reminder);
3029
            sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(lead.getAssignTo())));
3030
            System.out.println(sendNotificationModel);
3031
            notificationService.sendNotification(sendNotificationModel);
3032
        }
3033
    }
26790 tejbeer 3034
 
32350 amit.gupta 3035
    @Autowired
3036
    AuthService authService;
3037
 
3038
    public void sendUnscheduledFollowUpMail() throws Exception {
3039
        List<Lead> missedScheduleLeads = leadRepository.selectLeadsScheduledBetweenDate(null, LocalDate.now().atStartOfDay().minusDays(30), LocalDateTime.now().toLocalDate().atStartOfDay());
3040
        List<Lead> leadsScheduledForToday = leadRepository.selectLeadsScheduledBetweenDate(null, LocalDate.now().atStartOfDay(), LocalDate.now().atTime(LocalTime.MAX));
3041
        List<Integer> authIds = missedScheduleLeads.stream().map(x -> x.getAssignTo()).distinct().collect(Collectors.toList());
3042
        LOGGER.info(authIds.size());
35393 amit 3043
        Map<Integer, AuthUser> authUserMap = authRepository.selectByIds(authIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
32350 amit.gupta 3044
        LOGGER.info(authUserMap.size());
3045
        //if(true) return;
3046
 
3047
        missedScheduleLeads = missedScheduleLeads.stream().sorted(Comparator.comparing(Lead::getState, String.CASE_INSENSITIVE_ORDER).thenComparing(Lead::getAssignTo).thenComparing(Lead::getScheduledTimestamp)).collect(Collectors.toList());
3048
        //leadsScheduledForToday
3049
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
3050
        LOGGER.info("Auth Users Size - {}", authUsers.size());
3051
        for (AuthUser authUser : authUsers) {
3052
            LOGGER.info("Auth Name - {}", authUser.getFullName());
3053
            List<Integer> reporteeAuthIds = authService.getAllReportees(authUser.getId());
3054
            reporteeAuthIds.add(authUser.getId());
3055
            StringBuilder sb = new StringBuilder();
3056
            sb.append("<html><body>");
3057
            List<Lead> authMissedScheduledLeads = missedScheduleLeads.stream().filter(x -> reporteeAuthIds.contains(x.getAssignTo())).collect(Collectors.toList());
3058
            LOGGER.info("authMissedScheduledLeads {}", authMissedScheduledLeads.size());
3059
            if (authMissedScheduledLeads.size() > 0) {
3060
                addMissedScheduledLeadsTable(sb, authMissedScheduledLeads, authUserMap);
3061
                sb.append("</body></html>");
3062
 
3063
                String subject = "Lead Updates Summary";
32421 amit.gupta 3064
                String[] email = Arrays.asList(authUser.getEmailId()).toArray(new String[1]);
3065
                //String[] email = Arrays.asList("amit.gupta@smartdukaan.com").toArray(new String[1]);
32350 amit.gupta 3066
                this.sendMailOfHtmlFormat(googleMailSender, email, sb.toString(), null, subject);
32421 amit.gupta 3067
                //break;
32350 amit.gupta 3068
            }
3069
        }
3070
 
3071
    }
3072
 
32482 amit.gupta 3073
    private void addMissedScheduledLeadsTable(StringBuilder
3074
                                                      sb, List<Lead> missedScheduleLeads, Map<Integer, AuthUser> authUserMap) {
32350 amit.gupta 3075
        sb.append("<h3>Leads That Missed the schedule</h3>");
32439 tejbeer 3076
        sb.append("<table style='border:1px solid black' cellspacing='0'>").append("<tr>").append("<th style='border:1px solid black;padding: 5px'>").append("Lead Id").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("Lead Name").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("Mobile No").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("City").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("State").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("Created On").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("Assigned To").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("Scheduled On").append("</th>").append("</tr>");
32350 amit.gupta 3077
        for (Lead lead : missedScheduleLeads) {
32439 tejbeer 3078
            sb.append("<tr style='background-color:").append(lead.getColor()).append("'>").append("<td style='border:1px solid black;padding: 5px'>").append(lead.getId()).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(lead.getFullName()).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(lead.getLeadMobile()).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(lead.getCity()).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(lead.getState()).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(FormattingUtils.formatDate(lead.getCreatedTimestamp())).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(
3079
                    authUserMap.containsKey(lead.getAssignTo()) ? authUserMap.get(lead.getAssignTo()).getFullName() : lead.getAssignTo()).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(FormattingUtils.formatDate(lead.getScheduledTimestamp())).append("</td>").append("</tr>");
32350 amit.gupta 3080
        }
3081
        sb.append("</table>");
3082
    }
3083
 
31697 amit.gupta 3084
    public void notifyVisits() throws Exception {
31886 tejbeer 3085
        List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository.selectVisitsScheduledBetweenDate(LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
3086
        Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
3087
        Map<String, Integer> dtrEmailMap = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
31697 amit.gupta 3088
        Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26790 tejbeer 3089
 
33452 amit.gupta 3090
        for (Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
31697 amit.gupta 3091
            int authId = authUserEmail.getKey();
3092
            String email = authUserEmail.getValue();
3093
            authUserKeyMap.put(authId, dtrEmailMap.get(email));
3094
        }
3095
        String visitTemplate = "Planned visit to franchisee %s is due by %s";
3096
        String followupTemplate = "Lead followup for franchisee %s is due by %s";
3097
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("MMM 7, EEEE h:m a");
3098
        for (FranchiseeVisit visit : franchiseeVisits) {
3099
            if (authUserKeyMap.containsKey(visit.getAuthId())) {
3100
                continue;
3101
            }
3102
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
3103
            String message = null;
3104
            if (visit.getFranchiseActivityId() == 0) {
31886 tejbeer 3105
                message = String.format(visitTemplate, visit.getPartnerName(), timeFormatter.format(visit.getScheduleTimestamp()));
31697 amit.gupta 3106
                sendNotificationModel.setCampaignName("Franchisee visit Reminder");
3107
            } else {
31886 tejbeer 3108
                message = String.format(followupTemplate, visit.getPartnerName(), timeFormatter.format(visit.getScheduleTimestamp()));
31697 amit.gupta 3109
                sendNotificationModel.setCampaignName("Franchisee followup Reminder");
3110
            }
3111
            sendNotificationModel.setMessage(message);
3112
            sendNotificationModel.setType("url");
3113
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
3114
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
3115
            sendNotificationModel.setMessageType(MessageType.reminder);
3116
            sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(visit.getAuthId())));
3117
            // notificationService.sendNotification(sendNotificationModel);
3118
        }
3119
    }
26792 tejbeer 3120
 
31697 amit.gupta 3121
    public void ticketClosed() throws Exception {
26790 tejbeer 3122
 
31697 amit.gupta 3123
        List<Ticket> tickets = ticketRepository.selectAllNotClosedTicketsWithStatus(ActivityType.RESOLVED);
3124
        for (Ticket ticket : tickets) {
3125
            if (ticket.getUpdateTimestamp().toLocalDate().isBefore(LocalDate.now().minusDays(7))) {
3126
                ticket.setCloseTimestamp(LocalDateTime.now());
3127
                ticket.setLastActivity(ActivityType.RESOLVED_ACCEPTED);
3128
                ticket.setUpdateTimestamp(LocalDateTime.now());
3129
                ticketRepository.persist(ticket);
3130
            }
3131
        }
26790 tejbeer 3132
 
31697 amit.gupta 3133
    }
26790 tejbeer 3134
 
31697 amit.gupta 3135
    public void checkValidateReferral() throws Exception {
26790 tejbeer 3136
 
31697 amit.gupta 3137
        List<Refferal> referrals = refferalRepository.selectByStatus(RefferalStatus.pending);
3138
        LOGGER.info("referrals" + referrals);
3139
        if (!referrals.isEmpty()) {
3140
            String subject = "Referral Request";
3141
            String messageText = this.getMessageForReferral(referrals);
26790 tejbeer 3142
 
31697 amit.gupta 3143
            MimeMessage message = mailSender.createMimeMessage();
3144
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
3145
            String[] email = {"kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com"};
3146
            helper.setSubject(subject);
3147
            helper.setText(messageText, true);
3148
            helper.setTo(email);
3149
            InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
3150
            helper.setFrom(senderAddress);
3151
            mailSender.send(message);
26790 tejbeer 3152
 
31697 amit.gupta 3153
        }
3154
    }
26790 tejbeer 3155
 
31697 amit.gupta 3156
    private String getMessageForReferral(List<Refferal> referrals) {
3157
        StringBuilder sb = new StringBuilder();
31886 tejbeer 3158
        sb.append("<html><body><p>Alert</p><p>Pending Referrals:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
3159
        sb.append("<tbody>\n" + "	    				<tr>\n" + "	    					<th style='border:1px solid black;padding: 5px'>RefereeName</th>\n" + "	    					<th style='border:1px solid black;padding: 5px'>Referee Email</th>\n" + "	    					<th style='border:1px solid black;padding: 5px'>Referral Name</th>\n" + "	    					<th style='border:1px solid black;padding: 5px'>Refferal Mobile</th>\n" + "	    					<th style='border:1px solid black;padding: 5px'>city</th>\n" + "	    					<th style='border:1px solid black;padding: 5px'>state</th>\n" + "	    				</tr>");
31697 amit.gupta 3160
        for (Refferal entry : referrals) {
26790 tejbeer 3161
 
31697 amit.gupta 3162
            sb.append("<tr>");
3163
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeName() + "</td>");
30421 tejbeer 3164
 
31697 amit.gupta 3165
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeEmail() + "</td>");
3166
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getFirstName() + "</td>");
3167
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMobile() + "</td>");
3168
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCity() + "</td>");
3169
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getState() + "</td>");
30421 tejbeer 3170
 
31697 amit.gupta 3171
            sb.append("</tr>");
30421 tejbeer 3172
 
31697 amit.gupta 3173
        }
30421 tejbeer 3174
 
31697 amit.gupta 3175
        sb.append("</tbody></table></body></html>");
30421 tejbeer 3176
 
31697 amit.gupta 3177
        return sb.toString();
3178
    }
30421 tejbeer 3179
 
32832 amit.gupta 3180
    private String getMessageForRBMEscalatedPartners(List<PartnerCollectionRemark> pcrs) throws
32482 amit.gupta 3181
            ProfitMandiBusinessException {
31697 amit.gupta 3182
        StringBuilder sb = new StringBuilder();
32832 amit.gupta 3183
        sb.append("<html><body><p>Alert</p><p>Escalated by RBM-L1:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
3184
        sb.append("<tbody>" +
3185
                "<tr>" +
3186
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>" +
3187
                "<th style='border:1px solid black;padding: 5px'>Escalated Since</th>" +
3188
                "<th style='border:1px solid black;padding: 5px'>Message</th>" +
3189
                "</tr>");
30421 tejbeer 3190
 
31697 amit.gupta 3191
        for (PartnerCollectionRemark entry : pcrs) {
30421 tejbeer 3192
 
31697 amit.gupta 3193
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
30421 tejbeer 3194
 
31697 amit.gupta 3195
            sb.append("<tr>");
31886 tejbeer 3196
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
3197
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
32832 amit.gupta 3198
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMessage() + "</td>");
28205 tejbeer 3199
 
31697 amit.gupta 3200
            sb.append("</tr>");
28205 tejbeer 3201
 
31697 amit.gupta 3202
        }
28205 tejbeer 3203
 
31697 amit.gupta 3204
        sb.append("</tbody></table></body></html>");
28205 tejbeer 3205
 
31697 amit.gupta 3206
        return sb.toString();
3207
    }
28208 tejbeer 3208
 
32795 amit.gupta 3209
    private String getMessageForSalesEscalatedPartners(List<PartnerCollectionRemark> pcrs) throws
3210
            ProfitMandiBusinessException {
3211
        StringBuilder sb = new StringBuilder();
3212
        sb.append("<html><body><p>Alert</p><p>Escalated to Sales Team:-</p>" + "<br/>" +
3213
                "<table style='border:1px solid black ;padding: 5px';>");
3214
        sb.append("<tbody>" +
3215
                "<tr>" +
3216
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>" +
3217
                "<th style='border:1px solid black;padding: 5px'>Escalated Since</th>" +
3218
                "<th style='border:1px solid black;padding: 5px'>Message</th>" +
3219
                "</tr>");
3220
        for (PartnerCollectionRemark entry : pcrs) {
3221
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
3222
            sb.append("<tr>");
3223
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
3224
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
3225
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMessage() + "</td>");
3226
            sb.append("</tr>");
3227
        }
3228
 
3229
        sb.append("</tbody></table></body></html>");
3230
 
3231
        return sb.toString();
3232
    }
3233
 
33078 ranu 3234
    private String getMessageForUnauthorizedBuying(List<NonSdBuying> nsb) throws
3235
            ProfitMandiBusinessException {
3236
        StringBuilder sb = new StringBuilder();
3237
        sb.append("<html><body><p>Alert</p><p>Unauthorized Buying-</p>" + "<br/>" +
3238
                "<table style='border:1px solid black ;padding: 5px';>");
3239
        sb.append("<tbody>" +
3240
                "<tr>" +
3241
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>" +
3242
                "<th style='border:1px solid black;padding: 5px'>Brand Name</th>" +
3243
                "<th style='border:1px solid black;padding: 5px'>Brand Value</th>" +
3244
                "<th style='border:1px solid black;padding: 5px'>Created At</th>" +
3245
                "<th style='border:1px solid black;padding: 5px'>Reason</th>" +
3246
                "</tr>");
3247
        for (NonSdBuying entry : nsb) {
3248
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
3249
            List<Integer> brandIds = Collections.singletonList(entry.getBrandId());
3250
            BrandCatalog brandsDisplay = brandsRepository.selectByIds(brandIds).get(0);
3251
            sb.append("<tr>");
3252
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
3253
            sb.append("<td style='border:1px solid black;padding: 5px'>" + brandsDisplay.getName() + "</td>");
3254
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getBrandValue() + "</td>");
3255
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
3256
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getReason() + "</td>");
3257
            sb.append("</tr>");
3258
        }
3259
 
3260
        sb.append("</tbody></table></body></html>");
3261
 
3262
        return sb.toString();
3263
    }
3264
 
31697 amit.gupta 3265
    public void reverseWallet() throws Exception {
3266
        LocalDate localDate = LocalDate.of(2020, 10, 28);
31886 tejbeer 3267
        List<UserWalletHistory> uwhList = userWalletHistoryRepository.selectAllByDateType(localDate.atStartOfDay(), localDate.plusDays(1).atStartOfDay(), Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
31697 amit.gupta 3268
        for (UserWalletHistory uwh : uwhList) {
3269
            if (uwh.getBusinessTimestamp().getMonth().equals(Month.SEPTEMBER)) {
3270
                UserWallet uw = userWalletRepository.selectById(uwh.getWalletId());
3271
                // LOGGER.info("UWH - {}", uwh);
3272
                // amount += uwh.getAmount();
3273
                // System.out.println("Amount is - " + amount);
3274
                // walletService.rollbackAmountFromWallet(uw.getUserId(), uwh.getAmount(),
3275
                // uwh.getReference(), uwh.getReferenceType(), "Margin reversal for error prone
3276
                // run", uwh.getBusinessTimestamp());
3277
                int orderId = uwh.getReference();
3278
                FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
3279
                int inventoryItemId = 0;
3280
                // fofoOrderRepository.delete(fofoOrder);
3281
                List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
3282
                /*
3283
                 * List<PaymentOptionTransaction> paymentOptionTransactions =
3284
                 * paymentOptionTransactionRepository.selectByReferenceIdAndType(fofoOrder.getId
3285
                 * (), PaymentOptionReferenceType.ORDER); for(PaymentOptionTransaction
3286
                 * paymentOptionTransaction : paymentOptionTransactions) {
3287
                 * //paymentOptionTransactionRepository.delete(paymentOptionTransaction); }
3288
                 */
3289
                for (FofoOrderItem foi : fofoOrderItems) {
3290
                    // fofoOrderItemRepository.delete(foi);
3291
                    List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(foi.getId());
3292
                    for (FofoLineItem fli : flis) {
3293
                        // fofoLineItemRepository.delete(fli);
3294
                        inventoryItemId = fli.getInventoryItemId();
3295
                    }
3296
                }
3297
                List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(
33452 amit.gupta 3298
                        Stream.of(inventoryItemId).collect(Collectors.toSet()));
31697 amit.gupta 3299
                for (SchemeInOut sio : schemeInOuts) {
3300
                    if (sio.getCreateTimestamp().toLocalDate().equals(localDate)) {
3301
                        LOGGER.info("SIO - {}", sio);
3302
                        sio.setRolledBackTimestamp(LocalDateTime.now());
3303
                    }
3304
                }
28208 tejbeer 3305
 
31697 amit.gupta 3306
            }
3307
        }
28208 tejbeer 3308
 
31697 amit.gupta 3309
    }
28208 tejbeer 3310
 
31697 amit.gupta 3311
    public void partnerProblemAlert() throws Exception {
3312
        LocalDateTime curDate = LocalDate.now().atStartOfDay();
3313
        Map<Integer, Double> lmtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
3314
                curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1), 0, false);
31886 tejbeer 3315
        Map<Integer, Double> mtdSales = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX), 0, false);
3316
        Map<Integer, PartnerDailyInvestment> pdi = partnerDailyInvestmentRepository.selectAll(LocalDate.now()).stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
28205 tejbeer 3317
 
31697 amit.gupta 3318
        for (Entry<Integer, Double> ls : lmtdSale.entrySet()) {
28208 tejbeer 3319
 
31697 amit.gupta 3320
            double lmtdTwentyPercentSale = ls.getValue() * 0.2;
28208 tejbeer 3321
 
31697 amit.gupta 3322
            LOGGER.info("lmtdTwentyPercentSale" + lmtdTwentyPercentSale);
28208 tejbeer 3323
 
31697 amit.gupta 3324
            double mtdSale = mtdSales.get(ls.getKey()) == null ? 0 : mtdSales.get(ls.getKey());
28205 tejbeer 3325
 
31697 amit.gupta 3326
            LOGGER.info("mtdSale" + mtdSale);
28205 tejbeer 3327
 
31886 tejbeer 3328
            double totalSixtyPercentInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getTotalInvestment() * 0.6;
28205 tejbeer 3329
 
31697 amit.gupta 3330
            LOGGER.info("totalSixtyPercentInvestment" + totalSixtyPercentInvestment);
28205 tejbeer 3331
 
31697 amit.gupta 3332
            double stockInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getInStockAmount();
28205 tejbeer 3333
 
31697 amit.gupta 3334
            LOGGER.info("stockInvestment" + stockInvestment);
28205 tejbeer 3335
 
31697 amit.gupta 3336
            boolean Investmentvalue = partnerInvestmentService.isInvestmentBelow(ls.getKey(), 25);
28205 tejbeer 3337
 
31697 amit.gupta 3338
            PartnerProblem partnerProblem = partnerProblemRepository.selectByFofoId(ls.getKey());
28205 tejbeer 3339
 
31697 amit.gupta 3340
            if (partnerProblem == null) {
3341
                partnerProblem = new PartnerProblem();
3342
                partnerProblem.setFofoId(ls.getKey());
3343
                if (mtdSale < lmtdTwentyPercentSale) {
3344
                    partnerProblem.setMtd(1);
3345
                }
3346
                if (Investmentvalue) {
3347
                    partnerProblem.setInvestment(1);
3348
                }
28205 tejbeer 3349
 
31697 amit.gupta 3350
                if (stockInvestment < totalSixtyPercentInvestment) {
3351
                    partnerProblem.setInvestment(1);
3352
                }
28205 tejbeer 3353
 
31697 amit.gupta 3354
                partnerProblemRepository.persist(partnerProblem);
3355
            } else {
3356
                if (mtdSale < lmtdTwentyPercentSale) {
3357
                    partnerProblem.setMtd(partnerProblem.getMtd() + 1);
28213 tejbeer 3358
 
31697 amit.gupta 3359
                } else {
3360
                    partnerProblem.setMtd(0);
28227 tejbeer 3361
 
31697 amit.gupta 3362
                }
3363
                if (Investmentvalue) {
3364
                    partnerProblem.setInvestment(partnerProblem.getInvestment() + 1);
3365
                } else {
3366
                    partnerProblem.setInvestment(0);
28227 tejbeer 3367
 
31697 amit.gupta 3368
                }
3369
                if (stockInvestment < totalSixtyPercentInvestment) {
3370
                    partnerProblem.setStockInvestment(partnerProblem.getStockInvestment() + 1);
3371
                } else {
3372
                    partnerProblem.setStockInvestment(0);
3373
                }
28213 tejbeer 3374
 
31697 amit.gupta 3375
            }
28213 tejbeer 3376
 
31697 amit.gupta 3377
        }
28213 tejbeer 3378
 
31886 tejbeer 3379
        List<PartnerProblem> partnerProblems = partnerProblemRepository.selectAll().stream().filter(x -> x.getMtd() + x.getInvestment() + x.getStockInvestment() > 0).collect(Collectors.toList());
28205 tejbeer 3380
 
31697 amit.gupta 3381
        partnerProblems = partnerProblems.stream().sorted((x1, x2) -> {
31886 tejbeer 3382
            return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment() + x2.getStockInvestment() ? 1 : -1;
31697 amit.gupta 3383
        }).collect(Collectors.toList());
28205 tejbeer 3384
 
31697 amit.gupta 3385
        Map<Integer, PartnerProblem> partnerProblemMap = partnerProblems.stream().sorted((x1, x2) -> {
31886 tejbeer 3386
            return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment() + x2.getStockInvestment() ? 1 : -1;
31697 amit.gupta 3387
        }).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
28205 tejbeer 3388
 
31697 amit.gupta 3389
        Map<Integer, CustomRetailer> customRetailers = retailerService.getAllFofoRetailers();
28205 tejbeer 3390
 
31697 amit.gupta 3391
        List<Integer> assignTo = Arrays.asList(15, 9, 54, 53);
28205 tejbeer 3392
 
35393 amit 3393
        Map<Integer, AuthUser> assignAuthUserMap = authRepository.selectByIds(assignTo).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
28222 tejbeer 3394
 
31886 tejbeer 3395
        List<String> sendTo = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com", "sm@smartdukaan.com");
31697 amit.gupta 3396
        LOGGER.info("partnerProblem" + partnerProblems);
3397
        StringBuilder sb = new StringBuilder();
3398
        sb.append("<htl><body>");
3399
        sb.append(
3400
                "<p>Number against MTD or Investment are the count of days the MTD is low VS LMTD OR Investment is below 75%.</p><br/><p>These partners needs immediate attention.</p><br/><table style='border:1px solid black';cellspacing=0>");
31886 tejbeer 3401
        sb.append("<tbody>\n" + "	    <tr>" + "	    					<th style='border:1px solid black;padding: 5px'>Partner Name</th>" + "                         <th style='border:1px solid black;padding: 5px'>Assign TO</th>" + "	    					<th style='border:1px solid black;padding: 5px'>Mtd</th>" + "	    					<th style='border:1px solid black;padding: 5px'>Investment</th>" + "	    					<th style='border:1px solid black;padding: 5px'>Stock</th>" + "	    					<th style='border:1px solid black;padding: 5px'>Manager</th>"
28218 tejbeer 3402
 
31697 amit.gupta 3403
                + "	    				</tr>");
28218 tejbeer 3404
 
31697 amit.gupta 3405
        for (PartnerProblem pp : partnerProblems) {
3406
            int value = pp.getFofoId() % 4;
28218 tejbeer 3407
 
31697 amit.gupta 3408
            Map<EscalationType, AuthUser> authUserMap = csService.getAuthUserAndEsclationByPartnerId(pp.getFofoId());
3409
            LOGGER.info("authUserMap" + authUserMap);
3410
            sb.append("<tr>");
31886 tejbeer 3411
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
3412
            sb.append("<td style='border:1px solid black;padding: 5px'>" + assignAuthUserMap.get(assignTo.get(value)).getName() + "</td>");
31697 amit.gupta 3413
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
3414
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
3415
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
31886 tejbeer 3416
            sb.append("<td style='border:1px solid black;padding: 5px'>" + (authUserMap.get(EscalationType.L1) == null ? "N/A" : authUserMap.get(EscalationType.L1).getFirstName()) + " ," + (authUserMap.get(EscalationType.L2) == null ? "N/A" : authUserMap.get(EscalationType.L2).getFirstName()) + "</td>");
28218 tejbeer 3417
 
31697 amit.gupta 3418
            sb.append("</tr>");
3419
        }
3420
        sb.append("</tbody></table><br><br>");
3421
        String subject = "Partner Problem Alert!";
3422
        String[] email = sendTo.toArray(new String[sendTo.size()]);
28227 tejbeer 3423
 
32350 amit.gupta 3424
        this.sendMailOfHtmlFormat(googleMailSender, email, sb.toString(), null, subject);
28227 tejbeer 3425
 
31697 amit.gupta 3426
        Map<Integer, List<Integer>> authUserPartnerMapping = csService.getAuthUserIdPartnerIdMapping();
28224 tejbeer 3427
 
31697 amit.gupta 3428
        for (Entry<Integer, List<Integer>> authUserPartner : authUserPartnerMapping.entrySet()) {
3429
            AuthUser authUser = authRepository.selectById(authUserPartner.getKey());
3430
            for (Integer patnerId : authUserPartner.getValue()) {
3431
                if (partnerProblemMap.get(patnerId) != null) {
28230 tejbeer 3432
 
31697 amit.gupta 3433
                    StringBuilder sbbuilder = new StringBuilder();
3434
                    sbbuilder.append("<hml><body>");
3435
                    sb.append(
3436
                            "<p>Number against MTD or Investment are the count of days the MTD is low VS LMTD OR Investment is below 75%.</p><br/><p>These partners needs immediate attention.</p><br/><table style='border:1px solid black';cellspacing=0>");
31886 tejbeer 3437
                    sbbuilder.append("<tbody>\n" + "	    <tr>" + "	    					<th style='border:1px solid black;padding: 5px'>Partner Name</th>" + "	    					<th style='border:1px solid black;padding: 5px'>Mtd</th>" + "	    					<th style='border:1px solid black;padding: 5px'>Investment</th>" + "	    					<th style='border:1px solid black;padding: 5px'>Stock</th>"
28218 tejbeer 3438
 
31697 amit.gupta 3439
                            + "	    				</tr>");
28205 tejbeer 3440
 
31697 amit.gupta 3441
                    for (Integer partnerId : authUserPartner.getValue()) {
3442
                        if (partnerProblemMap.get(partnerId) != null) {
3443
                            PartnerProblem pp = partnerProblemMap.get(partnerId);
3444
                            sbbuilder.append("<tr>");
31886 tejbeer 3445
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
3446
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
31697 amit.gupta 3447
                            sbbuilder.append(
3448
                                    "<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
31886 tejbeer 3449
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
28790 amit.gupta 3450
 
31697 amit.gupta 3451
                            sbbuilder.append("</tr>");
3452
                        }
28790 amit.gupta 3453
 
31697 amit.gupta 3454
                    }
3455
                    sbbuilder.append("</tbody></table><br><br>");
29488 manish 3456
 
32350 amit.gupta 3457
                    this.sendMailOfHtmlFormat(googleMailSender, new String[]{authUser.getEmailId()}, sbbuilder.toString(), null, subject);
31697 amit.gupta 3458
                }
29488 manish 3459
 
31697 amit.gupta 3460
            }
3461
        }
3462
    }
28775 amit.gupta 3463
 
31697 amit.gupta 3464
    @Autowired
3465
    WarehouseRepository warehouseRepository;
29488 manish 3466
 
33256 amit.gupta 3467
    public void getVendorWarehouses(int warehouseId) throws ProfitMandiBusinessException {
31697 amit.gupta 3468
        LOGGER.info("Warehouses - {}", warehouseRepository.getVendorWarehouses().get(warehouseId));
29488 manish 3469
 
31697 amit.gupta 3470
    }
29488 manish 3471
 
31697 amit.gupta 3472
    public void checkImeiActivation() {
29801 manish 3473
 
31697 amit.gupta 3474
        try {
3475
            vivoImeiActivationService.checkImeiActivation();
3476
        } catch (ProfitMandiBusinessException e) {
3477
            // TODO Auto-generated catch block
3478
            e.printStackTrace();
3479
        } catch (IOException e) {
3480
            // TODO Auto-generated catch block
3481
            e.printStackTrace();
3482
        } catch (Exception e) {
3483
            // TODO Auto-generated catch block
3484
            e.printStackTrace();
3485
        }
29807 manish 3486
 
31697 amit.gupta 3487
    }
29801 manish 3488
 
31697 amit.gupta 3489
    public void checkItelImeiActivation(LocalDate date, Integer day) {
3490
        LOGGER.info("Hello - {}", "hhh");
29488 manish 3491
 
31697 amit.gupta 3492
        try {
3493
            itelImeiActivationService.checkItelImeiActivation(date, day);
3494
        } catch (ProfitMandiBusinessException e) {
3495
            // TODO Auto-generated catch block
3496
            e.printStackTrace();
3497
        } catch (IOException e) {
3498
            // TODO Auto-generated catch block
3499
            e.printStackTrace();
3500
        } catch (Exception e) {
3501
            // TODO Auto-generated catch block
3502
            e.printStackTrace();
3503
        }
29488 manish 3504
 
31697 amit.gupta 3505
    }
29488 manish 3506
 
32482 amit.gupta 3507
    public void selectFinServiceFollowUpDateByCurrDate(LocalDate currentDate) throws
3508
            MessagingException, ProfitMandiBusinessException, IOException {
31697 amit.gupta 3509
        LOGGER.info("selectfinServiceFollow - {}", "selectfinServiceFollowUpDateByCurrDate");
29308 tejbeer 3510
 
31697 amit.gupta 3511
        serviceConfigService.selectFinServicePartnerfollowUpDateByCurrentDate(currentDate);
29252 amit.gupta 3512
 
31697 amit.gupta 3513
    }
29451 manish 3514
 
31697 amit.gupta 3515
    public void checkTecnoImeiActivation(LocalDate date, Integer day) {
3516
        LOGGER.info("Hello - {}", "hhh");
29308 tejbeer 3517
 
31697 amit.gupta 3518
        try {
3519
            tecnoImeiActivation.checkTecnoImeiActivation(date, day);
3520
        } catch (ProfitMandiBusinessException e) {
3521
            // TODO Auto-generated catch block
3522
            e.printStackTrace();
3523
        } catch (IOException e) {
3524
            // TODO Auto-generated catch block
3525
            e.printStackTrace();
3526
        } catch (Exception e) {
3527
            // TODO Auto-generated catch block
3528
            e.printStackTrace();
3529
        }
29308 tejbeer 3530
 
31697 amit.gupta 3531
    }
29441 tejbeer 3532
 
31697 amit.gupta 3533
    public void checkCancellationMargin() throws Exception {
3534
        LocalDateTime startDate = LocalDate.of(2021, 4, 1).atStartOfDay();
3535
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectCancelledBetweenSaleDate(startDate, LocalDateTime.now());
3536
        LOGGER.info("Total Orders =  {}", fofoOrders.size());
3537
        for (FofoOrder fofoOrder : fofoOrders) {
31886 tejbeer 3538
            List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.SCHEME_OUT);
3539
            history.addAll(userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.ACTIVATION_SCHEME));
31697 amit.gupta 3540
            int walletSum = history.stream().mapToInt(x -> x.getAmount()).sum();
3541
            if (Math.abs(walletSum) > 1) {
3542
                // LOGGER.info("Cancelled invoice {}, Order Id = {}, = havent rolledback, Value
3543
                // = {}", fofoOrder.getInvoiceNumber(), fofoOrder.getId(), walletSum);
3544
                List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
3545
                List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(fofoOrderItems.get(0).getId());
3546
                FofoLineItem fli = flis.get(0);
3547
                if (StringUtils.isEmpty(fli.getSerialNumber()))
3548
                    continue;
31886 tejbeer 3549
                List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(fli.getInventoryItemId())));
31697 amit.gupta 3550
                InventoryItem inventoryItem = inventoryItemRepository.selectById(fli.getInventoryItemId());
31886 tejbeer 3551
                double schemeSum = schemeInOuts.stream().filter(x -> x.getRolledBackTimestamp() == null).mapToDouble(x -> x.getAmount()).sum();
31697 amit.gupta 3552
                /*
3553
                 * if(inventoryItem.getGoodQuantity()==1) {
3554
                 * LOGGER.info("GoodQty, Serial Number {}, InventoryItem = {}, Billed on {}",
3555
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3556
                 * inventoryItem.getUpdateTimestamp()); } else
3557
                 * if(inventoryItem.getBadQuantity()==1){
3558
                 * LOGGER.info("Bad Qty, Serial Number {}, InventoryItem = {}, Billed on {}",
3559
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3560
                 * inventoryItem.getUpdateTimestamp()); } else if
3561
                 * (inventoryItem.getLastScanType().equals(ScanType.SALE)) { LOGGER.
3562
                 * info("Problem Sold, Serial Number {}, InventoryItem = {}, Billed on {}",
3563
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3564
                 * inventoryItem.getUpdateTimestamp()); }
3565
                 */
31886 tejbeer 3566
                if (inventoryItem.getLastScanType().equals(ScanType.SALE) || inventoryItem.getLastScanType().equals(ScanType.SALE_RET)) {
3567
                    Map<String, Double> map = schemeInOuts.stream().collect(
3568
                            groupingBy(
3569
                                    x -> DateTimeFormatter.ofPattern("yyyyMMddHH").format(x.getCreateTimestamp()) + "- " + x.getSchemeId(), Collectors.summingDouble(x -> x.getAmount())));
33452 amit.gupta 3570
                    for (Entry<String, Double> entry : map.entrySet()) {
31697 amit.gupta 3571
                        LOGGER.info("{} = {}", entry.getKey(), entry.getValue());
3572
                    }
31886 tejbeer 3573
                    LOGGER.info("id- {}, imei- {}, lastScan = {}, Scheme sum - {}", inventoryItem.getId(), inventoryItem.getSerialNumber(), inventoryItem.getLastScanType(), schemeSum);
31697 amit.gupta 3574
                }
3575
            }
3576
        }
29441 tejbeer 3577
 
31697 amit.gupta 3578
    }
29308 tejbeer 3579
 
31697 amit.gupta 3580
    public static String readFileAsString(String file) throws Exception {
3581
        String data = "";
3582
        data = new String(Files.readAllBytes(Paths.get(file)));
3583
        return data;
3584
    }
29308 tejbeer 3585
 
31697 amit.gupta 3586
    @Autowired
3587
    private PartnerCollectionRemarkRepository partnerCollectionRemarkRepository;
30421 tejbeer 3588
 
32832 amit.gupta 3589
    //RBM L2 Escalations
32482 amit.gupta 3590
    public void reviewUncontactablePartner() throws
3591
            ProfitMandiBusinessException, MessagingException, UnsupportedEncodingException {
30421 tejbeer 3592
 
31697 amit.gupta 3593
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
30421 tejbeer 3594
 
32832 amit.gupta 3595
        List<Integer> partnerLastCollectionRemarkIds = partnerCollectionRemarkRepository.selectMaxRemarkId(new ArrayList<>(customRetailerMap.keySet()));
30859 tejbeer 3596
 
32832 amit.gupta 3597
        if (!partnerLastCollectionRemarkIds.isEmpty()) {
3598
            List<PartnerCollectionRemark> partnerCollectionRemarks = partnerCollectionRemarkRepository.selectByIds(partnerLastCollectionRemarkIds);
30421 tejbeer 3599
 
33064 ranu 3600
            Map<Integer, PartnerCollectionRemark> rbmEscalatedRemarksMap = partnerCollectionRemarks.stream().filter(x -> x.getRemark().equals(CollectionRemark.RBM_L2_ESCALATION)).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
32832 amit.gupta 3601
            Map<Integer, PartnerCollectionRemark> salesEscalatedRemarksMap = partnerCollectionRemarks.stream().filter(x -> x.getRemark().equals(CollectionRemark.SALES_ESCALATION)).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
30859 tejbeer 3602
 
32832 amit.gupta 3603
 
3604
            if (!rbmEscalatedRemarksMap.isEmpty()) {
3605
                //
33452 amit.gupta 3606
                for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_RBM), true).entrySet()) {
32832 amit.gupta 3607
                    List<PartnerCollectionRemark> filteredRows = storeGuyEntry.getValue().stream()
3608
                            .map(x -> rbmEscalatedRemarksMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
3609
                    String subject = "Partners escalated to RBM-L2";
3610
                    String messageText = this.getMessageForRBMEscalatedPartners(filteredRows);
3611
 
31697 amit.gupta 3612
                    MimeMessage message = mailSender.createMimeMessage();
3613
                    MimeMessageHelper helper = new MimeMessageHelper(message, true);
3614
                    String[] email = new String[]{storeGuyEntry.getKey()};
30859 tejbeer 3615
 
31697 amit.gupta 3616
                    helper.setSubject(subject);
3617
                    helper.setText(messageText, true);
3618
                    helper.setTo(email);
31886 tejbeer 3619
                    InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
31697 amit.gupta 3620
                    helper.setFrom(senderAddress);
3621
                    mailSender.send(message);
30859 tejbeer 3622
 
31697 amit.gupta 3623
                    LOGGER.info("filteredRows {}", filteredRows);
30859 tejbeer 3624
 
31697 amit.gupta 3625
                }
3626
            }
32832 amit.gupta 3627
            if (!salesEscalatedRemarksMap.isEmpty()) {
3628
                //
35521 amit 3629
                for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_ABM, ProfitMandiConstants.TICKET_CATEGORY_RBM), true).entrySet()) {
32832 amit.gupta 3630
                    List<PartnerCollectionRemark> filteredRows = storeGuyEntry.getValue().stream()
3631
                            .map(x -> salesEscalatedRemarksMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
3632
                    String subject = "Partners escalated to Sales";
3633
                    String messageText = this.getMessageForSalesEscalatedPartners(filteredRows);
30936 tejbeer 3634
 
32832 amit.gupta 3635
                    MimeMessage message = mailSender.createMimeMessage();
3636
                    MimeMessageHelper helper = new MimeMessageHelper(message, true);
3637
                    String[] email = new String[]{storeGuyEntry.getKey()};
3638
 
3639
                    helper.setSubject(subject);
3640
                    helper.setText(messageText, true);
3641
                    helper.setTo(email);
3642
                    InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
3643
                    helper.setFrom(senderAddress);
3644
                    mailSender.send(message);
3645
 
3646
                    LOGGER.info("filteredRows {}", filteredRows);
3647
 
3648
                }
3649
            }
3650
 
31697 amit.gupta 3651
        }
3652
    }
30936 tejbeer 3653
 
33078 ranu 3654
 
31697 amit.gupta 3655
    @Autowired
33078 ranu 3656
    private NonSdBuyingRepository nonSdBuyingRepository;
3657
 
3658
    //Non Sd Buying
3659
    public void reviewNonSdBuyingBrand() throws
3660
            ProfitMandiBusinessException, MessagingException, UnsupportedEncodingException {
3661
        List<NonSdBuying> nonSdByuingActiveList = nonSdBuyingRepository.selectAllActiveNonSDBuyingList(true);
3662
        Map<Integer, NonSdBuying> unAuthorizedBuyingMap = nonSdByuingActiveList.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
3663
 
3664
        if (!unAuthorizedBuyingMap.isEmpty()) {
35521 amit 3665
            for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_ABM), true).entrySet()) {
33078 ranu 3666
                List<NonSdBuying> unAuthorizedfilteredRows = storeGuyEntry.getValue().stream()
3667
                        .map(x -> unAuthorizedBuyingMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
33112 amit.gupta 3668
                if (!unAuthorizedfilteredRows.isEmpty()) {
33078 ranu 3669
                    String subject = "Unauthorized Buying";
3670
                    String messageText = this.getMessageForUnauthorizedBuying(unAuthorizedfilteredRows);
3671
 
3672
                    MimeMessage message = mailSender.createMimeMessage();
3673
                    MimeMessageHelper helper = new MimeMessageHelper(message, true);
3674
                    String[] email = new String[]{storeGuyEntry.getKey()};
3675
 
3676
                    helper.setSubject(subject);
3677
                    helper.setText(messageText, true);
3678
                    helper.setTo(email);
3679
                    InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
3680
                    helper.setFrom(senderAddress);
3681
                    mailSender.send(message);
3682
                    LOGGER.info("unAuthorizedfilteredRows {}", unAuthorizedfilteredRows);
3683
                }
3684
 
3685
 
3686
            }
3687
 
3688
        }
3689
    }
3690
 
3691
    @Autowired
31697 amit.gupta 3692
    private LoanRepository loanRepository;
31020 tejbeer 3693
 
31697 amit.gupta 3694
    @Autowired
3695
    private LoanStatementRepository loanStatementRepository;
30859 tejbeer 3696
 
31697 amit.gupta 3697
    @Autowired
3698
    private SDCreditRequirementRepository sdCreditRequirementRepository;
30859 tejbeer 3699
 
31697 amit.gupta 3700
    @Autowired
3701
    private CurrentPartnerDailyInvestmentRepository currentPartnerDailyInvestmentRepository;
30859 tejbeer 3702
 
31697 amit.gupta 3703
    @Autowired
3704
    private TransactionRepository transactionRepository;
30859 tejbeer 3705
 
31697 amit.gupta 3706
    @Autowired
3707
    private SanctionRequestRepository sanctionRequestRepository;
30859 tejbeer 3708
 
31697 amit.gupta 3709
    public void calculateInterestAccured() throws ProfitMandiBusinessException {
34755 amit.gupta 3710
        List<Loan> loans = loanRepository.selectAllActiveLoan();
3711
        //List<Loan> loans = Arrays.asList(loanRepository.selectByLoanId(52669));
30859 tejbeer 3712
 
32724 amit.gupta 3713
        for (Loan loan : loans) {
3714
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
3715
            Map<LoanReferenceType, Double> loanStatusAmount = loanStatements.stream().collect(groupingBy(
3716
                    x -> x.getLoanReferenceType(), Collectors.summingDouble(x -> x.getAmount().doubleValue())));
30936 tejbeer 3717
 
32724 amit.gupta 3718
            int freeDays = loan.getFreeDays();
30936 tejbeer 3719
 
34710 amit.gupta 3720
            LocalDate freeDaysLimitDate = loan.getCreatedOn().plusDays(freeDays).toLocalDate();
30936 tejbeer 3721
 
34710 amit.gupta 3722
            LOGGER.info("Loan id - {}, freeDaysLimitDate {}", loan.getId(), freeDaysLimitDate);
3723
            if (LocalDate.now().isAfter(freeDaysLimitDate)) {
32724 amit.gupta 3724
                int loanStatementId = loanStatementRepository.selectLatestLoanSatement(loan.getFofoId(), loan.getId());
3725
                LOGGER.info("loanStatementId {}", loanStatementId);
3726
                if (loanStatementId != 0) {
3727
                    this.calculateInterest(loan, loanStatusAmount, loanStatementId);
31697 amit.gupta 3728
                } else {
34710 amit.gupta 3729
                    sdCreditService.addInterest(freeDaysLimitDate, LocalDate.now(), loan, loanStatusAmount);
31697 amit.gupta 3730
                }
32724 amit.gupta 3731
            }
31697 amit.gupta 3732
        }
3733
    }
30936 tejbeer 3734
 
31697 amit.gupta 3735
    @Autowired
3736
    FofoPaymentRepository fofoPaymentRepository;
30936 tejbeer 3737
 
31697 amit.gupta 3738
    @Autowired
3739
    CCAvenuePaymentService ccAvenuePaymentService;
30936 tejbeer 3740
 
31697 amit.gupta 3741
    public void settleCCAvePayments() throws Exception {
31886 tejbeer 3742
        List<FofoPayment> fofoPayments = fofoPaymentRepository.selectAllByGatewayStatus(Gateway.CCAVENUE, PaymentStatus.INIT).stream().filter(x -> x.getCreateTimestamp().isBefore(LocalDateTime.now().minusMinutes(30l))).collect(Collectors.toList());
31697 amit.gupta 3743
        for (FofoPayment fofoPayment : fofoPayments) {
3744
            ccAvenuePaymentService.updatePayment(fofoPayment);
3745
        }
3746
    }
30859 tejbeer 3747
 
31697 amit.gupta 3748
    /*
3749
     * public void getCCAvenuePendingOrderStatus(int pendingOrderId) { PendingOrder
3750
     * pendingOrder = pendingOrderRepository.selectById(pendingOrderId);
3751
     * ccAvenuePaymentService.getPaymentStatusMap(pendingOrder); }
3752
     */
30859 tejbeer 3753
 
32482 amit.gupta 3754
    private void calculateInterest(Loan loan, Map<LoanReferenceType, Double> loanStatusAmount,
3755
                                   int loanStatementId) throws ProfitMandiBusinessException {
31697 amit.gupta 3756
        LoanStatement loanStatement = loanStatementRepository.selectById(loanStatementId);
30859 tejbeer 3757
 
31697 amit.gupta 3758
        if (loanStatement.getLoanId() == loan.getId()) {
34710 amit.gupta 3759
            sdCreditService.addInterest(loanStatement.getCreatedAt().toLocalDate().plusDays(1), LocalDate.now(), loan, loanStatusAmount);
31697 amit.gupta 3760
        } else {
3761
            throw new ProfitMandiBusinessException("loanstament", loanStatement.getLoanId(), "Invalid LoanId");
3762
        }
3763
    }
31175 tejbeer 3764
 
31697 amit.gupta 3765
    public void loanSettlement() throws Exception {
34766 amit.gupta 3766
        List<Loan> loans = loanRepository.selectAllActiveLoanForSettlement().stream().filter(x -> x.canBeSettled()).collect(toList());
34275 tejus.loha 3767
        //TODO:Upto here
3768
        if (!loans.isEmpty()) {
31020 tejbeer 3769
 
34275 tejus.loha 3770
            for (Loan loan : loans) {
34710 amit.gupta 3771
                LOGGER.info("Loan - {},  {}", loan.getId(), loan.canBeSettled());
34275 tejus.loha 3772
                double settledAmount = sdCreditService.settleLoan(loan);
30859 tejbeer 3773
 
34275 tejus.loha 3774
                List<SanctionRequest> sanctionRequests = sanctionRequestRepository.selectHoldSanctionByFofoId(loan.getFofoId());
3775
                for (SanctionRequest sanctionRequest : sanctionRequests) {
31175 tejbeer 3776
 
34275 tejus.loha 3777
                    List<Order> orders = orderRepository.selectAllByTransactionId(sanctionRequest.getTransactionId());
3778
                    if (orders.size() == 0) {
3779
                        LOGGER.info("Could not find orders - for Sanction Request {}", sanctionRequest);
3780
                        continue;
3781
                    }
30999 tejbeer 3782
 
34275 tejus.loha 3783
                    if (settledAmount >= sanctionRequest.getPendingAmount().doubleValue()) {
3784
                        settledAmount -= sanctionRequest.getPendingAmount().doubleValue();
3785
                        sanctionRequest.setPendingAmount(BigDecimal.valueOf(0));
3786
                        this.sendUnholdEmail(orders);
3787
                    } else {
3788
                        double pendinAmount = sanctionRequest.getPendingAmount().doubleValue() - settledAmount;
3789
                        System.out.println("Pending Amount - " + pendinAmount);
3790
                        sanctionRequest.setPendingAmount(BigDecimal.valueOf(pendinAmount));
3791
                        break;
33828 ranu 3792
 
34275 tejus.loha 3793
                    }
34162 ranu 3794
 
3795
                }
32439 tejbeer 3796
            }
31020 tejbeer 3797
 
34275 tejus.loha 3798
        }
33664 amit.gupta 3799
 
33828 ranu 3800
 
32439 tejbeer 3801
    }
31020 tejbeer 3802
 
3803
 
32439 tejbeer 3804
    private void sendUnholdEmail(List<Order> orders) throws Exception {
30859 tejbeer 3805
 
3806
 
32439 tejbeer 3807
        orders.forEach(x -> x.setShipmentHold(false));
33452 amit.gupta 3808
        orders = orders.stream().filter(x -> x.getRefundTimestamp() != null).collect(Collectors.toList());
33506 amit.gupta 3809
        if (orders.size() > 0) {
33427 amit.gupta 3810
 
33664 amit.gupta 3811
            double totalAmount = orders.stream().collect(Collectors.summingDouble(x -> x.getTotalAmount()));
30859 tejbeer 3812
 
33506 amit.gupta 3813
            List<String> authUserEmail = csService.getAuthUserIdByPartnerId(orders.get(0).getRetailerId()).stream().map(x -> x.getEmailId()).collect(Collectors.toList());
3814
            authUserEmail.add("vinay.p@smartdukaan.com");
3815
            authUserEmail.add("shivam.gupta@smartdukaan.com");
30859 tejbeer 3816
 
33506 amit.gupta 3817
            String[] emailTo = authUserEmail.toArray(new String[authUserEmail.size()]);
30859 tejbeer 3818
 
33506 amit.gupta 3819
            String[] ccTo = {"tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com"};
30859 tejbeer 3820
 
33664 amit.gupta 3821
            String subject = "Dispatch held orders of - " + (orders.get(0).getRetailerName());
3822
            String message = String.format("Dear Team, \n" + "kindly note the material for the " + orders.get(0).getRetailerName() + "of Rs." + totalAmount + "is unhold now and needs to be dispatched.");
3823
            Utils.sendMailWithAttachments(mailSender, emailTo, ccTo, subject, message);
33506 amit.gupta 3824
        }
30859 tejbeer 3825
 
32439 tejbeer 3826
 
31697 amit.gupta 3827
    }
30859 tejbeer 3828
 
32307 amit.gupta 3829
    public void dailyLoanAlert() throws Exception {
31697 amit.gupta 3830
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30859 tejbeer 3831
 
31697 amit.gupta 3832
        Map<Integer, Double> partnerLoanAmount = new HashMap<>();
30859 tejbeer 3833
 
31697 amit.gupta 3834
        if (!loans.isEmpty()) {
30859 tejbeer 3835
 
31697 amit.gupta 3836
            for (Loan loan : loans) {
30859 tejbeer 3837
 
31697 amit.gupta 3838
                List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
30859 tejbeer 3839
 
31886 tejbeer 3840
                double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
31697 amit.gupta 3841
                if (partnerLoanAmount.get(loan.getFofoId()) != null) {
3842
                    amount += partnerLoanAmount.get(loan.getFofoId());
3843
                    partnerLoanAmount.put(loan.getFofoId(), amount);
3844
                } else {
3845
                    partnerLoanAmount.put(loan.getFofoId(), amount);
3846
                }
30965 tejbeer 3847
 
31697 amit.gupta 3848
            }
30965 tejbeer 3849
 
31697 amit.gupta 3850
        }
30859 tejbeer 3851
 
31697 amit.gupta 3852
        if (!partnerLoanAmount.isEmpty()) {
30965 tejbeer 3853
 
31697 amit.gupta 3854
            for (Entry<Integer, Double> partnerLoanAmountEnrty : partnerLoanAmount.entrySet()) {
30859 tejbeer 3855
 
31697 amit.gupta 3856
                int fofoId = partnerLoanAmountEnrty.getKey();
30859 tejbeer 3857
 
31697 amit.gupta 3858
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(fofoId);
30859 tejbeer 3859
 
31697 amit.gupta 3860
                Address address = addressRepository.selectById(user.getAddressId());
30896 amit.gupta 3861
 
31697 amit.gupta 3862
                String title = "Alert Credit Outstanding!";
3863
                String url = "http://app.smartdukaan.com/pages/home/credit";
34729 amit.gupta 3864
                String message = "Your total outstanding Credit Balance is Rs." + FormattingUtils.formatDecimal(Math.abs(partnerLoanAmountEnrty.getValue())) + ".";
31697 amit.gupta 3865
                notificationService.sendNotification(fofoId, title, MessageType.notification, title, message, url);
30913 tejbeer 3866
 
32841 amit.gupta 3867
                //notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30913 tejbeer 3868
 
31697 amit.gupta 3869
            }
30917 tejbeer 3870
 
31697 amit.gupta 3871
        }
30917 tejbeer 3872
 
31697 amit.gupta 3873
    }
30920 tejbeer 3874
 
31697 amit.gupta 3875
    public void processActivatedImeisForSchemes() throws ProfitMandiBusinessException {
3876
        schemeService.processActivatedImeisForSchemes();
3877
    }
30920 tejbeer 3878
 
33112 amit.gupta 3879
    @Autowired
33355 amit.gupta 3880
    SidbiService sidbiService;
33112 amit.gupta 3881
 
33364 amit.gupta 3882
    public void processSidbiDeductions() throws ProfitMandiBusinessException {
33434 amit.gupta 3883
        //sidbiService.migrateSanctions();
33355 amit.gupta 3884
        sidbiService.processDeductions();
3885
    }
35521 amit 3886
 
35326 amit 3887
    public void updatePartnerLimit(int fofoId) throws ProfitMandiBusinessException {
3888
        LocalDateTime firstBillingDate = transactionRepository.getFirstBillingDate(fofoId);
33355 amit.gupta 3889
 
35326 amit 3890
        CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(fofoId, Gateway.SDDIRECT);
35393 amit 3891
        BigDecimal utilizationAmount = sdCreditService.getUtilizationAmount(fofoId);
35326 amit 3892
        PartnerDailyInvestment partnerDailyInvestment = partnerInvestmentService.getInvestment(fofoId, 0);
3893
        BigDecimal suggestedAmount = this.getSuggestedAmount(creditAccount, partnerDailyInvestment, utilizationAmount, null);
3894
        SDCreditRequirement sdCreditRequirement = sdCreditRequirementRepository.selectByFofoId(fofoId);
3895
 
3896
        LOGGER.info("suggestedAmount {} ", suggestedAmount);
3897
 
3898
        if (sdCreditRequirement == null) {
3899
            sdCreditRequirement = new SDCreditRequirement();
3900
            sdCreditRequirement.setFofoId(fofoId);
3901
            sdCreditRequirement.setCreditDays(15);
3902
            sdCreditRequirement.setInterestRate(ProfitMandiConstants.NEW_INTEREST_RATE);
3903
            sdCreditRequirement.setRisk(CreditRisk.HIGH_RISK);
3904
            sdCreditRequirement.setUtilizedAmount(BigDecimal.ZERO);
3905
            sdCreditRequirement.setCreateTimestamp(LocalDateTime.now());
3906
            sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
3907
            sdCreditRequirementRepository.persist(sdCreditRequirement);
3908
        }
3909
 
3910
        CreditRisk creditRisk = sdCreditService.getCurrentRisk(sdCreditRequirement, firstBillingDate);
3911
 
3912
        sdCreditRequirement.setRisk(creditRisk);
3913
        LOGGER.info("Suggested Amount - {}", suggestedAmount);
3914
        sdCreditRequirement.setSuggestedLimit(suggestedAmount);
3915
        if (!sdCreditRequirement.isHardLimit()) {
3916
            sdCreditRequirement.setLimit(suggestedAmount);
3917
        }
35393 amit 3918
        BigDecimal utilizedLimit = sdCreditService.getUtilizationAmount(fofoId);
35326 amit 3919
 
3920
        BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);
3921
 
3922
        LOGGER.info("utilizedLimit {} ", utilizedLimit);
3923
 
3924
        LOGGER.info("availableLimit {} ", availableLimit);
3925
 
3926
        sdCreditRequirement.setUtilizedAmount(utilizedLimit);
3927
 
3928
        sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
3929
 
3930
        if (creditAccount != null) {
3931
 
3932
            creditAccount.setInterestRate(sdCreditRequirement.getInterestRate().floatValue());
3933
            creditAccount.setSanctionedAmount(sdCreditRequirement.getLimit().floatValue());
3934
            creditAccount.setAvailableAmount(availableLimit.floatValue());
3935
            creditAccount.setFreeDays(sdCreditRequirement.getFreeDays());
3936
            creditAccount.setUpdatedOn(LocalDateTime.now());
3937
        }
3938
 
3939
    }
35521 amit 3940
 
31697 amit.gupta 3941
    public void updatePartnerLimit() throws ProfitMandiBusinessException {
3942
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
33355 amit.gupta 3943
        Map<Integer, BigDecimal> fofoSidbiLimitMap = sidbiService.getSuggestedLimitMap();
31886 tejbeer 3944
        Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
33159 amit.gupta 3945
        Map<Integer, CreditAccount> creditAccountMap = creditAccountRepository.selectAllByGateways(Arrays.asList(Gateway.SIDBI, Gateway.SDDIRECT))
33112 amit.gupta 3946
                .stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31697 amit.gupta 3947
        for (Entry<Integer, CustomRetailer> customRetailerEntry : customRetailerMap.entrySet()) {
3948
            int fofoId = customRetailerEntry.getKey();
3949
            LocalDateTime firstBillingDate = transactionRepository.getFirstBillingDate(fofoId);
33287 amit.gupta 3950
 
33112 amit.gupta 3951
            CreditAccount creditAccount = creditAccountMap.get(fofoId);
35393 amit 3952
            BigDecimal utilizationAmount = sdCreditService.getUtilizationAmount(fofoId);
35177 amit 3953
            PartnerDailyInvestment partnerDailyInvestment = partnerInvestmentService.getInvestment(fofoId, 0);
3954
            BigDecimal suggestedAmount = this.getSuggestedAmount(creditAccount, partnerDailyInvestment, utilizationAmount, fofoSidbiLimitMap.get(fofoId));
33112 amit.gupta 3955
            SDCreditRequirement sdCreditRequirement = sdCreditRequirementMap.get(fofoId);
30929 tejbeer 3956
 
31697 amit.gupta 3957
            LOGGER.info("suggestedAmount {} ", suggestedAmount);
30913 tejbeer 3958
 
31697 amit.gupta 3959
            if (sdCreditRequirement == null) {
3960
                sdCreditRequirement = new SDCreditRequirement();
3961
                sdCreditRequirement.setFofoId(fofoId);
3962
                sdCreditRequirement.setCreditDays(15);
33452 amit.gupta 3963
                sdCreditRequirement.setInterestRate(ProfitMandiConstants.NEW_INTEREST_RATE);
31697 amit.gupta 3964
                sdCreditRequirement.setRisk(CreditRisk.HIGH_RISK);
3965
                sdCreditRequirement.setUtilizedAmount(BigDecimal.ZERO);
3966
                sdCreditRequirement.setCreateTimestamp(LocalDateTime.now());
3967
                sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
3968
                sdCreditRequirementRepository.persist(sdCreditRequirement);
3969
            }
30913 tejbeer 3970
 
31697 amit.gupta 3971
            CreditRisk creditRisk = sdCreditService.getCurrentRisk(sdCreditRequirement, firstBillingDate);
30913 tejbeer 3972
 
31697 amit.gupta 3973
            sdCreditRequirement.setRisk(creditRisk);
30913 tejbeer 3974
 
33874 ranu 3975
            sdCreditRequirement.setSuggestedLimit(suggestedAmount);
34275 tejus.loha 3976
            if (!sdCreditRequirement.isHardLimit()) {
34122 ranu 3977
                sdCreditRequirement.setLimit(suggestedAmount);
3978
            }
35393 amit 3979
            BigDecimal utilizedLimit = sdCreditService.getUtilizationAmount(fofoId);
30934 tejbeer 3980
 
31697 amit.gupta 3981
            BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);
30934 tejbeer 3982
 
31697 amit.gupta 3983
            LOGGER.info("utilizedLimit {} ", utilizedLimit);
30913 tejbeer 3984
 
31697 amit.gupta 3985
            LOGGER.info("availableLimit {} ", availableLimit);
30913 tejbeer 3986
 
31697 amit.gupta 3987
            sdCreditRequirement.setUtilizedAmount(utilizedLimit);
30929 tejbeer 3988
 
31697 amit.gupta 3989
            sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
30929 tejbeer 3990
 
31697 amit.gupta 3991
            if (creditAccount != null) {
30929 tejbeer 3992
 
31697 amit.gupta 3993
                creditAccount.setInterestRate(sdCreditRequirement.getInterestRate().floatValue());
3994
                creditAccount.setSanctionedAmount(sdCreditRequirement.getLimit().floatValue());
3995
                creditAccount.setAvailableAmount(availableLimit.floatValue());
3996
                creditAccount.setFreeDays(sdCreditRequirement.getFreeDays());
3997
                creditAccount.setUpdatedOn(LocalDateTime.now());
3998
            }
30929 tejbeer 3999
 
31697 amit.gupta 4000
        }
31177 tejbeer 4001
 
31697 amit.gupta 4002
    }
34502 amit.gupta 4003
 
34374 amit.gupta 4004
    private static final NavigableMap<Double, Double> discountMap = new TreeMap<>();
34502 amit.gupta 4005
 
34374 amit.gupta 4006
    static {
34852 amit 4007
        discountMap.put(4 * ProfitMandiConstants.ONE_LAC - 1, 0.2);    // Up to 3,99,999 -> 20%
4008
        discountMap.put(10 * ProfitMandiConstants.ONE_LAC - 1, 0.25);  // 4,00,000 to 9,99,999 -> 25%
4009
        discountMap.put(20 * ProfitMandiConstants.ONE_LAC - 1, 0.3);   // 10,00,000 to 19,99,999 -> 30%
4010
        discountMap.put(Double.MAX_VALUE, 0.4);                        // 20,00,000 and above -> 40%
34374 amit.gupta 4011
    }
34502 amit.gupta 4012
 
4013
    public BigDecimal getSuggestedLimit(double investmentValue) {
34374 amit.gupta 4014
        double percentageValue = discountMap.ceilingEntry(investmentValue).getValue();
34510 amit.gupta 4015
        return this.getSuggestedAmount(investmentValue, percentageValue);
4016
 
4017
    }
4018
 
4019
    private BigDecimal getSuggestedAmount(double investmentValue, double percentageValue) {
34374 amit.gupta 4020
        return BigDecimal.valueOf(investmentValue * percentageValue);
4021
    }
34502 amit.gupta 4022
 
35299 amit 4023
    /*private static List<Integer> hundredPercentLimitPartnerIds = Arrays.asList(175139630,
34510 amit.gupta 4024
            175139815,
4025
            175139844,
4026
            175140101
35299 amit 4027
    );*/
34510 amit.gupta 4028
 
35299 amit 4029
    private static List<Integer> hundredPercentLimitPartnerIds = Arrays.asList();
4030
 
35177 amit 4031
    private BigDecimal getSuggestedAmount(CreditAccount creditAccount, PartnerDailyInvestment
35393 amit 4032
            partnerDailyInvestment, BigDecimal utilizationAmount, BigDecimal sidbiLimit) {
33112 amit.gupta 4033
        BigDecimal suggestedAmount = BigDecimal.ZERO;
35393 amit 4034
        double utilization = utilizationAmount != null ? utilizationAmount.doubleValue() : 0;
33112 amit.gupta 4035
        //1 LAC
33295 amit.gupta 4036
        if (creditAccount == null || creditAccount.getGateway().equals(Gateway.SDDIRECT)) {
33112 amit.gupta 4037
 
35177 amit 4038
            if (partnerDailyInvestment != null) {
4039
                if (hundredPercentLimitPartnerIds.contains(partnerDailyInvestment.getFofoId())) {
35393 amit 4040
                    suggestedAmount = getSuggestedAmount(partnerDailyInvestment.getTotalInvestment() - utilization, 1);
34512 amit.gupta 4041
                    suggestedAmount = suggestedAmount.min(BigDecimal.valueOf(1500000));
34510 amit.gupta 4042
                } else {
35393 amit 4043
                    suggestedAmount = getSuggestedLimit(partnerDailyInvestment.getTotalInvestment() - utilization);
34510 amit.gupta 4044
                }
33112 amit.gupta 4045
            }
4046
            if (suggestedAmount.doubleValue() < 0) {
4047
                suggestedAmount = BigDecimal.ZERO;
4048
            }
33355 amit.gupta 4049
        } else if (creditAccount.getGateway().equals(Gateway.SIDBI) && sidbiLimit != null) {
35393 amit 4050
            suggestedAmount = getSuggestedLimit(partnerDailyInvestment.getTotalInvestment() - utilization);
34993 ranu 4051
            suggestedAmount = suggestedAmount.max(sidbiLimit);
4052
 
4053
 
33112 amit.gupta 4054
        }
4055
        return suggestedAmount;
4056
    }
4057
 
31697 amit.gupta 4058
    public void notifyDefaultLoans() throws ProfitMandiBusinessException, MessagingException, IOException {
30929 tejbeer 4059
 
31697 amit.gupta 4060
        sdCreditService.updateRisk();
34729 amit.gupta 4061
        List<Loan> defaultLoans = sdCreditService.getDefaultLoans();
31697 amit.gupta 4062
        if (!defaultLoans.isEmpty()) {
4063
            this.sendDefaultLoanAlert(defaultLoans);
4064
        }
30929 tejbeer 4065
 
31697 amit.gupta 4066
    }
30929 tejbeer 4067
 
32482 amit.gupta 4068
    public void sendDefaultLoanAlert(List<Loan> defaultLoans) throws
4069
            ProfitMandiBusinessException, MessagingException, IOException {
31697 amit.gupta 4070
        String subject = "Default Partners";
30931 tejbeer 4071
 
35521 amit 4072
        List<Integer> categoryIds = Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_CATEGORY, ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_ABM, ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS, ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT);
30929 tejbeer 4073
 
33452 amit.gupta 4074
        for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false).entrySet()) {
31697 amit.gupta 4075
            List<Loan> filteredRows = new ArrayList<>();
4076
            for (Loan loan : defaultLoans) {
30929 tejbeer 4077
 
31697 amit.gupta 4078
                if (storeGuyEntry.getValue().contains(loan.getFofoId())) {
30929 tejbeer 4079
 
31697 amit.gupta 4080
                    filteredRows.add(loan);
4081
                }
4082
            }
4083
            if (!filteredRows.isEmpty()) {
33628 tejus.loha 4084
                String[] email = new String[]{storeGuyEntry.getKey()};
31697 amit.gupta 4085
                String messageText = this.getMessageForDueDateExtend(filteredRows);
32350 amit.gupta 4086
                this.sendMailOfHtmlFormat(googleMailSender, email, messageText, null, subject);
30982 tejbeer 4087
 
31697 amit.gupta 4088
            }
30936 tejbeer 4089
 
31697 amit.gupta 4090
        }
33628 tejus.loha 4091
        String messageText = this.getMessageForDueDateExtend(defaultLoans);
34858 amit 4092
        this.sendMailOfHtmlFormat(googleMailSender, new String[]{"puneet.wahi@smartdukaan.com", "rahul.latwal@smartdukaan.com", "dilbag.singh@smartdukaan.com"}, messageText, null, subject);
30982 tejbeer 4093
 
31697 amit.gupta 4094
        for (Loan defaultLoan : defaultLoans) {
4095
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
30929 tejbeer 4096
 
31886 tejbeer 4097
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30929 tejbeer 4098
 
31697 amit.gupta 4099
            com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(defaultLoan.getFofoId());
30936 tejbeer 4100
 
31697 amit.gupta 4101
            Address address = addressRepository.selectById(user.getAddressId());
30936 tejbeer 4102
 
34729 amit.gupta 4103
            String title = "Outstanding Credit Payment Overdue!";
31697 amit.gupta 4104
            String url = "http://app.smartdukaan.com/pages/home/credit";
34731 amit.gupta 4105
            String message = "Your Outstanding Credit payment due date " + defaultLoan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy")) + " has been exceeded. Please note " + ProfitMandiConstants.NEW_DELAYED_INTEREST_RATE + " shall be levied on daily basis." + " Your total pending Loan amount is Rs." + FormattingUtils.formatDecimal(Math.abs(amount)) + ". !!Pay Now!!";
31886 tejbeer 4106
            notificationService.sendNotification(defaultLoan.getFofoId(), title, MessageType.notification, title, message, url);
30936 tejbeer 4107
 
31697 amit.gupta 4108
            // notificationService.sendWhatsappMessage(message, title,
4109
            // address.getPhoneNumber());
30929 tejbeer 4110
 
31697 amit.gupta 4111
        }
4112
    }
30929 tejbeer 4113
 
31697 amit.gupta 4114
    private String getMessageForDueDateExtend(List<Loan> loans) throws ProfitMandiBusinessException {
33553 ranu 4115
        Map<Integer, com.spice.profitmandi.dao.model.FofoReportingModel> fofoReportingModelMap = csService.getPartnerIdSalesHeaders();
4116
        Map<Integer, FofoRBMReportingModel> fofoRbmReportingModelMap = csService.getPartnerIdRBMHeaders();
4117
        List<AST> asts = astRepository.selectAll();
4118
        Map<Integer, AST> astMap = asts.stream()
4119
                .collect(Collectors.toMap(AST::getId, ast -> ast));
31697 amit.gupta 4120
        StringBuilder sb = new StringBuilder();
4121
        sb.append(
33553 ranu 4122
                "<html><body><p>Alert</p><p>Default Partners :-</p>" + "<br/><p>EveryDay Rs.100 charged as Penalty</p>" + "<br/>" +
4123
                        "<table style='border:1px solid black ;padding: 5px';>");
4124
        sb.append("<tbody>\n" +
4125
                "<tr>\n" +
4126
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>\n" +
33555 ranu 4127
                "<th style='border:1px solid black;padding: 5px'>State Name</th>\n" +
4128
                "<th style='border:1px solid black;padding: 5px'>Area</th>\n" +
4129
                "<th style='border:1px solid black;padding: 5px'>Territory</th>\n" +
33553 ranu 4130
                "<th style='border:1px solid black;padding: 5px'>due date</th>\n" +
4131
                "<th style='border:1px solid black;padding: 5px'>Days</th>\n" +
33664 amit.gupta 4132
                "<th style='border:1px solid black;padding: 5px'>Pending Amount</th>\n" +
33810 ranu 4133
                "<th style='border:1px solid black;padding: 5px'>RBM L2</th>\n" +
33553 ranu 4134
                "<th style='border:1px solid black;padding: 5px'>RBM L1</th>\n" +
4135
                "<th style='border:1px solid black;padding: 5px'>Sales L1</th>\n" +
4136
                "<th style='border:1px solid black;padding: 5px'>Sales L2</th>\n" +
4137
                "</tr>");
31697 amit.gupta 4138
        for (Loan entry : loans) {
30929 tejbeer 4139
 
31697 amit.gupta 4140
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(entry.getId());
30929 tejbeer 4141
 
31886 tejbeer 4142
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30929 tejbeer 4143
 
31697 amit.gupta 4144
            long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getDueDate().toLocalDate(), LocalDateTime.now());
30929 tejbeer 4145
 
31697 amit.gupta 4146
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
30929 tejbeer 4147
 
31697 amit.gupta 4148
            sb.append("<tr>");
31886 tejbeer 4149
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
33555 ranu 4150
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getAddress().getState() + "</td>");
4151
            sb.append("<td style='border:1px solid black;padding: 5px'>" + astMap.get(customRetailer.getAstId()).getArea() + "</td>");
4152
            sb.append("<td style='border:1px solid black;padding: 5px'>" + astMap.get(customRetailer.getAstId()).getTerritory() + "</td>");
31886 tejbeer 4153
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getDueDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
31697 amit.gupta 4154
            sb.append("<td style='border:1px solid black;padding: 5px'>" + noOfdaysBetween + "</td>");
31886 tejbeer 4155
            sb.append("<td style='border:1px solid black;padding: 5px'>" + new DecimalFormat("#.##").format(Math.abs(amount)) + "</td>");
33553 ranu 4156
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoRbmReportingModelMap.get(entry.getFofoId()).getL1Manager() + "</td>");
4157
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoRbmReportingModelMap.get(entry.getFofoId()).getL2Manager() + "</td>");
4158
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoReportingModelMap.get(entry.getFofoId()).getTerritoryManager() + "</td>");
4159
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoReportingModelMap.get(entry.getFofoId()).getRegionalManager() + "</td>");
31397 tejbeer 4160
 
33555 ranu 4161
 
31697 amit.gupta 4162
            sb.append("</tr>");
31397 tejbeer 4163
 
31697 amit.gupta 4164
        }
31397 tejbeer 4165
 
31697 amit.gupta 4166
        sb.append("</tbody></table></body></html>");
31397 tejbeer 4167
 
31697 amit.gupta 4168
        return sb.toString();
4169
    }
31397 tejbeer 4170
 
35111 ranu 4171
    private String getMessageForDueDateCross(List<Loan> dueDateCrossLoans) throws ProfitMandiBusinessException {
33161 ranu 4172
        Map<Integer, com.spice.profitmandi.dao.model.FofoReportingModel> fofoReportingModelMap = csService.getPartnerIdSalesHeaders();
33452 amit.gupta 4173
        Map<Integer, FofoRBMReportingModel> fofoRbmReportingModelMap = csService.getPartnerIdRBMHeaders();
33553 ranu 4174
        List<AST> asts = astRepository.selectAll();
4175
        Map<Integer, AST> astMap = asts.stream()
4176
                .collect(Collectors.toMap(AST::getId, ast -> ast));
4177
 
31697 amit.gupta 4178
        StringBuilder sb = new StringBuilder();
35110 ranu 4179
        sb.append("<html><body><p>Alert</p><p>Partner Credit Report :-</p>" + "<br/><p>Additional penal interest of  shall be levied on daily basis.</p>" + "<br/>" +
33161 ranu 4180
                "<table style='border:1px solid black ;padding: 5px';>");
4181
        sb.append("<tbody>\n" + "<tr>\n" +
33256 amit.gupta 4182
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>\n" +
4183
                "<th style='border:1px solid black;padding: 5px'>State Name</th>\n" +
33555 ranu 4184
                "<th style='border:1px solid black;padding: 5px'>Area</th>\n" +
33553 ranu 4185
                "<th style='border:1px solid black;padding: 5px'>Territory</th>\n" +
33256 amit.gupta 4186
                "<th style='border:1px solid black;padding: 5px'>due date</th>\n" +
4187
                "<th style='border:1px solid black;padding: 5px'>Days</th>\n" +
4188
                "<th style='border:1px solid black;padding: 5px'>Pending Amount</th>\n" +
33810 ranu 4189
                "<th style='border:1px solid black;padding: 5px'>RBM L2</th>\n" +
33256 amit.gupta 4190
                "<th style='border:1px solid black;padding: 5px'>RBM L1</th>\n" +
4191
                "<th style='border:1px solid black;padding: 5px'>Sales L1</th>\n" +
4192
                "<th style='border:1px solid black;padding: 5px'>Sales L2</th>\n" +
35107 ranu 4193
                "<th style='border:1px solid black;padding: 5px'>Limit Assigned</th>\n" +
33161 ranu 4194
                "</tr>");
31397 tejbeer 4195
 
35111 ranu 4196
        for (Loan entry : dueDateCrossLoans) {
4197
            DecimalFormat df = new DecimalFormat("#.##");
31397 tejbeer 4198
 
31697 amit.gupta 4199
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(entry.getId());
31397 tejbeer 4200
 
31886 tejbeer 4201
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
31397 tejbeer 4202
 
31697 amit.gupta 4203
            long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getDueDate().toLocalDate(), LocalDateTime.now());
31397 tejbeer 4204
 
31697 amit.gupta 4205
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
31397 tejbeer 4206
 
35106 ranu 4207
            SDCreditRequirement sdCreditRequirement = sdCreditRequirementRepository.selectByFofoId(customRetailer.getPartnerId());
4208
 
31697 amit.gupta 4209
            sb.append("<tr>");
31886 tejbeer 4210
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
33162 ranu 4211
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getAddress().getState() + "</td>");
33553 ranu 4212
            sb.append("<td style='border:1px solid black;padding: 5px'>" + astMap.get(customRetailer.getAstId()).getArea() + "</td>");
4213
            sb.append("<td style='border:1px solid black;padding: 5px'>" + astMap.get(customRetailer.getAstId()).getTerritory() + "</td>");
30936 tejbeer 4214
 
31886 tejbeer 4215
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getDueDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
31697 amit.gupta 4216
            sb.append("<td style='border:1px solid black;padding: 5px'>" + noOfdaysBetween + "</td>");
31886 tejbeer 4217
            sb.append("<td style='border:1px solid black;padding: 5px'>" + new DecimalFormat("#.##").format(Math.abs(amount)) + "</td>");
33161 ranu 4218
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoRbmReportingModelMap.get(entry.getFofoId()).getL1Manager() + "</td>");
4219
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoRbmReportingModelMap.get(entry.getFofoId()).getL2Manager() + "</td>");
4220
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoReportingModelMap.get(entry.getFofoId()).getTerritoryManager() + "</td>");
4221
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoReportingModelMap.get(entry.getFofoId()).getRegionalManager() + "</td>");
35521 amit 4222
            sb.append("<td style='border:1px solid black;padding: 5px'>" + df.format(sdCreditRequirement.getLimit()) + "</td>");
31697 amit.gupta 4223
            sb.append("</tr>");
4224
        }
31397 tejbeer 4225
 
31697 amit.gupta 4226
        sb.append("</tbody></table></body></html>");
31397 tejbeer 4227
 
31697 amit.gupta 4228
        return sb.toString();
4229
    }
31397 tejbeer 4230
 
32307 amit.gupta 4231
    public void notifyLoanDueDateCross() throws Exception {
31397 tejbeer 4232
 
35111 ranu 4233
        List<Loan> dueDateCrossLoans = sdCreditService.getDueDateCrossLoan();
4234
        List<Loan> allActiveLoans = sdCreditService.getAllActiveLoan();
31697 amit.gupta 4235
        if (!dueDateCrossLoans.isEmpty()) {
35521 amit 4236
            this.sendDueDateCrossLoanAlert(dueDateCrossLoans, allActiveLoans);
31697 amit.gupta 4237
        }
31397 tejbeer 4238
 
31697 amit.gupta 4239
    }
31397 tejbeer 4240
 
35521 amit 4241
    private void sendDueDateCrossLoanAlert(List<Loan> dueDateCrossLoans, List<Loan> allActiveLoans) throws Exception {
4242
        List<Integer> categoryIds = Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_CATEGORY, ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_ABM, ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS, ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT);
31397 tejbeer 4243
 
35115 ranu 4244
        for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false).entrySet()) {
33631 tejus.loha 4245
            List<Loan> filteredRows = new ArrayList<>();
31697 amit.gupta 4246
            for (Loan loan : dueDateCrossLoans) {
30936 tejbeer 4247
 
31697 amit.gupta 4248
                if (storeGuyEntry.getValue().contains(loan.getFofoId())) {
30982 tejbeer 4249
 
31697 amit.gupta 4250
                    filteredRows.add(loan);
4251
                }
4252
            }
35111 ranu 4253
 
35112 ranu 4254
            List<Loan> filteredAllActiveLoans = new ArrayList<>();
35111 ranu 4255
            for (Loan loan : allActiveLoans) {
4256
 
4257
                if (storeGuyEntry.getValue().contains(loan.getFofoId())) {
4258
 
35112 ranu 4259
                    filteredAllActiveLoans.add(loan);
35111 ranu 4260
                }
4261
            }
4262
 
35112 ranu 4263
            ByteArrayOutputStream byteArrayOutputStream = null;
4264
            Utils.Attachment attachment1 = null;
35521 amit 4265
            if (!filteredAllActiveLoans.isEmpty()) {
4266
                byteArrayOutputStream = this.generateLoanCsv(filteredAllActiveLoans);
4267
                attachment1 = new Utils.Attachment("partnner-credit.csv", new ByteArrayResource(byteArrayOutputStream.toByteArray()));
35111 ranu 4268
 
4269
            }
4270
 
4271
 
31697 amit.gupta 4272
            if (!filteredRows.isEmpty()) {
4273
                String messageText = this.getMessageForDueDateCross(filteredRows);
33628 tejus.loha 4274
                String[] email = new String[]{storeGuyEntry.getKey()};
30982 tejbeer 4275
 
35521 amit 4276
                if (attachment1 != null) {
35112 ranu 4277
                    Utils.sendMailWithAttachments(googleMailSender, email, null, null, "Partner Credit Report", messageText, true, attachment1);
35521 amit 4278
                } else {
4279
                    this.sendMailOfHtmlFormat(googleMailSender, email, messageText, null, "Due Date Cross");
30936 tejbeer 4280
 
35521 amit 4281
                }
4282
 
31697 amit.gupta 4283
            }
30936 tejbeer 4284
 
35115 ranu 4285
        }
35113 ranu 4286
 
4287
        String messageText = this.getMessageForDueDateCross(dueDateCrossLoans);
4288
        ByteArrayOutputStream byteArrayOutputStream = this.generateLoanCsv(allActiveLoans);
4289
        Utils.Attachment attachment = null;
35521 amit 4290
        if (byteArrayOutputStream != null) {
4291
            attachment = new Utils.Attachment("partnner-credit.csv", new ByteArrayResource(byteArrayOutputStream.toByteArray()));
35113 ranu 4292
 
31697 amit.gupta 4293
        }
33628 tejus.loha 4294
 
35521 amit 4295
        if (attachment != null) {
35115 ranu 4296
            Utils.sendMailWithAttachments(googleMailSender, new String[]{"sdtech@smartdukaan.com"}, null, null, "Partner Credit Report", messageText, true, attachment);
35521 amit 4297
        } else {
35115 ranu 4298
            this.sendMailOfHtmlFormat(googleMailSender, new String[]{"sdtech@smartdukaan.com"}, messageText, null, "Due Date Cross");
35113 ranu 4299
        }
33628 tejus.loha 4300
 
35111 ranu 4301
 
31697 amit.gupta 4302
        if (!dueDateCrossLoans.isEmpty()) {
4303
            for (Loan loan : dueDateCrossLoans) {
30936 tejbeer 4304
 
31697 amit.gupta 4305
                long noOfdaysBetween = ChronoUnit.DAYS.between(loan.getDueDate().toLocalDate(), LocalDate.now());
30989 tejbeer 4306
 
31697 amit.gupta 4307
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(loan.getFofoId());
30989 tejbeer 4308
 
31697 amit.gupta 4309
                Address address = addressRepository.selectById(user.getAddressId());
30982 tejbeer 4310
 
31697 amit.gupta 4311
                LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
30982 tejbeer 4312
 
31697 amit.gupta 4313
                List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
30936 tejbeer 4314
 
31886 tejbeer 4315
                double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30936 tejbeer 4316
 
31697 amit.gupta 4317
                String url = "http://app.smartdukaan.com/pages/home/credit";
30936 tejbeer 4318
 
31697 amit.gupta 4319
                String title = "Alert!";
34729 amit.gupta 4320
                String message = "Your Outstanding Credit Payment due date " + loan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy")) + " has been exceeded. Additional penal interest of " + loan.getInterestRate().setScale(2, RoundingMode.HALF_UP) + "% shall be levied on daily basis. Your total pending loan amount is Rs." + FormattingUtils.formatDecimal(Math.abs(amount)) + ". !!Pay Now!!";
30936 tejbeer 4321
 
31886 tejbeer 4322
                notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title, message, url);
30936 tejbeer 4323
 
32841 amit.gupta 4324
                //notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 4325
 
31697 amit.gupta 4326
            }
4327
        }
30982 tejbeer 4328
 
31697 amit.gupta 4329
    }
30936 tejbeer 4330
 
35112 ranu 4331
    private ByteArrayOutputStream generateLoanCsv(List<Loan> loans) throws ProfitMandiBusinessException {
4332
        org.apache.commons.io.output.ByteArrayOutputStream byteArrayOutputStream = null;
4333
 
4334
 
4335
        if (!loans.isEmpty()) {
4336
            Map<Integer, com.spice.profitmandi.dao.model.FofoReportingModel> fofoReportingModelMap = csService.getPartnerIdSalesHeaders();
4337
            Map<Integer, FofoRBMReportingModel> fofoRbmReportingModelMap = csService.getPartnerIdRBMHeaders();
4338
            List<AST> asts = astRepository.selectAll();
4339
            Map<Integer, AST> astMap = asts.stream()
4340
                    .collect(Collectors.toMap(AST::getId, ast -> ast));
4341
            try {
4342
                List<String> headers = Arrays.asList(
4343
                        "PartnerName", "State Name", "Area", "Territory",
4344
                        "Due Date", "Days", "Pending Amount",
4345
                        "RBM L2", "RBM L1", "Sales L1", "Sales L2", "Limit Assigned"
4346
                );
4347
 
4348
                List<List<?>> rows = new ArrayList<>();
4349
 
4350
                for (Loan entry : loans) {
4351
 
4352
                    List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(entry.getId());
4353
                    double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
4354
 
35114 ranu 4355
//                    long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getDueDate().toLocalDate(), LocalDateTime.now());
4356
                    long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getCreatedOn().toLocalDate(), LocalDateTime.now());
35112 ranu 4357
 
4358
                    CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
4359
                    SDCreditRequirement sdCreditRequirement = sdCreditRequirementRepository.selectByFofoId(customRetailer.getPartnerId());
4360
                    DecimalFormat df = new DecimalFormat("#.##");
4361
                    List<String> row = Arrays.asList(
4362
                            customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")",
4363
                            customRetailer.getAddress().getState(),
4364
                            astMap.get(customRetailer.getAstId()).getArea(),
4365
                            astMap.get(customRetailer.getAstId()).getTerritory(),
4366
                            entry.getDueDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")),
4367
                            String.valueOf(noOfdaysBetween),
4368
                            df.format(Math.abs(amount)),
4369
                            fofoRbmReportingModelMap.get(entry.getFofoId()).getL1Manager(),
4370
                            fofoRbmReportingModelMap.get(entry.getFofoId()).getL2Manager(),
4371
                            fofoReportingModelMap.get(entry.getFofoId()).getTerritoryManager(),
4372
                            fofoReportingModelMap.get(entry.getFofoId()).getRegionalManager(),
4373
                            df.format(sdCreditRequirement.getLimit())
4374
                    );
4375
 
4376
                    rows.add(row);
4377
                }
4378
 
4379
                byteArrayOutputStream = FileUtil.getCSVByteStream(headers, rows);
4380
 
4381
 
4382
            } catch (Exception e) {
4383
                throw new RuntimeException(e);
4384
            }
4385
 
4386
        }
4387
        return byteArrayOutputStream;
4388
    }
4389
 
4390
 
32307 amit.gupta 4391
    public void alertForDueDate() throws Exception {
30936 tejbeer 4392
 
31697 amit.gupta 4393
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30936 tejbeer 4394
 
31697 amit.gupta 4395
        if (!loans.isEmpty()) {
4396
            for (Loan loan : loans) {
30936 tejbeer 4397
 
31697 amit.gupta 4398
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(loan.getFofoId());
30936 tejbeer 4399
 
31697 amit.gupta 4400
                Address address = addressRepository.selectById(user.getAddressId());
30936 tejbeer 4401
 
31697 amit.gupta 4402
                long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), loan.getDueDate().toLocalDate());
30936 tejbeer 4403
 
31697 amit.gupta 4404
                LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
30982 tejbeer 4405
 
31697 amit.gupta 4406
                if (noOfdaysBetween <= 4 && noOfdaysBetween >= 0) {
4407
                    List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
31886 tejbeer 4408
                    double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30936 tejbeer 4409
 
31697 amit.gupta 4410
                    String title = "Alert!";
4411
                    String url = "http://app.smartdukaan.com/pages/home/credit";
4412
                    String message = null;
4413
                    if (noOfdaysBetween == 0) {
30936 tejbeer 4414
 
34729 amit.gupta 4415
                        message = "Your total outstanding Credit amount is Rs." + FormattingUtils.formatDecimal(Math.abs(amount)) + " is due for Today, Pay Now!!";
30982 tejbeer 4416
 
31697 amit.gupta 4417
                    } else {
30982 tejbeer 4418
 
34729 amit.gupta 4419
                        message = "Your total outstanding Credit amount is Rs." + FormattingUtils.formatDecimal(Math.abs(amount)) + " is due by " + loan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy")) + " , Pay Now!!";
30982 tejbeer 4420
 
31697 amit.gupta 4421
                    }
31886 tejbeer 4422
                    notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title, message, url);
32841 amit.gupta 4423
                    //notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 4424
 
31697 amit.gupta 4425
                }
4426
            }
4427
        }
30984 tejbeer 4428
 
31697 amit.gupta 4429
    }
30982 tejbeer 4430
 
32307 amit.gupta 4431
    public void userMobileNumberOptIn() throws Exception {
30982 tejbeer 4432
 
31697 amit.gupta 4433
        List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
30982 tejbeer 4434
 
31886 tejbeer 4435
        List<com.spice.profitmandi.dao.entity.user.User> users = userUserRepository.selectByIds(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
30982 tejbeer 4436
 
31886 tejbeer 4437
        List<Address> addresses = addressRepository.selectByIds(users.stream().map(x -> x.getAddressId()).collect(Collectors.toList()));
30982 tejbeer 4438
 
31697 amit.gupta 4439
        LOGGER.info("addresses" + addresses);
30984 tejbeer 4440
 
31697 amit.gupta 4441
        for (Address address : addresses) {
32307 amit.gupta 4442
            notificationService.optIn(address.getPhoneNumber());
30982 tejbeer 4443
 
31697 amit.gupta 4444
        }
30982 tejbeer 4445
 
31697 amit.gupta 4446
    }
30982 tejbeer 4447
 
31697 amit.gupta 4448
    public void authUserMobileNumberOptIn() throws HttpHostConnectException, ProfitMandiBusinessException {
31206 tejbeer 4449
 
31697 amit.gupta 4450
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
4451
        LOGGER.info("authUsers" + authUsers);
31206 tejbeer 4452
 
31697 amit.gupta 4453
        for (AuthUser authUser : authUsers) {
4454
            Map<String, String> requestheaders = new HashMap<>();
4455
            requestheaders.put("Content-Type", "application/x-www-form-urlencoded");
4456
            Map<String, String> requestParams = new HashMap<>();
4457
            requestParams.put("userid", String.valueOf(2000215976));
4458
            requestParams.put("password", "MFRd!BBL");
4459
            requestParams.put("phone_number", authUser.getMobileNumber());
4460
            requestParams.put("auth_scheme", "plain");
4461
            requestParams.put("v", "1.1");
4462
            requestParams.put("format", "json");
31206 tejbeer 4463
 
31697 amit.gupta 4464
            requestParams.put("method", "OPT_IN");
31206 tejbeer 4465
 
31697 amit.gupta 4466
            requestParams.put("channel", "WHATSAPP");
31886 tejbeer 4467
            String response = restClient.get("https://media.smsgupshup.com/GatewayAPI/rest", requestParams, requestheaders);
31697 amit.gupta 4468
            LOGGER.info("response" + response);
4469
        }
31206 tejbeer 4470
 
31697 amit.gupta 4471
    }
31206 tejbeer 4472
 
31697 amit.gupta 4473
    @Autowired
4474
    private HygieneDataRepository hygieneDataRepository;
31209 tejbeer 4475
 
31697 amit.gupta 4476
    public void hygineAlertForPartner() throws ProfitMandiBusinessException, MessagingException, IOException {
31206 tejbeer 4477
 
31697 amit.gupta 4478
        List<String> remarks = new ArrayList<>();
4479
        remarks.add("Out of Service");
4480
        remarks.add("Duplicate number");
4481
        remarks.add("Partner number");
31886 tejbeer 4482
        List<HygieneData> hygieneData = hygieneDataRepository.selectAllByDisposedDateAndRemark(LocalDate.now(), remarks);
31206 tejbeer 4483
 
31697 amit.gupta 4484
        if (!hygieneData.isEmpty()) {
31206 tejbeer 4485
 
31886 tejbeer 4486
            Map<Integer, List<HygieneData>> partnerHygieneDataMap = hygieneData.stream().collect(groupingBy(x -> x.getFofoId()));
31206 tejbeer 4487
 
31697 amit.gupta 4488
            for (Entry<Integer, List<HygieneData>> partnerHygieneDataMapEntry : partnerHygieneDataMap.entrySet()) {
31206 tejbeer 4489
 
31697 amit.gupta 4490
                CustomRetailer customRetailer = retailerService.getFofoRetailer(partnerHygieneDataMapEntry.getKey());
31206 tejbeer 4491
 
31697 amit.gupta 4492
                StringBuilder sb = new StringBuilder();
31886 tejbeer 4493
                sb.append("<html><body><p>Dear Partner," + "</p><br/><p>It has been observed in our calls to the respective customers that the contact no is either not correct or does not have incoming calls.\n"
31206 tejbeer 4494
 
31886 tejbeer 4495
                        + " </p>" + "<p>We would like to inform you that this will hinder all our marketing initiatives to bring this customer back to our smartdukaan or cross sell any product from your inventory." + "</p><p>Kindly ensure going forward that the details are correct so to avoid 1% margin loss.\n" + "</p><p>In case the data is found to be incorrect there is a loss of 1% margin on this sales under SmartDukaan hygiene guidelines.\n" + "				" + "</p>"
31206 tejbeer 4496
 
31697 amit.gupta 4497
                        + "<br/><table style='border:1px solid black ;padding: 5px';>");
4498
                sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4499
                sb.append("<th style='border:1px solid black;padding: 5px'>Invoice Number</th>\n");
4500
                sb.append("<th style='border:1px solid black;padding: 5px'>Customer Name</th>\n");
4501
                sb.append("<th style='border:1px solid black;padding: 5px'>Customer Number</th>\n");
4502
                sb.append("</tr>\n");
31206 tejbeer 4503
 
31697 amit.gupta 4504
                List<HygieneData> hygienes = partnerHygieneDataMapEntry.getValue();
31206 tejbeer 4505
 
31697 amit.gupta 4506
                List<Integer> orderIds = hygienes.stream().map(x -> x.getOrderId()).collect(Collectors.toList());
31206 tejbeer 4507
 
31697 amit.gupta 4508
                List<FofoOrder> fofoOrders = fofoOrderRepository.selectAllByOrderIds(orderIds);
31206 tejbeer 4509
 
31697 amit.gupta 4510
                for (FofoOrder fofoOrder : fofoOrders) {
4511
                    Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
4512
                    sb.append("<tr>");
31886 tejbeer 4513
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoOrder.getInvoiceNumber() + "</td>\n");
4514
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customer.getFirstName() + "" + customer.getLastName() + "</td>\n");
4515
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customer.getMobileNumber() + "</td>\n");
31206 tejbeer 4516
 
31697 amit.gupta 4517
                    sb.append("</tr>\n");
4518
                }
31206 tejbeer 4519
 
31697 amit.gupta 4520
                sb.append("</tbody></table></body></html>");
4521
                String subject = "Customer Info - Hygiene Alert";
31206 tejbeer 4522
 
32350 amit.gupta 4523
                this.sendMailOfHtmlFormat(mailSender, new String[]{customRetailer.getEmail()}, sb.toString(), null, subject);
31206 tejbeer 4524
 
31697 amit.gupta 4525
            }
31206 tejbeer 4526
 
31697 amit.gupta 4527
        }
31206 tejbeer 4528
 
31697 amit.gupta 4529
    }
31206 tejbeer 4530
 
33046 amit.gupta 4531
    //
4532
    public void setInventoryItemIdToPriceDropImei() {
4533
        List<PriceDropIMEI> priceDropIMEIList = priceDropIMEIRepository.selectAllMissingInventoryItemIds();
4534
        LOGGER.info("Problems with - {} entries", priceDropIMEIList.size());
4535
        //priceDropIMEIList.stream().collect(C)
4536
        for (PriceDropIMEI priceDropIMEI : priceDropIMEIList) {
4537
            System.out.println(priceDropIMEI.getImei());
4538
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectAllBySerialNumberFofoId(priceDropIMEI.getImei(), priceDropIMEI.getPartnerId());
33051 amit.gupta 4539
            if (inventoryItems.size() == 0) {
33046 amit.gupta 4540
                LOGGER.info("Could not find Grn - FofoID {} , Imei {} ", priceDropIMEI);
33051 amit.gupta 4541
            } else if (inventoryItems.size() > 1) {
33046 amit.gupta 4542
                LOGGER.info("Found 2 such instance for - FofoID {} , Imei {} ", priceDropIMEI.getImei(), priceDropIMEI.getPartnerId());
4543
            } else {
4544
                priceDropIMEI.setInventoryItemId(inventoryItems.get(0).getId());
4545
            }
4546
 
4547
        }
4548
    }
4549
 
33051 amit.gupta 4550
    @Autowired
4551
    SaholicReservationSnapshotRepository saholicReservationSnapshotRepository;
4552
 
33256 amit.gupta 4553
    public void removePartialBillingForTransaction(int transactionId) throws ProfitMandiBusinessException {
35424 amit 4554
        // Fetch with pessimistic lock to prevent concurrent modifications
4555
        List<Order> orderList = orderRepository.selectAllByTransactionIdForUpdate(transactionId);
33051 amit.gupta 4556
        Map<Integer, Order> orderMap = orderList.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
4557
        //Delete scanRecords
4558
        List<WarehouseScan> warehouseScans = warehouseScanRepository.selectAllByOrderIds(new ArrayList<>(orderMap.keySet()));
4559
        for (WarehouseScan warehouseScan : warehouseScans) {
4560
            warehouseScanRepository.delete(warehouseScan);
4561
            WarehouseInventoryItem warehouseInventoryItem = warehouseInventoryItemRepository.selectById(warehouseScan.getInventoryItemId());
4562
            warehouseInventoryItem.setLastScanType(in.shop2020.warehouse.ScanType.PURCHASE);
4563
            warehouseInventoryItem.setCurrentQuantity(warehouseInventoryItem.getCurrentQuantity() + warehouseScan.getQuantity());
4564
        }
4565
 
4566
        for (Order order : orderList) {
33078 ranu 4567
            if (order.getBillingTimestamp() != null) {
33056 amit.gupta 4568
                order.setStatus(OrderStatus.ACCEPTED);
4569
                order.setStatusDescription("Submitted for Processing");
4570
                order.setBillingTimestamp(null);
4571
                order.setBilledBy(null);
33057 amit.gupta 4572
                order.setSerialNumber(null);
33056 amit.gupta 4573
                order.setJacketNumber(null);
33060 amit.gupta 4574
                order.getLineItem().setSerialNumber(null);
33056 amit.gupta 4575
                List<LineItemImei> lineItemImeis = lineItemImeisRepository.selectByLineItemId(order.getLineItem().getId());
4576
                for (LineItemImei lineItemImei : lineItemImeis) {
4577
                    lineItemImeisRepository.delete(lineItemImei);
4578
                }
4579
                SaholicReservationSnapshot saholicReservationSnapshot = saholicReservationSnapshotRepository
4580
                        .selectByOrderId(order.getId());
4581
                if (saholicReservationSnapshot == null) {
4582
                    saholicInventoryService.addReservationCount(order.getLineItem().getItemId(),
4583
                            order.getFulfilmentWarehouseId(), order.getLineItem().getQuantity(), order.getId());
4584
                }
33055 amit.gupta 4585
            }
33051 amit.gupta 4586
        }
4587
    }
4588
 
31697 amit.gupta 4589
    public void hygineAlertForInternalTeam() throws ProfitMandiBusinessException, MessagingException, IOException {
31206 tejbeer 4590
 
31697 amit.gupta 4591
        List<String> remarks = new ArrayList<>();
4592
        remarks.add("Out of Service");
4593
        remarks.add("Duplicate number");
4594
        remarks.add("Partner number");
31886 tejbeer 4595
        List<HygieneData> hygieneDataLastThreeMonth = hygieneDataRepository.selectDisposedDateAndRemarks(
4596
                LocalDate.now().withDayOfMonth(1).minusMonths(3).atStartOfDay(), LocalDate.now().minusMonths(1).withDayOfMonth(LocalDate.now().minusMonths(1).lengthOfMonth()).atTime(LocalTime.MAX), remarks);
31206 tejbeer 4597
 
31886 tejbeer 4598
        List<HygieneData> hygieneDataRecentMonth = hygieneDataRepository.selectDisposedDateAndRemarks(LocalDate.now().withDayOfMonth(1), remarks);
31697 amit.gupta 4599
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
4600
        Map<Integer, List<HygieneData>> partnerHygieneLastThreeMonthMap = null;
31206 tejbeer 4601
 
31697 amit.gupta 4602
        Map<Integer, List<HygieneData>> partnerHygieneDataRecentMonth = null;
31206 tejbeer 4603
 
31697 amit.gupta 4604
        if (!hygieneDataLastThreeMonth.isEmpty()) {
31886 tejbeer 4605
            partnerHygieneLastThreeMonthMap = hygieneDataLastThreeMonth.stream().collect(groupingBy(x -> x.getFofoId()));
31206 tejbeer 4606
 
31697 amit.gupta 4607
        }
31206 tejbeer 4608
 
31697 amit.gupta 4609
        if (!hygieneDataRecentMonth.isEmpty()) {
31886 tejbeer 4610
            partnerHygieneDataRecentMonth = hygieneDataRecentMonth.stream().collect(groupingBy(x -> x.getFofoId()));
31697 amit.gupta 4611
        }
31206 tejbeer 4612
 
31697 amit.gupta 4613
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
31206 tejbeer 4614
 
31697 amit.gupta 4615
            String email = storeGuyEntry.getKey();
31206 tejbeer 4616
 
31697 amit.gupta 4617
            List<Integer> fofoIds = new ArrayList<>(storeGuyEntry.getValue());
31206 tejbeer 4618
 
31697 amit.gupta 4619
            Map<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthData = new HashMap<>();
4620
            Map<Integer, Map<LocalDate, List<HygieneData>>> partnerDateWiseData = new HashMap<>();
4621
            for (Integer fofoId : fofoIds) {
31206 tejbeer 4622
 
31697 amit.gupta 4623
                partnerYearMonthData.put(fofoId, null);
4624
                partnerDateWiseData.put(fofoId, null);
4625
                if (!partnerHygieneLastThreeMonthMap.isEmpty()) {
4626
                    List<HygieneData> hygienes = partnerHygieneLastThreeMonthMap.get(fofoId);
31206 tejbeer 4627
 
31697 amit.gupta 4628
                    if (hygienes != null) {
31886 tejbeer 4629
                        Map<YearMonth, List<HygieneData>> yearMonthData = hygienes.stream().collect(groupingBy(x -> YearMonth.from(x.getDisposedTimestamp())));
31206 tejbeer 4630
 
31697 amit.gupta 4631
                        partnerYearMonthData.put(fofoId, yearMonthData);
31206 tejbeer 4632
 
31697 amit.gupta 4633
                    }
4634
                    List<HygieneData> dateWiseHygienes = partnerHygieneDataRecentMonth.get(fofoId);
31206 tejbeer 4635
 
31697 amit.gupta 4636
                    if (dateWiseHygienes != null) {
31206 tejbeer 4637
 
31886 tejbeer 4638
                        Map<LocalDate, List<HygieneData>> dateWiseData = hygienes.stream().collect(groupingBy(x -> (x.getDisposedTimestamp()).toLocalDate()));
31206 tejbeer 4639
 
31697 amit.gupta 4640
                        partnerDateWiseData.put(fofoId, dateWiseData);
31206 tejbeer 4641
 
31697 amit.gupta 4642
                    }
31206 tejbeer 4643
 
31697 amit.gupta 4644
                }
31206 tejbeer 4645
 
31697 amit.gupta 4646
            }
31206 tejbeer 4647
 
31697 amit.gupta 4648
            String subject = "Customer Info - Hygiene Alert";
31206 tejbeer 4649
 
31697 amit.gupta 4650
            LOGGER.info("hygieneData {}", partnerDateWiseData.values());
31206 tejbeer 4651
 
31697 amit.gupta 4652
            boolean partnerDateWise = partnerDateWiseData.values().stream().allMatch(Objects::isNull);
31206 tejbeer 4653
 
31697 amit.gupta 4654
            boolean partnerYearMonth = partnerYearMonthData.values().stream().allMatch(Objects::isNull);
31206 tejbeer 4655
 
31697 amit.gupta 4656
            if (!partnerDateWise && !partnerYearMonth) {
4657
                String sb = this.getMessageHygieneAlertForPartner(partnerYearMonthData, partnerDateWiseData);
32350 amit.gupta 4658
                this.sendMailOfHtmlFormat(googleMailSender, new String[]{email}, sb, null, subject);
31697 amit.gupta 4659
            }
31206 tejbeer 4660
 
31697 amit.gupta 4661
        }
31206 tejbeer 4662
 
31697 amit.gupta 4663
    }
31206 tejbeer 4664
 
31697 amit.gupta 4665
    private String getMessageHygieneAlertForPartner(
33256 amit.gupta 4666
            Map<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthData, Map<Integer, Map<LocalDate, List<HygieneData>>> partnerDateWiseData)
4667
            throws ProfitMandiBusinessException {
31206 tejbeer 4668
 
31697 amit.gupta 4669
        Map<Integer, CustomRetailer> customeRetailerMap = retailerService.getAllFofoRetailers();
31206 tejbeer 4670
 
31697 amit.gupta 4671
        LocalDateTime startDate = LocalDate.now().withDayOfMonth(1).atStartOfDay();
4672
        LocalDateTime endDate = LocalDateTime.now();
31206 tejbeer 4673
 
31697 amit.gupta 4674
        LocalDateTime startYearMonth = LocalDate.now().withDayOfMonth(1).minusMonths(3).atStartOfDay();
31886 tejbeer 4675
        LocalDateTime endYearMonth = LocalDate.now().minusMonths(1).withDayOfMonth(LocalDate.now().minusMonths(1).lengthOfMonth()).atTime(LocalTime.MAX);
31206 tejbeer 4676
 
31697 amit.gupta 4677
        DateTimeFormatter dateYearMonthFormatter = DateTimeFormatter.ofPattern("MMM''uu");
31206 tejbeer 4678
 
31697 amit.gupta 4679
        List<YearMonth> yearMonthRange = new ArrayList<>();
4680
        yearMonthRange.add(YearMonth.from(startYearMonth));
31206 tejbeer 4681
 
31697 amit.gupta 4682
        yearMonthRange.add(YearMonth.from(startYearMonth.plusMonths(1)));
31206 tejbeer 4683
 
31697 amit.gupta 4684
        yearMonthRange.add(YearMonth.from(endYearMonth));
31206 tejbeer 4685
 
31697 amit.gupta 4686
        long noOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate.plusDays(1));
31206 tejbeer 4687
 
31886 tejbeer 4688
        List<LocalDate> dateRange = Stream.iterate(startDate.toLocalDate(), date -> date.plusDays(1)).limit(noOfDaysBetween).collect(Collectors.toList());
31206 tejbeer 4689
 
31697 amit.gupta 4690
        StringBuilder sb = new StringBuilder();
31886 tejbeer 4691
        sb.append("<html><body><p>Hi," + "</p><br/><p>Kindly advise below mentioned partner to input correct details in the system else this will hinder all our marketing initiatives to bring this customer back to our smartdukaan or cross sell any product from partner's inventory.\n" + " </p>" + "<p>Kindly ensure going forward that the details are correct so to avoid 1% margin loss.\n" + "</p><p>In case the data is found to be incorrect there is a loss of 1% margin on this sales under SmartDukaan hygiene guidelines.\n</p>"
31206 tejbeer 4692
 
31697 amit.gupta 4693
                + "<table style='border:1px solid black ;padding: 5px';>");
4694
        sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4695
        sb.append("<th style='border:1px solid black;padding: 5px'>Partner Name</th>\n");
31206 tejbeer 4696
 
31697 amit.gupta 4697
        for (YearMonth yearMonth : yearMonthRange) {
31886 tejbeer 4698
            sb.append("<th style='border:1px solid black;padding: 5px'>" + yearMonth.format(dateYearMonthFormatter) + "</th>\n");
31697 amit.gupta 4699
        }
31206 tejbeer 4700
 
31697 amit.gupta 4701
        for (LocalDate localDate : dateRange) {
4702
            sb.append("<th style='border:1px solid black;padding: 5px'>" + localDate + "</th>\n");
4703
        }
31206 tejbeer 4704
 
31697 amit.gupta 4705
        sb.append("</tr>\n");
31206 tejbeer 4706
 
31886 tejbeer 4707
        for (Entry<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthEntry : partnerYearMonthData.entrySet()) {
31206 tejbeer 4708
 
31697 amit.gupta 4709
            int fofoId = partnerYearMonthEntry.getKey();
31206 tejbeer 4710
 
31697 amit.gupta 4711
            Map<YearMonth, List<HygieneData>> yearMonthData = partnerYearMonthEntry.getValue();
31206 tejbeer 4712
 
31697 amit.gupta 4713
            Map<LocalDate, List<HygieneData>> dateWiseData = partnerDateWiseData.get(fofoId);
31206 tejbeer 4714
 
31697 amit.gupta 4715
            if (yearMonthData == null && dateWiseData == null) {
4716
                continue;
4717
            }
31206 tejbeer 4718
 
31697 amit.gupta 4719
            sb.append("<tr>");
31886 tejbeer 4720
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customeRetailerMap.get(fofoId).getBusinessName() + "</td>\n");
31697 amit.gupta 4721
            for (YearMonth yearMonth : yearMonthRange) {
31206 tejbeer 4722
 
31697 amit.gupta 4723
                if (yearMonthData == null) {
4724
                    sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4725
 
31697 amit.gupta 4726
                } else {
4727
                    List<HygieneData> hygieneList = yearMonthData.get(yearMonth);
31206 tejbeer 4728
 
31697 amit.gupta 4729
                    if (hygieneList != null) {
4730
                        sb.append("<td style='border:1px solid black;padding: 5px'>" + hygieneList.size() + "</td>\n");
31206 tejbeer 4731
 
31697 amit.gupta 4732
                    } else {
4733
                        sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4734
 
31697 amit.gupta 4735
                    }
4736
                }
4737
            }
31206 tejbeer 4738
 
31697 amit.gupta 4739
            for (LocalDate localDate : dateRange) {
31206 tejbeer 4740
 
31697 amit.gupta 4741
                if (dateWiseData == null) {
4742
                    sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4743
 
31697 amit.gupta 4744
                } else {
4745
                    List<HygieneData> hygieneList = dateWiseData.get(localDate);
31206 tejbeer 4746
 
31697 amit.gupta 4747
                    if (hygieneList != null) {
4748
                        sb.append("<td style='border:1px solid black;padding: 5px'>" + hygieneList.size() + "</td>\n");
31218 tejbeer 4749
 
31697 amit.gupta 4750
                    } else {
4751
                        sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31218 tejbeer 4752
 
31697 amit.gupta 4753
                    }
4754
                }
4755
            }
4756
            sb.append("</tr>");
31218 tejbeer 4757
 
31697 amit.gupta 4758
        }
31218 tejbeer 4759
 
31697 amit.gupta 4760
        sb.append("</tbody></table></body></html>");
31218 tejbeer 4761
 
31697 amit.gupta 4762
        return sb.toString();
4763
    }
31218 tejbeer 4764
 
33874 ranu 4765
    @Autowired
4766
    private MonthlyTargetRepository monthlyTargetRepository;
31218 tejbeer 4767
 
31697 amit.gupta 4768
    public void monthlyTargetForPartner() throws MessagingException, ProfitMandiBusinessException, IOException {
31218 tejbeer 4769
 
31697 amit.gupta 4770
        LocalDateTime curDate = LocalDateTime.now();
4771
        List<MonthlyTarget> monthlyTargets = monthlyTargetRepository.selectByDate(YearMonth.now());
31218 tejbeer 4772
 
31886 tejbeer 4773
        Map<Integer, MonthlyTarget> partnersMonthlyTarget = monthlyTargets.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31218 tejbeer 4774
 
31886 tejbeer 4775
        Map<Integer, Double> secondaryMtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
4776
        Map<Integer, Double> todaytertiary = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate, curDate.with(LocalTime.MAX), 0, false);
31218 tejbeer 4777
 
31697 amit.gupta 4778
        String subject = "Monthly Target Vs Achievement";
31218 tejbeer 4779
 
31697 amit.gupta 4780
        for (Entry<Integer, MonthlyTarget> partnerMonthlyTargetEntry : partnersMonthlyTarget.entrySet()) {
31249 tejbeer 4781
 
31697 amit.gupta 4782
            int fofoId = partnerMonthlyTargetEntry.getKey();
31249 tejbeer 4783
 
31697 amit.gupta 4784
            CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
31249 tejbeer 4785
 
31697 amit.gupta 4786
            Double purchaseTarget = partnerMonthlyTargetEntry.getValue().getPurchaseTarget();
31218 tejbeer 4787
 
31697 amit.gupta 4788
            Double saleTarget = partnerMonthlyTargetEntry.getValue().getSaleTarget();
31218 tejbeer 4789
 
31697 amit.gupta 4790
            if (purchaseTarget > 0) {
4791
                Double purchase = secondaryMtd.get(fofoId);
31249 tejbeer 4792
 
31697 amit.gupta 4793
                if (purchase == null) {
4794
                    purchase = 0.0;
4795
                }
31218 tejbeer 4796
 
31697 amit.gupta 4797
                Double balanceTarget = purchaseTarget - purchase;
31218 tejbeer 4798
 
31697 amit.gupta 4799
                if (balanceTarget <= 0) {
4800
                    balanceTarget = 0.0;
4801
                }
31651 tejbeer 4802
 
31697 amit.gupta 4803
                StringBuilder sb = new StringBuilder();
4804
                sb.append("<html><body><p>Dear Partner,\n");
31886 tejbeer 4805
                sb.append("<p>Pls note your agreed monthly target is Rs." + purchaseTarget + " and your achievement till date is Rs." + purchase + "</p>");
31697 amit.gupta 4806
                sb.append("<p>Pls note that your balance target is Rs." + balanceTarget + "</p>\n");
4807
                sb.append(
32350 amit.gupta 4808
                        "<p>We wish you all the best and we are confident that this focused approach towards our outlet sales will help us take our outlet to the best SmartDukaan in your city.\n" + "</p>\n");
31651 tejbeer 4809
 
32350 amit.gupta 4810
                this.sendMailOfHtmlFormat(mailSender, new String[]{customRetailer.getEmail()}, sb.toString(), null, subject);
31697 amit.gupta 4811
            }
31218 tejbeer 4812
 
31697 amit.gupta 4813
        }
31218 tejbeer 4814
 
31697 amit.gupta 4815
    }
31218 tejbeer 4816
 
33444 ranu 4817
 
34502 amit.gupta 4818
    public void findAllLiveDemoBrandItemsByBillingDate() throws
4819
            MessagingException, ProfitMandiBusinessException, IOException {
33444 ranu 4820
        LocalDateTime endDate = LocalDate.now().atStartOfDay().minusDays(8);
4821
 
4822
        List<LiveDemoOrderLineItemModel> liveDemoOrderLineItemModels = orderRepository.findAllLiveDemoBrandItemsByBillingDate(endDate.minusDays(60), endDate);
4823
        LOGGER.info("liveDemoOrderLineItemModels {}", liveDemoOrderLineItemModels);
4824
        String subject = "Billed Live Demo Model";
4825
        StringBuilder sb = new StringBuilder();
4826
 
4827
        sb.append("<html><body><p>Hi,\n");
4828
        sb.append("<p>Please check live demo billed order :</p>\n" + " <table style='border:1px solid black ;padding: 5px; border-collapse: collapse;'>");
4829
 
4830
        sb.append("<th style='border:1px solid black;padding: 5px'>Item Id</th>\n");
4831
        sb.append("<th style='border:1px solid black;padding: 5px'>Invoice Number</th>\n");
4832
        sb.append("<th style='border:1px solid black;padding: 5px'>Brand</th>\n");
4833
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Number</th>\n");
4834
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Name</th>\n");
4835
        sb.append("<th style='border:1px solid black;padding: 5px'>Serial Number</th>\n");
4836
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer Name</th>\n");
4837
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer City</th>\n");
4838
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer Pincode</th>\n");
4839
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer State</th>\n");
4840
        sb.append("<th style='border:1px solid black;padding: 5px'>Billing Date</th>\n");
4841
        sb.append("</tr>\n");
4842
        for (LiveDemoOrderLineItemModel liveDemoModel : liveDemoOrderLineItemModels) {
4843
            sb.append("<tr>");
4844
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getItemId() + "</td>\n");
4845
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getInvoiceNumber() + "</td>\n");
4846
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getBrand() + "</td>\n");
4847
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getModelNumber() + "</td>\n");
4848
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getModelName() + "</td>\n");
4849
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getSerialNumber() + "</td>\n");
4850
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getRetailerName() + "</td>\n");
4851
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getRetailerCity() + "</td>\n");
4852
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getRetailerPincode() + "</td>\n");
4853
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getState() + "</td>\n");
4854
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getFormattedBillingDate() + "</td>\n");
4855
 
4856
            sb.append("</tr>\n");
4857
 
33506 amit.gupta 4858
        }
33444 ranu 4859
        List<String> sendTo = Arrays.asList("kamini.sharma@smartdukaan.com", "niranjan.kala@smartdukaan.com",
33506 amit.gupta 4860
                "mohit.gulati@smartdukaan.com", "vinay.p@smartdukaan.com", "shivam.gupta@smartdukaan.com");
33444 ranu 4861
 
4862
 
4863
        String[] email = sendTo.toArray(new String[sendTo.size()]);
4864
        this.sendMailOfHtmlFormat(mailSender, email, sb.toString(), null, subject);
4865
 
4866
    }
4867
 
33464 ranu 4868
    public void findTodayPocoBillingItems() throws MessagingException, ProfitMandiBusinessException, IOException {
4869
        LocalDateTime endDate = LocalDate.now().atStartOfDay().plusDays(1);
4870
        LocalDateTime startDate = LocalDate.now().atStartOfDay().minusDays(1);
33444 ranu 4871
 
33464 ranu 4872
        List<LiveDemoOrderLineItemModel> pocoBillingOrderLineItemModels = orderRepository.findTodayPocoBillingItems(startDate, endDate);
4873
        LOGGER.info("pocoBillingOrderLineItemModels {}", pocoBillingOrderLineItemModels);
4874
        String subject = "Poco Billing";
4875
        StringBuilder sb = new StringBuilder();
4876
 
4877
        sb.append("<html><body><p>Hi,\n");
4878
        sb.append("<p>Please check poco billed order :</p>\n" + " <table style='border:1px solid black ;padding: 5px; border-collapse: collapse;'>");
4879
 
4880
        sb.append("<th style='border:1px solid black;padding: 5px'>Brand</th>\n");
4881
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Number</th>\n");
4882
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Name</th>\n");
4883
        sb.append("<th style='border:1px solid black;padding: 5px'>Serial Number</th>\n");
4884
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer State</th>\n");
4885
        sb.append("<th style='border:1px solid black;padding: 5px'>Billing Date</th>\n");
4886
        sb.append("</tr>\n");
4887
        for (LiveDemoOrderLineItemModel pocoModel : pocoBillingOrderLineItemModels) {
4888
            sb.append("<tr>");
4889
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getBrand() + "</td>\n");
4890
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getModelNumber() + "</td>\n");
4891
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getModelName() + "</td>\n");
4892
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getSerialNumber() + "</td>\n");
4893
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getState() + "</td>\n");
4894
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getFormattedBillingDate() + "</td>\n");
4895
 
4896
            sb.append("</tr>\n");
4897
 
33506 amit.gupta 4898
        }
33664 amit.gupta 4899
        List<String> sendTo = Arrays.asList("uday.singh@smartdukaan.com", "kuldeep.kumar@smartdukaan.com", "nishant.ohri@smartdukaan.com", "ritesh.chauhan1@smartdukaan.com");
33464 ranu 4900
 
4901
        String[] email = sendTo.toArray(new String[sendTo.size()]);
4902
        this.sendMailOfHtmlFormat(mailSender, email, sb.toString(), null, subject);
4903
 
4904
    }
4905
 
4906
 
31697 amit.gupta 4907
    public void monthlyTargetForInternalTeam() throws MessagingException, ProfitMandiBusinessException, IOException {
31218 tejbeer 4908
 
31697 amit.gupta 4909
        LocalDateTime curDate = LocalDateTime.now();
31218 tejbeer 4910
 
34903 ranu 4911
        List<Integer> categoryIds = Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_CATEGORY, ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_ABM, ProfitMandiConstants.TICKET_CATEGORY_MARKETING, ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS, ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT);
31218 tejbeer 4912
 
31697 amit.gupta 4913
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false);
31218 tejbeer 4914
 
31697 amit.gupta 4915
        List<MonthlyTarget> monthlyTargets = monthlyTargetRepository.selectByDate(YearMonth.now());
31218 tejbeer 4916
 
31697 amit.gupta 4917
        Map<Integer, CustomRetailer> customeRetailerMap = retailerService.getAllFofoRetailers();
31218 tejbeer 4918
 
31886 tejbeer 4919
        Map<Integer, MonthlyTarget> partnersMonthlyTarget = monthlyTargets.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31218 tejbeer 4920
 
31886 tejbeer 4921
        Map<Integer, Double> secondaryMtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
4922
        Map<Integer, Double> todaytertiary = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate, curDate.with(LocalTime.MAX), 0, false);
31218 tejbeer 4923
 
31697 amit.gupta 4924
        String subject = "Monthly Target Vs Achievement";
31218 tejbeer 4925
 
31697 amit.gupta 4926
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
31218 tejbeer 4927
 
31697 amit.gupta 4928
            String email = storeGuyEntry.getKey();
31218 tejbeer 4929
 
31697 amit.gupta 4930
            List<Integer> fofoIds = new ArrayList<>(storeGuyEntry.getValue());
4931
            Map<Integer, MonthlyTarget> monthlyTargetAchievement = new HashMap<>();
4932
            for (Integer fofoId : fofoIds) {
31218 tejbeer 4933
 
31697 amit.gupta 4934
                MonthlyTarget monthlyTarget = partnersMonthlyTarget.get(fofoId);
4935
                if (monthlyTarget != null) {
4936
                    Double purchaseTarget = monthlyTarget.getPurchaseTarget();
31218 tejbeer 4937
 
31697 amit.gupta 4938
                    Double saleTarget = monthlyTarget.getSaleTarget();
31218 tejbeer 4939
 
31697 amit.gupta 4940
                    if (purchaseTarget != null && purchaseTarget > 0) {
4941
                        Double purchase = secondaryMtd.get(fofoId);
4942
                        if (purchase == null) {
4943
                            purchase = 0.0;
4944
                        }
4945
                        monthlyTarget.setPurchaseAchievement(purchase);
4946
                        monthlyTargetAchievement.put(fofoId, monthlyTarget);
31218 tejbeer 4947
 
31697 amit.gupta 4948
                    }
4949
                }
4950
            }
31218 tejbeer 4951
 
31697 amit.gupta 4952
            if (!monthlyTargetAchievement.isEmpty()) {
31218 tejbeer 4953
 
31697 amit.gupta 4954
                StringBuilder sb = new StringBuilder();
31218 tejbeer 4955
 
31697 amit.gupta 4956
                sb.append("<html><body><p>Hi,\n");
31886 tejbeer 4957
                sb.append("<p>Pls note your Partners agreed monthly target foolowing are :</p>\n" + " <table style='border:1px solid black ;padding: 5px';>");
31697 amit.gupta 4958
                sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4959
                sb.append("<th style='border:1px solid black;padding: 5px'>Partner Name</th>\n");
31218 tejbeer 4960
 
31697 amit.gupta 4961
                sb.append("<th style='border:1px solid black;padding: 5px'>Purchase Target</th>\n");
31218 tejbeer 4962
 
31697 amit.gupta 4963
                sb.append("<th style='border:1px solid black;padding: 5px'>Purchase Achievement</th>\n");
4964
                sb.append("</tr>\n");
31218 tejbeer 4965
 
31886 tejbeer 4966
                for (Entry<Integer, MonthlyTarget> monthlyTargetAchievementEntry : monthlyTargetAchievement.entrySet()) {
31697 amit.gupta 4967
                    sb.append("<tr>");
4968
                    int fofoId = monthlyTargetAchievementEntry.getKey();
31218 tejbeer 4969
 
31697 amit.gupta 4970
                    MonthlyTarget monthlyTarget = monthlyTargetAchievementEntry.getValue();
31886 tejbeer 4971
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customeRetailerMap.get(fofoId).getBusinessName() + "</td>\n");
31218 tejbeer 4972
 
31886 tejbeer 4973
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + monthlyTarget.getPurchaseTarget() + "</td>\n");
31218 tejbeer 4974
 
31886 tejbeer 4975
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + monthlyTarget.getPurchaseAchievement() + "</td>\n");
31218 tejbeer 4976
 
31697 amit.gupta 4977
                    sb.append("</tr>\n");
31218 tejbeer 4978
 
31697 amit.gupta 4979
                }
31218 tejbeer 4980
 
32350 amit.gupta 4981
                this.sendMailOfHtmlFormat(googleMailSender, new String[]{email}, sb.toString(), null, subject);
31697 amit.gupta 4982
                // this.sendMailOfHtmlFormat("tejbeer.kaur@smartdukaan.com", sb.toString(),
4983
                // null, subject);
31218 tejbeer 4984
 
31697 amit.gupta 4985
            }
31604 tejbeer 4986
 
31697 amit.gupta 4987
        }
31604 tejbeer 4988
 
31697 amit.gupta 4989
    }
31604 tejbeer 4990
 
32061 amit.gupta 4991
    @Autowired
4992
    private PerformanceService performanceService;
4993
 
4994
 
4995
    public void sendFilteredRetailerPerformance() throws Exception {
4996
        RetailerFilterModel retailerFilterModel = performanceService.getRetailerFilterModel();
4997
 
4998
        Map<Integer, CustomRetailer> customRetailers = retailerService.getFofoRetailers(true);
4999
 
5000
 
5001
        List<RetailerPeformanceFilterModel> partnersPerformance = performanceService.getPerformance(retailerFilterModel, customRetailers);
5002
 
5003
        Map<Integer, RetailerPeformanceFilterModel> partnersPerformanceMap = new HashMap<>();
5004
 
5005
        if (!partnersPerformance.isEmpty()) {
5006
            partnersPerformanceMap = partnersPerformance.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
5007
            performanceService.sendPartnerPerformanceEmail(partnersPerformanceMap, retailerFilterModel, customRetailers);
5008
 
5009
        }
5010
 
5011
 
5012
    }
5013
 
32081 tejbeer 5014
    @Autowired
5015
    private VendorItemPricingRepository vendorItemPricingRepository;
32061 amit.gupta 5016
 
32081 tejbeer 5017
 
5018
    @Autowired
5019
    private VendorCatalogPricingService vendorCatalogPricingService;
5020
 
5021
 
33256 amit.gupta 5022
    public void migrateVendorItemPricing() throws ProfitMandiBusinessException {
32081 tejbeer 5023
 
5024
        List<VendorItemPricing> vendorItemPricings = vendorItemPricingRepository.selectAll();
32350 amit.gupta 5025
        LOGGER.info("At migrate VendorItemPricing");
32092 tejbeer 5026
        Map<Integer, Item> items = itemRepository.selectByIds(vendorItemPricings.stream().map(x -> x.getItemId()).collect(Collectors.toSet())).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
32081 tejbeer 5027
        for (VendorItemPricing vendorItemPricing : vendorItemPricings) {
5028
            Item item = null;
32092 tejbeer 5029
            if (items.get(vendorItemPricing.getItemId()) != null) {
5030
                item = items.get(vendorItemPricing.getItemId());
5031
            } else {
32084 tejbeer 5032
                continue;
32081 tejbeer 5033
            }
32092 tejbeer 5034
 
32081 tejbeer 5035
            VendorCatalogPricingModel vendorCatalogPricingModel = new VendorCatalogPricingModel();
5036
            vendorCatalogPricingModel.setCatalogId(item.getCatalogItemId());
5037
            vendorCatalogPricingModel.setAuthId(13);
32088 tejbeer 5038
            vendorCatalogPricingModel.setDp(vendorItemPricing.getDp());
32081 tejbeer 5039
 
5040
            vendorCatalogPricingModel.setTp(vendorItemPricing.getTp());
5041
            vendorCatalogPricingModel.setMop(vendorItemPricing.getMop());
32384 amit.gupta 5042
            vendorCatalogPricingModel.setEffectedOn(LocalDate.of(2023, 8, 22));
32081 tejbeer 5043
            vendorCatalogPricingModel.setVendorId(vendorItemPricing.getVendorId());
5044
 
5045
 
5046
            try {
5047
                vendorCatalogPricingService.createVendorCatalogPricingLog(vendorCatalogPricingModel);
5048
            } catch (ProfitMandiBusinessException e) {
5049
                continue;
5050
            }
5051
 
5052
        }
5053
 
5054
    }
5055
 
5056
    public void approveVendorCatalogPricing() {
5057
        List<VendorCatalogPricingLog> vendorCatalogPricingLogs = vendorCatalogPricingLogRepository.selectByStatus(VendorCatalogPricingStatus.PENDING);
5058
 
32084 tejbeer 5059
 
32081 tejbeer 5060
        for (VendorCatalogPricingLog vendorCatalogPricingLog : vendorCatalogPricingLogs) {
32107 tejbeer 5061
            vendorCatalogPricingLog.setStatus(VendorCatalogPricingStatus.APPROVED);
5062
            vendorCatalogPricingLog.setUpdatedTimestamp(LocalDateTime.now());
5063
            vendorCatalogPricingLog.setApprovedBy(13);
5064
            vendorCatalogPricingLog.setApprovedTimestamp(LocalDateTime.now());
32114 tejbeer 5065
            vendorCatalogPricingService.createVendorCatalogPricing(vendorCatalogPricingLog);
5066
        }
32081 tejbeer 5067
 
32114 tejbeer 5068
    }
32108 tejbeer 5069
 
32822 ranu 5070
    public void sendMailWhatsAppAfterLoanDueDate() throws Exception {
5071
        sdCreditService.updateRisk();
34729 amit.gupta 5072
        List<Loan> defaultLoans = sdCreditService.getDefaultLoans();
32822 ranu 5073
        if (!defaultLoans.isEmpty()) {
5074
            this.sendLoanAlert(defaultLoans);
5075
        }
32108 tejbeer 5076
 
32822 ranu 5077
 
5078
    }
5079
 
5080
    public void sendLoanAlert(List<Loan> defaultLoans) throws
5081
            Exception {
5082
 
5083
        List<Integer> categoryIds = Arrays.asList(
5084
                ProfitMandiConstants.TICKET_CATEGORY_CATEGORY,
5085
                ProfitMandiConstants.TICKET_CATEGORY_RBM,
5086
                ProfitMandiConstants.TICKET_CATEGORY_SALES,
34903 ranu 5087
                ProfitMandiConstants.TICKET_CATEGORY_ABM,
32822 ranu 5088
                ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS,
5089
                ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT);
5090
 
5091
        /*for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false).entrySet()) {
5092
            List<Loan> filteredRows = defaultLoans.stream()
5093
                    .filter(loan -> storeGuyEntry.getValue().contains(loan.getFofoId()))
5094
                    .collect(Collectors.toList());
5095
 
5096
            if (!filteredRows.isEmpty()) {
5097
                for (Loan defaultLoan : filteredRows) {
5098
                    List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
5099
                    double amount = loanStatements.stream().map(LoanStatement::getAmount).collect(Collectors.summingDouble(BigDecimal::doubleValue));
5100
                    String messageText = getMessageForDueDateExtend(defaultLoan,amount);
5101
                   // String[] email = new String[]{storeGuyEntry.getKey()};
33820 ranu 5102
 
32822 ranu 5103
                    sendMailOfHtmlFormat(mailSender, email, messageText, null, subject);
5104
 
5105
                }
5106
            }
5107
        }*/
32842 amit.gupta 5108
        //Send single whatsapp to tv
5109
        String title = "SD Credit Alert!";
32850 amit.gupta 5110
        boolean notYetSent = true;
32822 ranu 5111
        for (Loan defaultLoan : defaultLoans) {
5112
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
5113
 
5114
            double amount = loanStatements.stream().map(LoanStatement::getAmount).collect(Collectors.summingDouble(BigDecimal::doubleValue));
5115
 
5116
            com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(defaultLoan.getFofoId());
5117
 
5118
            Address address = addressRepository.selectById(user.getAddressId());
5119
 
32842 amit.gupta 5120
            //String url = "http://app.smartdukaan.com/pages/home/credit";
32822 ranu 5121
 
32842 amit.gupta 5122
            String message = getMessageForDueDateExtend(defaultLoan, amount);
5123
            String whatsAppMessage = getWhatsAppMessageForDueDateExtend(defaultLoan, amount);
32948 amit.gupta 5124
            if (whatsAppMessage != null) {
32850 amit.gupta 5125
                notificationService.sendWhatsappMessage(whatsAppMessage, title, address.getPhoneNumber());
32948 amit.gupta 5126
                if (notYetSent) {
32850 amit.gupta 5127
                    notificationService.sendWhatsappMessage(whatsAppMessage, title, "9911565032");
5128
                    notYetSent = false;
5129
                }
5130
            }
5131
 
32822 ranu 5132
            String[] email = {user.getEmailId()};
5133
            sendMailOfHtmlFormat(mailSender, email, message, null, "Loan Alert - SmartDukaan");
5134
        }
5135
    }
5136
 
5137
    private String getMessageForDueDateExtend(Loan defaultLoan, double amount) throws ProfitMandiBusinessException {
5138
 
5139
        double absoluteAmount = Math.abs(amount);
5140
        long roundedAmount = Math.round(absoluteAmount);
5141
        String formattedAmount = (amount < 0) ? "" + roundedAmount : "" + roundedAmount;
5142
 
5143
        LocalDate dueDate = defaultLoan.getDueDate().toLocalDate();
5144
        LocalDate defaultDate = defaultLoan.getDueDate().toLocalDate().plusDays(15);
5145
 
5146
        // Retrieve the name of the user associated with the loan
5147
        String name = userUserRepository.selectById(defaultLoan.getFofoId()).getName();
5148
 
5149
        // Initialize a StringBuilder to construct the HTML message
5150
        StringBuilder sb = new StringBuilder();
5151
 
32842 amit.gupta 5152
        if (LocalDate.now().isBefore(dueDate)) {
5153
            long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), defaultLoan.getDueDate().toLocalDate());
32822 ranu 5154
            String payDate = defaultLoan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
5155
            // 5 Days Before Due Date - daily
5156
            if (noOfdaysBetween <= 5) {
5157
                sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br><p>Dear " + name + "</p>");
5158
                sb.append("<p>This is a friendly reminder that your loan payment is due in " + noOfdaysBetween + "days, on " +
5159
                        payDate +
5160
                        ". Please ensure that the payment is made on time to avoid any late fees or penalties.</p>");
5161
                sb.append("<p>As per the terms of your loan agreement, the total amount due is Rs. " + formattedAmount + ". " +
5162
                        "You can make the payment by adding money to your wallet. If you have any questions or need assistance, " +
5163
                        "our customer service team is available to help you.</p>");
5164
                sb.append("<p>Thank you for your cooperation and prompt attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
5165
            }
32842 amit.gupta 5166
        } else if (LocalDate.now().isBefore(defaultDate)) {
32822 ranu 5167
            long noOfdaysBetween = ChronoUnit.DAYS.between(defaultDate, LocalDate.now());
5168
 
5169
            // After Due Date – Alternate days
5170
            if ((noOfdaysBetween % 2 == 0) && (noOfdaysBetween > 5)) {
5171
                sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br><p>Dear " + name + "</p>");
5172
                sb.append("<p>We would like to remind you that your payment for the outstanding balance on your account is now overdue. " +
5173
                        "As per our terms and conditions, a higher interest rate will be levied on the overdue amount Rs. " + formattedAmount + ".</p>");
34729 amit.gupta 5174
                sb.append("<p>To avoid further charges and any negative impact on your Credit score, we kindly request that you settle the " +
32822 ranu 5175
                        "outstanding balance as soon as possible.</p>");
5176
                sb.append("<p>Thank you for your attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
5177
            }
5178
            // 5 Days before default - daily
32842 amit.gupta 5179
            if (noOfdaysBetween <= 5) {
32822 ranu 5180
                sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br>");
5181
                sb.append("<p>Attention: High Alert</p>");
5182
                sb.append("<p>Dear " + name + "</p>");
5183
                sb.append("<p>This is to inform you that the due date for your payment of Rs. " + formattedAmount + " has been crossed, " +
5184
                        "and you are approaching the default date on " + defaultDate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")) + ". " +
34729 amit.gupta 5185
                        "Please be aware that this will have a significant impact on your Credit score and may result in substantial penalties as well.</p>");
32822 ranu 5186
                sb.append("<p>To rectify this situation, it is imperative that you take immediate action. " +
5187
                        "Please make the necessary payment immediately to avoid further consequences.</p>");
5188
                sb.append("<p>Thank you for your attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
5189
            }
32842 amit.gupta 5190
        } else {
32822 ranu 5191
            // Post Default - Daily
32842 amit.gupta 5192
            sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br><p>Dear " + name + "</p>");
5193
            sb.append("<p>We regret to inform you that you are currently in loan default. As a result, " +
34729 amit.gupta 5194
                    "higher penalties are being charged, which is also negatively impacting your Credit score. " +
32842 amit.gupta 5195
                    "It is imperative that you make an immediate payment to rectify this situation.</p>");
5196
            sb.append("<p>Please note that failing to make the payment promptly will result in further consequences, " +
5197
                    "including potential legal action and additional financial penalties. " +
5198
                    "We strongly urge you to take this matter seriously and settle the outstanding amount as soon as possible.</p>");
5199
            sb.append("<p>To make the payment, please add Rs. " + formattedAmount + " to your wallet. We are here to help you resolve this issue and get back on track.</p>");
5200
            sb.append("<p>Thank you for your attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
32822 ranu 5201
 
5202
        }
5203
 
5204
        // Return the constructed HTML message
5205
        sb.append("</body></html>");
5206
        return sb.toString();
5207
    }
5208
 
34502 amit.gupta 5209
    private String getWhatsAppMessageForDueDateExtend(Loan defaultLoan, double amount) throws
5210
            ProfitMandiBusinessException {
32822 ranu 5211
 
5212
        double absoluteAmount = Math.abs(amount);
5213
        long roundedAmount = Math.round(absoluteAmount);
5214
        String formattedAmount = (amount < 0) ? "" + roundedAmount : "" + roundedAmount;
5215
 
5216
        LocalDate dueDate = defaultLoan.getDueDate().toLocalDate();
5217
        LocalDate defaultDate = defaultLoan.getDueDate().toLocalDate().plusDays(15);
5218
 
5219
        // Retrieve the name of the user associated with the loan
5220
        String name = userUserRepository.selectById(defaultLoan.getFofoId()).getName();
5221
 
5222
        // Initialize a StringBuilder to construct the HTML message
5223
        String message = null;
5224
 
32842 amit.gupta 5225
        if (LocalDate.now().isBefore(dueDate)) {
32822 ranu 5226
            long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), defaultLoan.getDueDate().toLocalDate());
5227
            String payDate = defaultLoan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
5228
            // 5 Days Before Due Date - daily
5229
            if (noOfdaysBetween <= 5) {
5230
 
34729 amit.gupta 5231
                message = "Dear %s, This is a friendly reminder that your outstanding credit payment is due in %d days, on %s.\n" +
32822 ranu 5232
                        "\n" +
5233
                        "Please ensure that the payment is made on time to avoid any late fees or penalties.As per the terms of your loan agreement, the total amount due is Rs. %s. You can make the payment by adding money to wallet.\n" +
5234
                        "\n" +
5235
                        "If you have any questions or need assistance, our customer service team is available to help you.\n" +
5236
                        "Thank you for your cooperation and prompt attention to this matter.\n" +
5237
                        "\n" +
5238
                        "Team SmartDukaan";
32842 amit.gupta 5239
                message = String.format(message, name, noOfdaysBetween, payDate, formattedAmount);
5240
            }
5241
        } else if (LocalDate.now().isBefore(defaultDate)) {
32822 ranu 5242
            long noOfdaysBetween = ChronoUnit.DAYS.between(defaultDate, LocalDate.now());
5243
            // After Due Date – Alternate days
5244
            if ((noOfdaysBetween % 2 == 0) && (noOfdaysBetween > 5)) {
5245
                message = "Dear %s, We would like to remind you that your payment for the outstanding balance on your account is now overdue. \n" +
5246
                        "As per our terms and conditions, a higher interest rate will be levied on the overdue amount Rs.%s.\n" +
34729 amit.gupta 5247
                        "To avoid further charges and any negative impact on your Credit ratings, we kindly request that you settle the outstanding balance as soon as possible.\n" +
32822 ranu 5248
                        "Thank you for your attention to this matter. \n" +
5249
                        "\n" +
5250
                        "Team SmartDukaan";
5251
                message = String.format(message, name, formattedAmount);
5252
            }
5253
            // 5 Days before default - daily
32842 amit.gupta 5254
            if (noOfdaysBetween <= 5) {
32822 ranu 5255
                String defaultPayDate = defaultDate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
5256
                message = "Attention: High Alert!! Dear %s, \n" +
5257
                        "\n" +
5258
                        "This is to inform you that the due date for your payment of Rs. %s has been crossed, and as a result, you are now about to reach default date %s.\n" +
34729 amit.gupta 5259
                        "Please be aware that this will have a significant impact on your Credit score and may result in substantial penalties as well. To rectify this situation, it is imperative that you take immediate action.\n" +
32822 ranu 5260
                        "\n" +
5261
                        "Please make the necessary payment immediately to avoid further consequences. Thank you for your attention to this matter.\n" +
5262
                        "\n" +
5263
                        "Team SmartDukaan";
5264
                message = String.format(message, name, formattedAmount, defaultPayDate);
5265
            }
32842 amit.gupta 5266
        } else {
32822 ranu 5267
            // Post Default - Daily
34729 amit.gupta 5268
            message = "Dear %s, We regret to inform you that you are currently in Credit default. As a result, higher penalties are being charged, which is also negatively impacting your Credit score. \n" +
32822 ranu 5269
                    "\n" +
5270
                    "It is imperative that you make an immediate payment to rectify this situation. \n" +
5271
                    "\n" +
5272
                    "Please note that failing to make the payment promptly will result in further consequences, including potential legal action and additional financial penalties. \n" +
5273
                    "\n" +
5274
                    "We strongly urge you to take this matter seriously and settle the outstanding amount as soon as possible. \n" +
5275
                    "\n" +
5276
                    "To make the payment, please add Rs. %s  to wallet. We are here to help you resolve this issue and get back on track. Thank you for your attention to this matter. \n" +
5277
                    "\n" +
5278
                    "Team SmartDukaan";
5279
            message = String.format(message, name, formattedAmount);
5280
 
5281
        }
5282
        // Return the constructed HTML message
5283
        return message;
5284
    }
5285
 
33874 ranu 5286
    @Autowired
5287
    private FofoOpeningStockRepository fofoOpeningStockRepository;
34450 ranu 5288
    @Autowired
5289
    private SmartCartService smartCartService;
33874 ranu 5290
 
5291
    public void createOpeningStockPartyWise() throws Exception {
5292
        // Get all partner stock data
35329 ranu 5293
        Map<Integer, List<PartnerOpeningStockByTodayModel>> partnerOpeningStockByTodayInStockMap = currentInventorySnapshotRepository.getAllPartnerTodayInstock();
5294
        Map<Integer, List<PartnerOpeningStockByTodayModel>> partnerOpeningStockByTodayGrnPending = currentInventorySnapshotRepository.getAllPartnerTodayGrnPending();
5295
 
5296
        Map<Integer, List<PartnerOpeningStockByTodayModel>> partnerOpeningStockByTodayMap =
5297
                new HashMap<>();
5298
 
5299
// STEP 1: Copy in-stock data
5300
        partnerOpeningStockByTodayInStockMap.forEach((fofoId, list) ->
5301
                partnerOpeningStockByTodayMap.put(
5302
                        fofoId,
5303
                        new ArrayList<>(list)   // deep list copy
5304
                )
5305
        );
5306
 
5307
// STEP 2: Merge GRN pending using streams
5308
        partnerOpeningStockByTodayGrnPending.forEach((fofoId, grnList) -> {
5309
 
5310
            // If FOFO missing → simply insert GRN list (deep copy)
5311
            partnerOpeningStockByTodayMap
5312
                    .computeIfAbsent(fofoId, x -> new ArrayList<>())
5313
                    .addAll(
5314
                            grnList.stream()
5315
                                    .map(g -> new PartnerOpeningStockByTodayModel(
5316
                                            g.getFofoId(),
5317
                                            g.getCatalogId(),
5318
                                            g.getModelNumber(),
5319
                                            g.getOpeningQty()
5320
                                    ))
5321
                                    .collect(Collectors.toList())
5322
                    );
5323
        });
5324
 
5325
// STEP 3: Now merge duplicates per catalogId using grouping
5326
        partnerOpeningStockByTodayMap.replaceAll((fofoId, list) ->
5327
                list.stream()
5328
                        .collect(Collectors.toMap(
5329
                                PartnerOpeningStockByTodayModel::getCatalogId,
5330
                                m -> new PartnerOpeningStockByTodayModel(
5331
                                        m.getFofoId(),
5332
                                        m.getCatalogId(),
5333
                                        m.getModelNumber(),
5334
                                        m.getOpeningQty()
5335
                                ),
5336
                                // merge function: sum openingQty
5337
                                (m1, m2) -> {
5338
                                    m1.setOpeningQty(m1.getOpeningQty() + m2.getOpeningQty());
5339
                                    return m1;
5340
                                }
5341
                        ))
5342
                        .values()
5343
                        .stream()
5344
                        .collect(Collectors.toList())
5345
        );
5346
 
5347
 
34460 ranu 5348
        Map<Integer, Map<Integer, Integer>> activatedButNotBilledCatalogQtyMap = smartCartService.activatedButNotBilledCatalogQtyMap();
34502 amit.gupta 5349
        LOGGER.info("PartnerOpeningStockByTodayModel {}", partnerOpeningStockByTodayMap);
33874 ranu 5350
        for (Map.Entry<Integer, List<PartnerOpeningStockByTodayModel>> entry : partnerOpeningStockByTodayMap.entrySet()) {
5351
            int fofoId = entry.getKey();
5352
            List<PartnerOpeningStockByTodayModel> partnerStockList = entry.getValue();
34450 ranu 5353
            // Get the sold (activated-but-not-billed) quantity for this fofo and catalog
34460 ranu 5354
            Map<Integer, Integer> activatedButNotBilledQtyMap = activatedButNotBilledCatalogQtyMap.getOrDefault(fofoId, Collections.emptyMap());
33874 ranu 5355
 
34450 ranu 5356
            //  if stock is avaialble in snapshot
33874 ranu 5357
            for (PartnerOpeningStockByTodayModel partnerStock : partnerStockList) {
5358
                int catalogId = partnerStock.getCatalogId();
34450 ranu 5359
                int stockCurrentQty = partnerStock.getOpeningQty();
33874 ranu 5360
                LocalDate openingDate = partnerStock.getOpeningDate();
5361
 
34460 ranu 5362
                int soldButNotBilledQty = activatedButNotBilledQtyMap.getOrDefault(catalogId, 0);
34450 ranu 5363
 
35521 amit 5364
                if (catalogId == 1025656 && fofoId == 175140232) {
5365
                    LOGGER.info("catalogId {}", catalogId);
5366
                    LOGGER.info("fofoId {}", fofoId);
5367
                    LOGGER.info("soldButNotBilledQty {}", soldButNotBilledQty);
5368
                    LOGGER.info("stockCurrentQty {}", stockCurrentQty);
35329 ranu 5369
                }
5370
 
34450 ranu 5371
                // Subtract soldQty from partnerCurrentQty
34460 ranu 5372
                int partnerCurrentQty = Math.max(stockCurrentQty - soldButNotBilledQty, 0); // Ensure it doesn't go negative
34450 ranu 5373
 
5374
 
33874 ranu 5375
                // Check if an entry already exists in the FofoOpeningStock table
5376
                FofoOpeningStock existingStock = fofoOpeningStockRepository.findByFofoIdAndCatalogId(fofoId, catalogId);
5377
 
34162 ranu 5378
 
33874 ranu 5379
                if (existingStock != null) {
34363 ranu 5380
                    if (partnerCurrentQty < 1 && existingStock.getOpeningDate().isBefore(LocalDate.now().minusDays(5))) {
34160 tejus.loha 5381
                        fofoOpeningStockRepository.delete(existingStock);
5382
                    }
34162 ranu 5383
                    if (existingStock.getOpeningQty() < partnerCurrentQty) {
5384
                        existingStock.setOpeningQty(partnerCurrentQty);
5385
                        existingStock.setCurrentQty(partnerCurrentQty);
33874 ranu 5386
                        existingStock.setOpeningDate(openingDate);
5387
                        LOGGER.info("if condition exist {}");
34275 tejus.loha 5388
                    } else if (existingStock.getCurrentQty() >= existingStock.getOpeningQty()) {
5389
                        existingStock.setOpeningQty(existingStock.getCurrentQty());
5390
                        existingStock.setCurrentQty(partnerCurrentQty);
5391
                        existingStock.setOpeningDate(LocalDate.now());
34363 ranu 5392
                    } else if (existingStock.getOpeningDate().isBefore(LocalDate.now().minusDays(5))) {
33878 ranu 5393
                        int averageQty = Math.round((existingStock.getCurrentQty() + existingStock.getOpeningQty()) / 2.0f);
5394
 
5395
                        if (averageQty == 1 && existingStock.getOpeningQty() == 1 && existingStock.getCurrentQty() == 0) {
5396
                            // Delete the existing stock entry from the table
5397
                            fofoOpeningStockRepository.delete(existingStock);
5398
                            LOGGER.info("Deleted record with fofoId: {}, catalogId: {} because averageQty, openingQty, and currentQty meet deletion criteria", fofoId, catalogId);
5399
                        } else {
5400
                            // Update the existing stock with the new average quantity
5401
                            existingStock.setOpeningQty(averageQty);
34244 ranu 5402
                            existingStock.setCurrentQty(partnerCurrentQty);
33878 ranu 5403
                            existingStock.setOpeningDate(LocalDate.now());
34363 ranu 5404
                            LOGGER.info("Updated due to date being older than 5 days with average quantity: {}", averageQty);
33878 ranu 5405
                        }
34275 tejus.loha 5406
                    } else {
34244 ranu 5407
                        existingStock.setCurrentQty(partnerCurrentQty);
33874 ranu 5408
                    }
5409
                } else {
5410
                    LOGGER.info("else condition exist");
5411
                    FofoOpeningStock newStock = new FofoOpeningStock();
5412
                    newStock.setFofoId(fofoId);
5413
                    newStock.setCatalogId(catalogId);
34162 ranu 5414
                    newStock.setOpeningQty(partnerCurrentQty);
5415
                    newStock.setCurrentQty(partnerCurrentQty);
33874 ranu 5416
                    newStock.setOpeningDate(openingDate);
5417
                    fofoOpeningStockRepository.persist(newStock);
5418
 
5419
                }
5420
            }
34162 ranu 5421
 
5422
//            if stock is not available in snapshot but available in opening stock
34275 tejus.loha 5423
            List<FofoOpeningStock> fofoOpeningStockList = fofoOpeningStockRepository.selectAllByFofoId(fofoId);
34162 ranu 5424
 
34275 tejus.loha 5425
            for (FofoOpeningStock fofoOpeningStock : fofoOpeningStockList) {
34162 ranu 5426
 
34275 tejus.loha 5427
                if (!partnerStockList.stream().anyMatch(partnerStock -> partnerStock.getCatalogId() == fofoOpeningStock.getCatalogId())) {
34363 ranu 5428
                    if (fofoOpeningStock.getOpeningDate().isBefore(LocalDate.now().minusDays(5))) {
34275 tejus.loha 5429
                        LOGGER.info("not match stock{}", fofoOpeningStock);
5430
                        fofoOpeningStockRepository.delete(fofoOpeningStock);
5431
                    } else {
5432
                        LOGGER.info("not match stock2{}", fofoOpeningStock);
5433
                        fofoOpeningStock.setCurrentQty(0);
5434
                    }
34162 ranu 5435
 
34275 tejus.loha 5436
                }
5437
            }
34162 ranu 5438
 
33874 ranu 5439
        }
5440
    }
5441
 
5442
 
34162 ranu 5443
    @Autowired
5444
    private CategorisedCatalogRepository categorisedCatalogRepository;
5445
 
5446
    public void groupHidCatalogsByWeeks() throws ProfitMandiBusinessException, MessagingException, IOException {
5447
        List<CategorisedCatalogListModel> categorisedCatalogs = categorisedCatalogRepository.getListByStatus(CatalogMovingEnum.HID);
5448
        LocalDate currentDate = LocalDate.now();
5449
        LocalDate oneWeekAgo = currentDate.minusDays(7);
5450
        LocalDate twoWeeksAgo = currentDate.minusDays(14);
5451
        LocalDate threeWeeksAgo = currentDate.minusDays(21);
5452
 
5453
        // This Week (inclusive of the current date)
5454
        List<CategorisedCatalogListModel> thisWeekCatalogs = categorisedCatalogs.stream()
5455
                .filter(catalog -> !catalog.getStatusCreatedDate().isBefore(oneWeekAgo))
5456
                .collect(Collectors.toList());
5457
 
5458
        // Last Week (from one week ago to two weeks ago, exclusive of this week)
5459
        List<CategorisedCatalogListModel> lastWeekCatalogs = categorisedCatalogs.stream()
5460
                .filter(catalog -> catalog.getStatusCreatedDate().isBefore(oneWeekAgo) && !catalog.getStatusCreatedDate().isBefore(twoWeeksAgo))
5461
                .collect(Collectors.toList());
5462
 
5463
        // Two Weeks Ago (from two weeks ago to three weeks ago, exclusive of last week)
5464
        List<CategorisedCatalogListModel> twoWeeksAgoCatalogs = categorisedCatalogs.stream()
5465
                .filter(catalog -> catalog.getStatusCreatedDate().isBefore(twoWeeksAgo) && !catalog.getStatusCreatedDate().isBefore(threeWeeksAgo))
5466
                .collect(Collectors.toList());
5467
 
5468
        // Older than Two Weeks Ago (anything older than three weeks ago)
5469
        List<CategorisedCatalogListModel> olderCatalogs = categorisedCatalogs.stream()
5470
                .filter(catalog -> catalog.getStatusCreatedDate().isBefore(threeWeeksAgo))
5471
                .collect(Collectors.toList());
5472
 
5473
 
5474
        String subject = "Hid Catalogs";
5475
        StringBuilder sb = new StringBuilder();
5476
 
5477
        sb.append("<html><body><p>Hi Catagory Team,\n");
5478
        sb.append("<p style='font-weight:500;'>Please review the HID catalogs for this week:</p>\n" + "<table style='border:1px solid black ;padding: 5px; border-collapse: collapse;'>");
5479
 
5480
        sb.append("<th style='border:1px solid black;padding: 5px'>Brand</th>\n");
5481
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Number</th>\n");
5482
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Name</th>\n");
5483
        sb.append("<th style='border:1px solid black;padding: 5px'>Catalog Id</th>\n");
5484
        sb.append("<th style='border:1px solid black;padding: 5px'>Start Date</th>\n");
5485
        sb.append("<th style='border:1px solid black;padding: 5px'>End Date</th>\n");
5486
        sb.append("</tr>\n");
5487
 
5488
        for (CategorisedCatalogListModel catalog : thisWeekCatalogs) {
5489
            sb.append("<tr>");
5490
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getBrand() + "</td>\n");
5491
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getModelNumber() + "</td>\n");
5492
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getModelId() + "</td>\n");
5493
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getCurrentStatus() + "</td>\n");
5494
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getStatusCreatedDate() + "</td>\n");
5495
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getStatusEndDate() + "</td>\n");
5496
 
5497
            sb.append("</tr>\n");
5498
 
5499
        }
5500
 
5501
        sb.append("</table>");
5502
 
5503
        sb.append("</br>");
5504
        sb.append("</br>");
5505
        sb.append("</br>");
5506
        sb.append("<p style='font-weight:500;'>Please review the HID catalogs for last week:</p>\n" + "<table style='border:1px solid black ;padding: 5px; border-collapse: collapse;'>");
5507
 
5508
        sb.append("<th style='border:1px solid black;padding: 5px'>Brand</th>\n");
5509
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Number</th>\n");
5510
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Name</th>\n");
5511
        sb.append("<th style='border:1px solid black;padding: 5px'>Catalog Id</th>\n");
5512
        sb.append("<th style='border:1px solid black;padding: 5px'>Start Date</th>\n");
5513
        sb.append("<th style='border:1px solid black;padding: 5px'>End Date</th>\n");
5514
        sb.append("</tr>\n");
5515
 
5516
        for (CategorisedCatalogListModel catalog : lastWeekCatalogs) {
5517
            sb.append("<tr>");
5518
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getBrand() + "</td>\n");
5519
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getModelNumber() + "</td>\n");
5520
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getModelId() + "</td>\n");
5521
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getCurrentStatus() + "</td>\n");
5522
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getStatusCreatedDate() + "</td>\n");
5523
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getStatusEndDate() + "</td>\n");
5524
 
5525
            sb.append("</tr>\n");
5526
 
5527
        }
5528
        sb.append("</table>");
5529
 
5530
        sb.append("</br>");
5531
        sb.append("</br>");
5532
        sb.append("</br>");
5533
        sb.append("<p style='font-weight:500;'>Please review the HID catalogs for two week ago:</p>\n" + "<table style='border:1px solid black ;padding: 5px; border-collapse: collapse;'>");
5534
 
5535
        sb.append("<th style='border:1px solid black;padding: 5px'>Brand</th>\n");
5536
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Number</th>\n");
5537
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Name</th>\n");
5538
        sb.append("<th style='border:1px solid black;padding: 5px'>Catalog Id</th>\n");
5539
        sb.append("<th style='border:1px solid black;padding: 5px'>Start Date</th>\n");
5540
        sb.append("<th style='border:1px solid black;padding: 5px'>End Date</th>\n");
5541
        sb.append("</tr>\n");
5542
 
5543
        for (CategorisedCatalogListModel catalog : twoWeeksAgoCatalogs) {
5544
            sb.append("<tr>");
5545
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getBrand() + "</td>\n");
5546
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getModelNumber() + "</td>\n");
5547
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getModelId() + "</td>\n");
5548
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getCurrentStatus() + "</td>\n");
5549
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getStatusCreatedDate() + "</td>\n");
5550
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getStatusEndDate() + "</td>\n");
5551
 
5552
            sb.append("</tr>\n");
5553
 
5554
        }
5555
        sb.append("</table>");
5556
 
5557
        sb.append("</br>");
5558
        sb.append("</br>");
5559
        sb.append("</br>");
5560
        sb.append("<p style='font-weight:500;'>Please review the HID catalogs for older than two weeks ago:</p>\n" + "<table style='border:1px solid black ;padding: 5px; border-collapse: collapse;'>");
5561
 
5562
        sb.append("<th style='border:1px solid black;padding: 5px'>Brand</th>\n");
5563
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Number</th>\n");
5564
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Name</th>\n");
5565
        sb.append("<th style='border:1px solid black;padding: 5px'>Catalog Id</th>\n");
5566
        sb.append("<th style='border:1px solid black;padding: 5px'>Start Date</th>\n");
5567
        sb.append("<th style='border:1px solid black;padding: 5px'>End Date</th>\n");
5568
        sb.append("</tr>\n");
5569
 
5570
        for (CategorisedCatalogListModel catalog : olderCatalogs) {
5571
            sb.append("<tr>");
5572
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getBrand() + "</td>\n");
5573
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getModelNumber() + "</td>\n");
5574
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getModelId() + "</td>\n");
5575
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getCurrentStatus() + "</td>\n");
5576
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getStatusCreatedDate() + "</td>\n");
5577
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getStatusEndDate() + "</td>\n");
5578
 
5579
            sb.append("</tr>\n");
5580
 
5581
        }
5582
        sb.append("</table>");
5583
        sb.append("</body></html>");
5584
 
34275 tejus.loha 5585
        List<String> sendTo = Arrays.asList("uday.singh@smartdukaan.com", "kuldeep.kumar@smartdukaan.com", "nishant.ohri@smartdukaan.com", "ritesh.chauhan1@smartdukaan.com", "shobhit.tandon@smartdukaan.com", "tarun.verma@smartdukaan.com", "niranjan.kala@smartdukaan.com");
34162 ranu 5586
 
5587
 
5588
        String[] email = sendTo.toArray(new String[sendTo.size()]);
5589
 
5590
        this.sendMailOfHtmlFormat(mailSender, email, sb.toString(), null, subject);
5591
    }
5592
 
34275 tejus.loha 5593
    public void send10OrMoreOlderStockReport() throws Exception {
35094 ranu 5594
        System.out.print("testSTart");
34352 amit.gupta 5595
        purSaleService.moreThen10DaysEgedStockReport();
35094 ranu 5596
        System.out.print("testEnd");
34162 ranu 5597
 
34275 tejus.loha 5598
    }
34162 ranu 5599
 
34791 aman.kumar 5600
    public void sendUpdateMobileBrandMarketShareQuaterlyMail() throws Exception {
5601
        String subject = "Reminder: Please Update Brand-wise Market Share";
5602
 
5603
        String body = "Dear Team,\n\n" +
5604
                "This is a gentle reminder to kindly update the brand-wise market share data for the current quarter.\n\n" +
5605
                "Best regards,\n" +
5606
                "SmartDukaan Team";
5607
 
5608
        Utils.sendMailWithAttachments(
5609
                googleMailSender,
5610
                new String[]{"sm.@smartdukaan.com"},
5611
                new String[]{"tech@smartdukaan.com"},
5612
                subject,
5613
                body
5614
        );
5615
    }
5616
 
5617
 
32210 jai.hind 5618
}
33664 amit.gupta 5619
// 2284"