Subversion Repositories SmartDukaan

Rev

Rev 33831 | Rev 33833 | 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
 
24542 amit.gupta 3
import com.google.common.collect.Lists;
25300 tejbeer 4
import com.google.gson.Gson;
29488 manish 5
import com.razorpay.Payment;
32421 amit.gupta 6
import com.smartdukaan.cron.itelImeiActivation.ItelImeiActivationNewService;
29488 manish 7
import com.smartdukaan.cron.itelImeiActivation.ItelImeiActivationService;
8
import com.smartdukaan.cron.itelImeiActivation.TecnoImeiActivation;
32482 amit.gupta 9
import com.smartdukaan.cron.scheduled.runnables.PurchaseMigration;
32511 amit.gupta 10
import com.spice.profitmandi.common.enumuration.*;
24121 govind 11
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
32421 amit.gupta 12
import com.spice.profitmandi.common.model.*;
24681 amit.gupta 13
import com.spice.profitmandi.common.services.ReporticoService;
29814 tejbeer 14
import com.spice.profitmandi.common.services.mandii.AccountStatusResponseOut;
15
import com.spice.profitmandi.common.services.mandii.EligibilityStatusEnum;
16
import com.spice.profitmandi.common.services.mandii.MandiiService;
24002 amit.gupta 17
import com.spice.profitmandi.common.util.FileUtil;
23929 amit.gupta 18
import com.spice.profitmandi.common.util.FormattingUtils;
27678 amit.gupta 19
import com.spice.profitmandi.common.util.PdfUtils;
23929 amit.gupta 20
import com.spice.profitmandi.common.util.Utils;
24592 amit.gupta 21
import com.spice.profitmandi.common.util.Utils.Attachment;
29308 tejbeer 22
import com.spice.profitmandi.common.web.client.RestClient;
25300 tejbeer 23
import com.spice.profitmandi.dao.Interface.Campaign;
32511 amit.gupta 24
import com.spice.profitmandi.dao.cart.CartService;
25590 amit.gupta 25
import com.spice.profitmandi.dao.entity.auth.AuthUser;
30421 tejbeer 26
import com.spice.profitmandi.dao.entity.auth.PartnerCollectionRemark;
33078 ranu 27
import com.spice.profitmandi.dao.entity.catalog.*;
28
import com.spice.profitmandi.dao.entity.cs.NonSdBuying;
25590 amit.gupta 29
import com.spice.profitmandi.dao.entity.cs.Position;
26283 tejbeer 30
import com.spice.profitmandi.dao.entity.cs.Ticket;
28769 amit.gupta 31
import com.spice.profitmandi.dao.entity.dtr.User;
32421 amit.gupta 32
import com.spice.profitmandi.dao.entity.dtr.*;
33
import com.spice.profitmandi.dao.entity.fofo.*;
34
import com.spice.profitmandi.dao.entity.inventory.*;
33553 ranu 35
import com.spice.profitmandi.dao.entity.logistics.AST;
36
import com.spice.profitmandi.dao.entity.logistics.ASTRepository;
33817 amit.gupta 37
import com.spice.profitmandi.dao.entity.logistics.WarehouseProvider;
32421 amit.gupta 38
import com.spice.profitmandi.dao.entity.transaction.*;
39
import com.spice.profitmandi.dao.entity.user.*;
32511 amit.gupta 40
import com.spice.profitmandi.dao.entity.warehouse.WarehouseInventoryItem;
41
import com.spice.profitmandi.dao.entity.warehouse.WarehouseScan;
30421 tejbeer 42
import com.spice.profitmandi.dao.enumuration.auth.CollectionRemark;
24250 amit.gupta 43
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
25598 amit.gupta 44
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
26790 tejbeer 45
import com.spice.profitmandi.dao.enumuration.dtr.RefferalStatus;
29814 tejbeer 46
import com.spice.profitmandi.dao.enumuration.fofo.Gateway;
31332 amit.gupta 47
import com.spice.profitmandi.dao.enumuration.fofo.PaymentStatus;
32511 amit.gupta 48
import com.spice.profitmandi.dao.enumuration.fofo.ReturnType;
24242 amit.gupta 49
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
32081 tejbeer 50
import com.spice.profitmandi.dao.enumuration.inventory.VendorCatalogPricingStatus;
30913 tejbeer 51
import com.spice.profitmandi.dao.enumuration.transaction.CreditRisk;
30859 tejbeer 52
import com.spice.profitmandi.dao.enumuration.transaction.LoanReferenceType;
25609 amit.gupta 53
import com.spice.profitmandi.dao.enumuration.transaction.PriceDropImeiStatus;
32421 amit.gupta 54
import com.spice.profitmandi.dao.enumuration.transaction.SchemePayoutStatus;
55
import com.spice.profitmandi.dao.model.*;
33452 amit.gupta 56
import com.spice.profitmandi.dao.repository.GenericRepository;
25590 amit.gupta 57
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
33078 ranu 58
import com.spice.profitmandi.dao.repository.auth.NonSdBuyingRepository;
30421 tejbeer 59
import com.spice.profitmandi.dao.repository.auth.PartnerCollectionRemarkRepository;
32421 amit.gupta 60
import com.spice.profitmandi.dao.repository.catalog.*;
32980 amit.gupta 61
import com.spice.profitmandi.dao.repository.cs.CsService;
62
import com.spice.profitmandi.dao.repository.cs.PartnerRegionRepository;
63
import com.spice.profitmandi.dao.repository.cs.PositionRepository;
64
import com.spice.profitmandi.dao.repository.cs.TicketRepository;
32421 amit.gupta 65
import com.spice.profitmandi.dao.repository.dtr.*;
66
import com.spice.profitmandi.dao.repository.fofo.*;
67
import com.spice.profitmandi.dao.repository.inventory.*;
33817 amit.gupta 68
import com.spice.profitmandi.dao.repository.logistics.WarehouseProviderRepository;
32421 amit.gupta 69
import com.spice.profitmandi.dao.repository.transaction.*;
24542 amit.gupta 70
import com.spice.profitmandi.dao.repository.user.AddressRepository;
25721 tejbeer 71
import com.spice.profitmandi.dao.repository.user.UserRepository;
32421 amit.gupta 72
import com.spice.profitmandi.dao.repository.warehouse.*;
33355 amit.gupta 73
import com.spice.profitmandi.dao.service.SidbiService;
32817 amit.gupta 74
import com.spice.profitmandi.dao.service.biuedart.BluedartAuthService;
75
import com.spice.profitmandi.dao.service.biuedart.BluedartService;
31604 tejbeer 76
import com.spice.profitmandi.dao.service.solr.FofoSolr;
32421 amit.gupta 77
import com.spice.profitmandi.service.*;
31332 amit.gupta 78
import com.spice.profitmandi.service.integrations.CCAvenuePaymentService;
28368 tejbeer 79
import com.spice.profitmandi.service.integrations.RazorpayPaymentService;
30858 amit.gupta 80
import com.spice.profitmandi.service.integrations.bharti.model.BAGInsuranceModel;
33638 amit.gupta 81
import com.spice.profitmandi.service.integrations.gstpro.GstProAuthService;
33817 amit.gupta 82
import com.spice.profitmandi.service.integrations.gstpro.GstProService;
83
import com.spice.profitmandi.service.integrations.gstpro.api.model.E_InvoiceCommon;
32872 amit.gupta 84
import com.spice.profitmandi.service.integrations.psismart.PsiSmartService;
32948 amit.gupta 85
import com.spice.profitmandi.service.integrations.smartping.SmartPingService;
25694 amit.gupta 86
import com.spice.profitmandi.service.integrations.toffee.ToffeeService;
32421 amit.gupta 87
import com.spice.profitmandi.service.inventory.*;
31746 amit.gupta 88
import com.spice.profitmandi.service.offers.OfferService;
25335 amit.gupta 89
import com.spice.profitmandi.service.order.OrderService;
33452 amit.gupta 90
import com.spice.profitmandi.service.pricecircular.PriceCircularService;
24431 amit.gupta 91
import com.spice.profitmandi.service.pricing.PriceDropService;
23724 amit.gupta 92
import com.spice.profitmandi.service.recharge.provider.OxigenRechargeProviderService;
93
import com.spice.profitmandi.service.recharge.provider.ThinkWalnutDigitalRechargeProviderService;
94
import com.spice.profitmandi.service.scheme.SchemeService;
29668 tejbeer 95
import com.spice.profitmandi.service.serviceConfig.ServiceConfigService;
31008 amit.gupta 96
import com.spice.profitmandi.service.transaction.CreditNoteService;
30859 tejbeer 97
import com.spice.profitmandi.service.transaction.SDCreditService;
23929 amit.gupta 98
import com.spice.profitmandi.service.transaction.TransactionService;
32990 amit.gupta 99
import com.spice.profitmandi.service.transaction.invoicing.InvoiceService;
23929 amit.gupta 100
import com.spice.profitmandi.service.user.RetailerService;
32511 amit.gupta 101
import com.spice.profitmandi.service.wallet.CommonPaymentService;
23739 amit.gupta 102
import com.spice.profitmandi.service.wallet.WalletService;
32421 amit.gupta 103
import com.spice.profitmandi.service.warehouse.PurchaseOrderService;
32511 amit.gupta 104
import com.spice.profitmandi.service.warehouse.WarehouseInventoryService;
33384 amit.gupta 105
import com.spice.profitmandi.service.warehouse.WarehouseService;
25721 tejbeer 106
import in.shop2020.model.v1.order.OrderStatus;
29308 tejbeer 107
import in.shop2020.model.v1.order.WalletReferenceType;
32421 amit.gupta 108
import org.apache.commons.io.output.ByteArrayOutputStream;
109
import org.apache.commons.lang.StringUtils;
33664 amit.gupta 110
import org.apache.commons.lang3.tuple.Pair;
32421 amit.gupta 111
import org.apache.http.client.methods.CloseableHttpResponse;
112
import org.apache.http.client.methods.HttpPost;
113
import org.apache.http.conn.HttpHostConnectException;
114
import org.apache.http.entity.StringEntity;
115
import org.apache.http.impl.client.CloseableHttpClient;
116
import org.apache.http.impl.client.HttpClients;
117
import org.apache.logging.log4j.LogManager;
118
import org.apache.logging.log4j.Logger;
119
import org.hibernate.Session;
120
import org.hibernate.SessionFactory;
121
import org.hibernate.query.NativeQuery;
122
import org.json.JSONObject;
123
import org.springframework.beans.factory.annotation.Autowired;
124
import org.springframework.beans.factory.annotation.Qualifier;
125
import org.springframework.beans.factory.annotation.Value;
126
import org.springframework.core.io.ByteArrayResource;
127
import org.springframework.core.io.InputStreamSource;
33638 amit.gupta 128
import org.springframework.data.redis.cache.RedisCacheManager;
32421 amit.gupta 129
import org.springframework.mail.javamail.JavaMailSender;
130
import org.springframework.mail.javamail.MimeMessageHelper;
131
import org.springframework.stereotype.Component;
132
import org.springframework.transaction.annotation.Transactional;
31640 tejbeer 133
 
32421 amit.gupta 134
import javax.mail.MessagingException;
135
import javax.mail.internet.InternetAddress;
136
import javax.mail.internet.MimeMessage;
137
import java.io.*;
138
import java.math.BigDecimal;
139
import java.math.RoundingMode;
140
import java.nio.file.Files;
141
import java.nio.file.Paths;
142
import java.sql.Timestamp;
143
import java.text.DecimalFormat;
144
import java.time.*;
145
import java.time.format.DateTimeFormatter;
146
import java.time.temporal.ChronoField;
147
import java.time.temporal.ChronoUnit;
148
import java.util.*;
149
import java.util.Map.Entry;
150
import java.util.stream.Collectors;
151
import java.util.stream.Stream;
32060 amit.gupta 152
 
33664 amit.gupta 153
import static java.util.stream.Collectors.*;
32421 amit.gupta 154
 
155
 
23723 amit.gupta 156
@Component
33384 amit.gupta 157
@Transactional(rollbackFor = {Throwable.class, ProfitMandiBusinessException.class})
23723 amit.gupta 158
public class ScheduledTasks {
159
 
31697 amit.gupta 160
    @Value("${oxigen.recharge.enquiry.url}")
161
    private String oxigenRechargeEnquiryUrl;
24533 govind 162
 
31697 amit.gupta 163
    @Autowired
32482 amit.gupta 164
    PurchaseMigration purchaseMigration;
165
 
166
    @Autowired
32795 amit.gupta 167
    SmartPingService smartPingService;
168
 
33553 ranu 169
    @Autowired
170
    private ASTRepository astRepository;
29668 tejbeer 171
 
31697 amit.gupta 172
    @Autowired
173
    private ServiceConfigService serviceConfigService;
29801 manish 174
 
31697 amit.gupta 175
    @Autowired
176
    private TecnoImeiActivation tecnoImeiActivation;
28205 tejbeer 177
 
31697 amit.gupta 178
    private static final DateTimeFormatter leadTimeFormatter = DateTimeFormatter.ofPattern("d LLL, hh:mm a");
27088 tejbeer 179
 
31697 amit.gupta 180
    @Autowired
181
    private PartnerRegionRepository partnerRegionRepository;
28790 amit.gupta 182
 
31697 amit.gupta 183
    @Autowired
184
    private EmployeeAttendanceRepository employeeAttendanceRepository;
27088 tejbeer 185
 
31697 amit.gupta 186
    @Autowired
187
    VivoImeiActivationService vivoImeiActivationService;
29488 manish 188
 
31697 amit.gupta 189
    @Autowired
190
    ItelImeiActivationService itelImeiActivationService;
29488 manish 191
 
31697 amit.gupta 192
    @Autowired
193
    private PartnerTypeChangeService partnerTypeChangeService;
25598 amit.gupta 194
 
26408 amit.gupta 195
 
31697 amit.gupta 196
    @Autowired
197
    private LeadRepository leadRepository;
25927 amit.gupta 198
 
31697 amit.gupta 199
    @Autowired
200
    private AuthRepository authRepository;
25503 amit.gupta 201
 
31697 amit.gupta 202
    @Autowired
203
    private PriceDropService priceDropService;
26283 tejbeer 204
 
31697 amit.gupta 205
    @Autowired
206
    private FranchiseeVisitRepository franchiseeVisitRepository;
26790 tejbeer 207
 
31697 amit.gupta 208
    @Autowired
209
    private FranchiseeActivityRepository franchiseeActivityRepository;
26790 tejbeer 210
 
31697 amit.gupta 211
    @Autowired
212
    private HdfcPaymentRepository hdfcPaymentRepository;
26790 tejbeer 213
 
31697 amit.gupta 214
    @Autowired
215
    private CsService csService;
25846 amit.gupta 216
 
31697 amit.gupta 217
    @Autowired
218
    private SaholicInventoryService saholicInventoryService;
27208 tejbeer 219
 
31697 amit.gupta 220
    @Autowired
221
    private InsurancePolicyRepository insurancePolicyRepository;
23723 amit.gupta 222
 
31697 amit.gupta 223
    @Autowired
224
    private ToffeeService toffeeService;
25694 amit.gupta 225
 
31697 amit.gupta 226
    @Value("${oxigen.recharge.auth.key}")
227
    private String oxigenRechargeAuthKey;
23724 amit.gupta 228
 
31697 amit.gupta 229
    @Value("${oxigen.recharge.validation.url}")
230
    private String oxigenRechargeValidationUrl;
23724 amit.gupta 231
 
31697 amit.gupta 232
    @Value("${oxigen.recharge.validation.auth.key}")
233
    private String oxigenRechargeValidationAuthKey;
23724 amit.gupta 234
 
31697 amit.gupta 235
    @Value("${think.walnut.digital.recharge.transaction.mobile.url}")
236
    private String thinkWalnutDigitalRechargeTransactionMobileUrl;
23724 amit.gupta 237
 
31697 amit.gupta 238
    @Value("${think.walnut.digital.recharge.transaction.dth.url}")
239
    private String thinkWalnutDigitalRechargeTransactionDthUrl;
23724 amit.gupta 240
 
31697 amit.gupta 241
    @Value("${think.walnut.digital.recharge.enquiry.url}")
242
    private String thinkWalnutDigitalRechargeEnquiryUrl;
23724 amit.gupta 243
 
31697 amit.gupta 244
    @Value("${think.walnut.digital.recharge.balance.url}")
245
    private String thinkWalnutDigitalRechargeBalanceUrl;
23724 amit.gupta 246
 
31697 amit.gupta 247
    @Value("${think.walnut.digital.recharge.username}")
248
    private String thinkWalnutDigitalRechargeUserName;
23724 amit.gupta 249
 
31697 amit.gupta 250
    @Value("${think.walnut.digital.recharge.password}")
251
    private String thinkWalnutDigitalRechargePassword;
23724 amit.gupta 252
 
31697 amit.gupta 253
    @Value("${think.walnut.digital.recharge.auth.key}")
254
    private String thinkWalnutDigitalRechargeAuthKey;
23724 amit.gupta 255
 
31697 amit.gupta 256
    @Autowired
257
    private PurchaseRepository purchaseRepository;
23724 amit.gupta 258
 
31697 amit.gupta 259
    @Autowired
260
    private PriceDropIMEIRepository priceDropIMEIRepository;
25609 amit.gupta 261
 
31697 amit.gupta 262
    @Autowired
263
    PriceDropRepository priceDropRepository;
25609 amit.gupta 264
 
31697 amit.gupta 265
    @Autowired
266
    private PartnerTypeChangeRepository partnerTypeChangeRepository;
28368 tejbeer 267
 
31697 amit.gupta 268
    @Autowired
269
    private SchemeService schemeService;
24683 amit.gupta 270
 
31697 amit.gupta 271
    @Autowired
272
    private ServiceConfigRepository serviceConfigRepository;
29668 tejbeer 273
 
32061 amit.gupta 274
    @Autowired
275
    private RetailerBlockBrandsRepository retailerBlockBrandsRepository;
276
 
31886 tejbeer 277
    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.gupta@smartdukaan.com"};
25609 amit.gupta 278
 
31886 tejbeer 279
    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 280
 
33664 amit.gupta 281
    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 282
 
31886 tejbeer 283
    private static final String[] EMPLOYEE_ATTENDANCE_MAIL_LIST = new String[]{"sm@smartdukaan.com", "sm@smartdukaan.com"};
28790 amit.gupta 284
 
31697 amit.gupta 285
    private List<OrderStatus> orderStatusList = Arrays.asList(OrderStatus.SUBMITTED_FOR_PROCESSING);
25721 tejbeer 286
 
31697 amit.gupta 287
    @Autowired
288
    private ReporticoService reporticoService;
23724 amit.gupta 289
 
31697 amit.gupta 290
    @Autowired
291
    private PartnerInvestmentService partnerInvestmentService;
25598 amit.gupta 292
 
31697 amit.gupta 293
    @Autowired
294
    private PositionRepository positionRepository;
24337 amit.gupta 295
 
31697 amit.gupta 296
    @Autowired
297
    private FofoOrderItemRepository fofoOrderItemRepository;
25865 amit.gupta 298
 
31697 amit.gupta 299
    @Autowired
300
    private NotificationService notificationService;
24542 amit.gupta 301
 
31697 amit.gupta 302
    @Autowired
303
    private PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
24277 amit.gupta 304
 
31697 amit.gupta 305
    @Autowired
306
    private SchemeInOutRepository schemeInOutRepository;
24241 amit.gupta 307
 
31697 amit.gupta 308
    @Autowired
309
    private RechargeTransactionRepository rechargeTransactionRepository;
23724 amit.gupta 310
 
31697 amit.gupta 311
    @Autowired
312
    private CustomerAddressRepository customerAddressRepository;
24542 amit.gupta 313
 
31697 amit.gupta 314
    @Autowired
315
    private RechargeProviderCreditWalletHistoryRepository rechargeProviderCreditWalletHistoryRepository;
23724 amit.gupta 316
 
31697 amit.gupta 317
    @Autowired
318
    private FofoLineItemRepository fofoLineItemRepository;
24590 amit.gupta 319
 
31697 amit.gupta 320
    @Autowired
321
    private FofoOrderRepository fofoOrderRepository;
24587 amit.gupta 322
 
31697 amit.gupta 323
    @Autowired
324
    private UserWalletHistoryRepository userWalletHistoryRepository;
24250 amit.gupta 325
 
31697 amit.gupta 326
    @Autowired
327
    private UserWalletRepository userWalletRepository;
24587 amit.gupta 328
 
31697 amit.gupta 329
    @Autowired
330
    private InventoryItemRepository inventoryItemRepository;
23929 amit.gupta 331
 
31697 amit.gupta 332
    @Autowired
333
    private WalletService walletService;
23724 amit.gupta 334
 
31697 amit.gupta 335
    @Autowired
336
    private ThinkWalnutDigitalRechargeProviderService thinkWalnutDigitalRechargeProviderService;
23724 amit.gupta 337
 
31697 amit.gupta 338
    @Autowired
339
    private OxigenRechargeProviderService oxigenRechargeProviderService;
23724 amit.gupta 340
 
31697 amit.gupta 341
    @Autowired
342
    private RechargeProviderRepository rechargeProviderRepository;
23724 amit.gupta 343
 
31697 amit.gupta 344
    @Autowired
345
    private ScanRecordRepository scanRecordRepository;
24242 amit.gupta 346
 
31697 amit.gupta 347
    @Autowired
348
    private DailyRechargeRepository dailyRechargeRepository;
23724 amit.gupta 349
 
31697 amit.gupta 350
    @Autowired
351
    private FofoStoreRepository fofoStoreRepository;
24177 govind 352
 
31697 amit.gupta 353
    @Value("${prod}")
354
    private boolean prod;
26945 amit.gupta 355
 
31697 amit.gupta 356
    @Autowired
357
    private StateGstRateRepository stateGstRateRepository;
23724 amit.gupta 358
 
31697 amit.gupta 359
    @Autowired
360
    private RetailerService retailerService;
23929 amit.gupta 361
 
31697 amit.gupta 362
    @Autowired
33078 ranu 363
    private BrandsRepository brandsRepository;
364
 
365
    @Autowired
31697 amit.gupta 366
    private TransactionService transactionService;
24250 amit.gupta 367
 
31697 amit.gupta 368
    @Autowired
369
    private ItemRepository itemRepository;
23929 amit.gupta 370
 
31697 amit.gupta 371
    @Autowired
372
    private OrderRepository orderRepository;
25351 tejbeer 373
 
31697 amit.gupta 374
    @Autowired
375
    private OrderService orderService;
23929 amit.gupta 376
 
31697 amit.gupta 377
    @Autowired
378
    private SchemeRepository schemeRepository;
24241 amit.gupta 379
 
31697 amit.gupta 380
    @Autowired
381
    private SchemeItemRepository schemeItemRepository;
31612 tejbeer 382
 
31697 amit.gupta 383
    @Autowired
384
    private JavaMailSender mailSender;
24177 govind 385
 
31697 amit.gupta 386
    @Autowired
387
    private PartnerTargetRepository partnerTargetRepository;
24002 amit.gupta 388
 
31697 amit.gupta 389
    @Autowired
390
    @Qualifier(value = "googleMailSender")
391
    private JavaMailSender googleMailSender;
23929 amit.gupta 392
 
31697 amit.gupta 393
    @Autowired
394
    private InventoryService inventoryService;
23929 amit.gupta 395
 
31697 amit.gupta 396
    @Autowired
397
    private AddressRepository addressRepository;
24542 amit.gupta 398
 
31697 amit.gupta 399
    @Autowired
400
    private RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
24542 amit.gupta 401
 
31697 amit.gupta 402
    @Autowired
403
    private Mongo mongoClient;
24683 amit.gupta 404
 
31697 amit.gupta 405
    @Autowired
406
    private DeviceRepository deviceRepository;
25300 tejbeer 407
 
31697 amit.gupta 408
    @Autowired
409
    private PushNotificationRepository pushNotificationRepository;
25300 tejbeer 410
 
31697 amit.gupta 411
    @Autowired
412
    private NotificationCampaignRepository notificationCampaignRepository;
25300 tejbeer 413
 
31697 amit.gupta 414
    @Autowired
415
    private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
25721 tejbeer 416
 
31697 amit.gupta 417
    @Autowired
418
    private FocusedModelRepository focusedModelRepository;
25721 tejbeer 419
 
31697 amit.gupta 420
    @Autowired
421
    private UserAccountRepository userAccountRepository;
24653 govind 422
 
31697 amit.gupta 423
    @Autowired
424
    private UserRepository userUserRepository;
25721 tejbeer 425
 
31697 amit.gupta 426
    @Autowired
427
    private com.spice.profitmandi.dao.repository.dtr.UserRepository dtrUserRepository;
25927 amit.gupta 428
 
31697 amit.gupta 429
    @Autowired
430
    private UserCampaignRepository userCampaignRepository;
25721 tejbeer 431
 
31697 amit.gupta 432
    @Autowired
433
    private Gson gson;
25721 tejbeer 434
 
31697 amit.gupta 435
    @Autowired
436
    private TicketRepository ticketRepository;
26283 tejbeer 437
 
31697 amit.gupta 438
    @Autowired
439
    private RefferalRepository refferalRepository;
26790 tejbeer 440
 
31697 amit.gupta 441
    @Autowired
442
    private PartnerProblemRepository partnerProblemRepository;
28205 tejbeer 443
 
31697 amit.gupta 444
    @Autowired
445
    private PendingOrderRepository pendingOrderRepository;
28368 tejbeer 446
 
31697 amit.gupta 447
    @Autowired
448
    private PendingOrderItemRepository pendingOrderItemRepository;
28368 tejbeer 449
 
31697 amit.gupta 450
    @Value("${razorpay.account.keyId}")
451
    private String keyId;
28368 tejbeer 452
 
31697 amit.gupta 453
    @Value("${razorpay.account.keySecret}")
454
    private String keySecret;
28368 tejbeer 455
 
31697 amit.gupta 456
    @Autowired
457
    private RazorpayPaymentService razorPaymentService;
28369 tejbeer 458
 
31697 amit.gupta 459
    @Autowired
460
    private RazorPayRepository razorPayRepository;
28369 tejbeer 461
 
31697 amit.gupta 462
    @Autowired
463
    private PendingOrderService pendingOrderService;
28377 tejbeer 464
 
31697 amit.gupta 465
    @Autowired
466
    private CustomerRepository customerRepository;
28377 tejbeer 467
 
31697 amit.gupta 468
    @Autowired
469
    private RestClient restClient;
29308 tejbeer 470
 
31697 amit.gupta 471
    @Autowired
472
    private MandiiService mandiiService;
29814 tejbeer 473
 
31697 amit.gupta 474
    @Autowired
475
    CreditAccountRepository creditAccountRepository;
31604 tejbeer 476
 
31697 amit.gupta 477
    @Autowired
478
    CustomerOfferRepository customerOfferRepository;
31612 tejbeer 479
 
31697 amit.gupta 480
    @Autowired
481
    CustomerOfferItemRepository customerOfferItemRepository;
482
    @Autowired
483
    private FofoSolr fofoSolr;
23724 amit.gupta 484
 
25300 tejbeer 485
 
31697 amit.gupta 486
    private static final Logger LOGGER = LogManager.getLogger(ScheduledTasks.class);
31388 amit.gupta 487
 
31697 amit.gupta 488
    private String FCM_URL = "https://fcm.googleapis.com/fcm/send";
489
    private String FCM_API_KEY = "AAAASAjNcn4:APA91bG6fWRIgYJI0L9gCjP5ynaXz2hJHYKtD9dfH7Depdv31Nd9APJwhx-OPkAJ1WSz4BGNYG8lHThLFSjDGFxIwUZv241YcAJEGDLgt86mxq9FXJe-yBRu-S0_ZwHqmX-QaVKl5F_A";
23724 amit.gupta 490
 
31697 amit.gupta 491
    @Autowired
492
    private TagListingRepository tagListingRepository;
23724 amit.gupta 493
 
31697 amit.gupta 494
    public void generateDailyRecharge() {
31886 tejbeer 495
        List<RechargeProviderCreditWalletHistory> allCreditHistory = rechargeProviderCreditWalletHistoryRepository.selectAll(0, 2000);
31697 amit.gupta 496
        List<RechargeProvider> rechargeProviders = rechargeProviderRepository.selectAll();
497
        rechargeProviders.stream().forEach(x -> x.setAmount(0));
23724 amit.gupta 498
 
31697 amit.gupta 499
        rechargeProviders.stream().forEach(x -> {
31886 tejbeer 500
            Map<LocalDate, List<RechargeProviderCreditWalletHistory>> dateWiseProviderCreditsMap = allCreditHistory.stream().filter(z -> z.getProviderId() == x.getId()).collect(groupingBy(x1 -> x1.getReceiveTimestamp().toLocalDate()));
23724 amit.gupta 501
 
31697 amit.gupta 502
            LOGGER.info("dateWiseProviderCreditsMap -{}", dateWiseProviderCreditsMap);
503
            LocalDate endDate = LocalDate.now().plusDays(1);
504
            float previousDayClosing = 0;
505
            LocalDate date = LocalDate.of(2018, 4, 6);
506
            while (date.isBefore(endDate)) {
31886 tejbeer 507
                List<RechargeTransaction> dateWiseRechargeTransactions = rechargeTransactionRepository.selectAllBetweenTimestamp(Arrays.asList(RechargeStatus.values()), date.atStartOfDay(), date.plusDays(1).atStartOfDay());
23724 amit.gupta 508
 
31886 tejbeer 509
                List<RechargeTransaction> successfulTransactions = dateWiseRechargeTransactions.stream().filter(y -> y.getStatus().equals(RechargeStatus.SUCCESS)).collect(Collectors.toList());
23724 amit.gupta 510
 
31697 amit.gupta 511
                float dailyAmount = 0;
512
                float totalCommission = 0;
513
                for (RechargeTransaction rechargeTransaction : successfulTransactions) {
514
                    if (rechargeTransaction.getProviderId() == x.getId()) {
515
                        dailyAmount += rechargeTransaction.getAmount();
516
                        totalCommission += rechargeTransaction.getCommission();
517
                    }
518
                }
28205 tejbeer 519
 
31697 amit.gupta 520
                List<RechargeProviderCreditWalletHistory> rechargeHistoryList = dateWiseProviderCreditsMap.get(date);
521
                float dailyWalletRecharge = 0;
522
                if (rechargeHistoryList != null) {
523
                    for (RechargeProviderCreditWalletHistory rechargeProviderCreditWalletHistory : rechargeHistoryList) {
524
                        if (rechargeProviderCreditWalletHistory.getProviderId() == x.getId()) {
525
                            dailyWalletRecharge += rechargeProviderCreditWalletHistory.getAmount();
526
                        }
527
                    }
528
                }
529
                if (dailyAmount > 0 || dailyWalletRecharge > 0) {
530
                    DailyRecharge dailyRecharge = null;
531
                    try {
532
                        dailyRecharge = dailyRechargeRepository.selectByProviderIdAndCreateDate(x.getId(), date);
533
                    } catch (Exception e) {
534
                        LOGGER.info("Could not find Recharge entry");
535
                    }
536
                    if (dailyRecharge == null) {
537
                        dailyRecharge = new DailyRecharge();
538
                        dailyRecharge.setCreateDate(date);
539
                    }
540
                    dailyRecharge.setOpeningBalance(previousDayClosing);
541
                    dailyRecharge.setProviderId(x.getId());
542
                    dailyRecharge.setWalletRechargeAmount(dailyWalletRecharge);
543
                    dailyRecharge.setTotalAmount(dailyAmount);
544
                    dailyRecharge.setTotalCommission(totalCommission);
545
                    float closingBalance = dailyRecharge.getOpeningBalance() + dailyWalletRecharge - dailyAmount;
546
                    dailyRecharge.setClosingBalance(closingBalance);
547
                    dailyRechargeRepository.persist(dailyRecharge);
548
                    x.setAmount(x.getAmount() + dailyRecharge.getClosingBalance() - dailyRecharge.getOpeningBalance());
549
                    previousDayClosing = dailyRecharge.getClosingBalance();
550
                }
551
                date = date.plusDays(1);
552
            }
553
            rechargeProviderRepository.persist(x);
554
        });
555
        LOGGER.info("finished generating daily recharge");
556
    }
24240 amit.gupta 557
 
31697 amit.gupta 558
    public void reconcileRecharge() throws Exception {
559
        LocalDateTime fromDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).minusDays(30);
560
        LocalDateTime toDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS);
561
        List<RechargeStatus> nonSuccessRechargeStatuses = new ArrayList<>(Arrays.asList(RechargeStatus.values()));
562
        LOGGER.info("nonSuccessRechargeStatuses {} ", nonSuccessRechargeStatuses);
563
        nonSuccessRechargeStatuses.remove(RechargeStatus.SUCCESS);
564
        nonSuccessRechargeStatuses.remove(RechargeStatus.FAILED);
565
        RechargeCredential thinkWalnutDigitalRechargeEnquiryCredential = new RechargeCredential();
566
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUrl(thinkWalnutDigitalRechargeEnquiryUrl);
567
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUserName(thinkWalnutDigitalRechargeUserName);
568
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargePassword(thinkWalnutDigitalRechargePassword);
569
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargeAuthKey(thinkWalnutDigitalRechargeAuthKey);
570
        Map<String, RechargeStatus> requestRechargeStatusChanged = new HashMap<>();
31886 tejbeer 571
        List<RechargeTransaction> rechargeTransactions = rechargeTransactionRepository.selectAllBetweenTimestamp(nonSuccessRechargeStatuses, fromDate, toDate);
31697 amit.gupta 572
        for (RechargeTransaction rechargeTransaction : rechargeTransactions) {
573
            try {
574
                int providerId = rechargeTransaction.getProviderId();
575
                if (providerId == 1) {
31886 tejbeer 576
                    oxigenRechargeProviderService.doCheckStatusRequest(oxigenRechargeEnquiryUrl, oxigenRechargeAuthKey, rechargeTransaction);
31697 amit.gupta 577
                } else if (providerId == 2) {
31886 tejbeer 578
                    thinkWalnutDigitalRechargeProviderService.doCheckStatusRequest(thinkWalnutDigitalRechargeEnquiryCredential, rechargeTransaction);
31697 amit.gupta 579
                }
31886 tejbeer 580
                if (rechargeTransaction.getStatus().equals(RechargeStatus.SUCCESS) || rechargeTransaction.getStatus().equals(RechargeStatus.FAILED)) {
581
                    requestRechargeStatusChanged.put(rechargeTransaction.getRequestId(), rechargeTransaction.getStatus());
31697 amit.gupta 582
                }
583
            } catch (Exception e) {
584
                LOGGER.info("Could not check status for Request {}", rechargeTransaction.getRequestId());
585
            }
586
        }
587
        LOGGER.info("Reconcile recharge ran successfully");
588
    }
24241 amit.gupta 589
 
31697 amit.gupta 590
    public void processActivation() throws Exception {
591
        schemeService.processActivation();
592
    }
24241 amit.gupta 593
 
31697 amit.gupta 594
    // TemporaryMethod
595
    public void migrateInvoice() {
596
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectFromSaleDate(LocalDateTime.now().minusDays(3));
597
        Map<Integer, List<FofoOrder>> partnerOrdersMap = new HashMap<>();
31886 tejbeer 598
        partnerOrdersMap = fofoOrders.stream().collect(groupingBy(FofoOrder::getFofoId, Collectors.toList()));
31697 amit.gupta 599
        for (List<FofoOrder> orderList : partnerOrdersMap.values()) {
600
            int sequence = 0;
601
            String prefix = "";
31886 tejbeer 602
            List<FofoOrder> sortedList = orderList.stream().sorted((x1, x2) -> x1.getId() - x2.getId()).collect(Collectors.toList());
31697 amit.gupta 603
            for (FofoOrder order : sortedList) {
23724 amit.gupta 604
 
31697 amit.gupta 605
                LOGGER.info("Order Id is {}, partner Id is {}", order.getId(), order.getFofoId());
606
                if (!order.getInvoiceNumber().contains("SEC")) {
607
                    sequence = Integer.parseInt(order.getInvoiceNumber().split("/")[1]);
608
                    prefix = order.getInvoiceNumber().split("/")[0];
609
                } else {
610
                    sequence += 1;
611
                    String invoiceNumber = prefix + "/" + sequence;
612
                    order.setInvoiceNumber(invoiceNumber);
613
                    fofoOrderRepository.persist(order);
614
                }
615
            }
24252 amit.gupta 616
 
31697 amit.gupta 617
        }
618
    }
28205 tejbeer 619
 
31697 amit.gupta 620
    @Autowired
621
    private ReporticoCacheTableRepository reporticoCacheTableRepository;
28205 tejbeer 622
 
31697 amit.gupta 623
    public void processSchemeOut(List<String> invoiceNumbers) throws Exception {
624
        for (String invoiceNumber : invoiceNumbers) {
625
            System.out.println("Invoice Number - " + invoiceNumber);
626
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
32147 amit.gupta 627
            //orderService.reverseScheme(fofoOrder);
31697 amit.gupta 628
            schemeService.processSchemeOut(fofoOrder.getId(), fofoOrder.getFofoId());
629
        }
630
    }
24271 amit.gupta 631
 
31697 amit.gupta 632
    public void processSchemeIn(List<String> invoiceNumbers) throws Exception {
633
        for (String invoiceNumber : invoiceNumbers) {
634
            System.out.println("Invoice Number - " + invoiceNumber);
635
            Purchase purchase = purchaseRepository.selectByPurchaseReference(invoiceNumber);
636
            schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
637
        }
638
    }
24271 amit.gupta 639
 
31697 amit.gupta 640
    public void processScheme(LocalDateTime startDate, LocalDateTime endDate, boolean dryRun) throws Exception {
641
        LOGGER.info("Started execution at {}", LocalDateTime.now());
642
        System.out.println(
643
                "InventoryId\tSerialNumber\tItem Id\tScheme Id\tScheme Name\tScheme Type\tAmount Type\tDP\tTaxable\tScheme Amount\tAmount Paid");
644
        try {
645
            List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
646
            for (Purchase purchase : purchases) {
647
                schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
648
            }
29160 amit.gupta 649
 
31697 amit.gupta 650
            List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
651
            for (FofoOrder fofoOrder : fofoOrders) {
652
                schemeService.processSchemeOut(fofoOrder.getId(), fofoOrder.getFofoId());
653
            }
654
        } catch (Exception e) {
655
            e.printStackTrace();
656
            throw e;
657
        }
31886 tejbeer 658
        List<UserWalletHistory> uwhs = userWalletHistoryRepository.selectAllByDateType(LocalDate.now().atStartOfDay(), endDate, Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
31697 amit.gupta 659
        System.out.println("Amount\tReference\tReferenceType\tTimestamp\tDescription");
660
        for (UserWalletHistory uwh : uwhs) {
31886 tejbeer 661
            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 662
        }
663
        LOGGER.info("Schemes processed successfully.");
664
        if (dryRun) {
665
            throw new Exception();
666
        }
667
    }
29160 amit.gupta 668
 
31697 amit.gupta 669
    public void processRechargeCashback() throws Throwable {
670
        LocalDateTime cashbackTime = LocalDateTime.now();
671
        int referenceId = (int) Timestamp.valueOf(cashbackTime).getTime() / 1000;
31886 tejbeer 672
        List<RechargeTransaction> pendingTransactions = rechargeTransactionRepository.getPendingCashBackRehargeTransactions();
31697 amit.gupta 673
        Map<Object, Double> totalRetailerCashbacks = pendingTransactions.stream().collect(
31724 amit.gupta 674
                groupingBy(x -> x.getRetailerId(), Collectors.summingDouble(x -> x.getCommission())));
33452 amit.gupta 675
        for (Entry<Object, Double> totalRetailerCashback : totalRetailerCashbacks.entrySet()) {
31697 amit.gupta 676
            int retailerId = (Integer) totalRetailerCashback.getKey();
677
            float amount = totalRetailerCashback.getValue().floatValue();
678
            if (Math.round(amount) > 0) {
31886 tejbeer 679
                walletService.addAmountToWallet(retailerId, referenceId, WalletReferenceType.CASHBACK, "Recharge Cashback", Math.round(amount), LocalDateTime.now());
31697 amit.gupta 680
            }
681
        }
682
        for (RechargeTransaction rt : pendingTransactions) {
683
            rt.setCashbackTimestamp(cashbackTime);
684
            rt.setCashbackReference(referenceId);
685
            rechargeTransactionRepository.persist(rt);
686
        }
687
        LOGGER.info("Cashbacks for Recharge processed Successfully");
688
    }
29160 amit.gupta 689
 
31697 amit.gupta 690
    public void rollOutUpgardedMarginsNextMonth() throws Exception {
691
        LocalDate startOfPreviousMonth = LocalDate.now().with(ChronoField.DAY_OF_MONTH, 1).minusMonths(1);
29160 amit.gupta 692
 
31697 amit.gupta 693
        List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
694
        for (FofoStore store : stores) {
32003 amit.gupta 695
            this.rolloutMarginForStoreOnMonth(store, startOfPreviousMonth);
696
        }
697
    }
29252 amit.gupta 698
 
32003 amit.gupta 699
    public void rolloutMarginForStoreOnMonth(FofoStore store, LocalDate startOfMonth) throws ProfitMandiBusinessException {
700
        int fofoId = store.getId();
29252 amit.gupta 701
 
32003 amit.gupta 702
        PartnerType startOfPreviousMonthPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, startOfMonth);
703
        PartnerType todayPartnerType = partnerTypeChangeService.getTypeOnMonth(fofoId, YearMonth.from(startOfMonth.atStartOfDay()));
704
        if (!startOfPreviousMonthPartnerType.nextPartnerTypes().contains(todayPartnerType)) {
705
            return;
706
        }
707
        if (!startOfPreviousMonthPartnerType.equals(todayPartnerType)) {
708
            LOGGER.info("Partner Type has been changed for code {} from {} to {}", store.getCode(), startOfPreviousMonthPartnerType, todayPartnerType);
709
            List<FofoOrder> fofoOrders = fofoOrderRepository.selectByFofoId(fofoId, startOfMonth.atStartOfDay(), startOfMonth.plusMonths(1).atStartOfDay(), 0, 0);
710
            for (FofoOrder fofoOrder : fofoOrders) {
711
                schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
31697 amit.gupta 712
            }
713
        }
714
    }
29252 amit.gupta 715
 
32003 amit.gupta 716
 
31697 amit.gupta 717
    public void rollOutUpgardedMargins() throws Exception {
718
        LocalDate today = LocalDate.now();
719
        LocalDate yesterday = today.minusDays(1);
720
        int upgradedCount = 0;
721
        List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
722
        StringBuilder sb = new StringBuilder();
723
        for (FofoStore store : stores) {
724
            int fofoId = store.getId();
23724 amit.gupta 725
 
31697 amit.gupta 726
            PartnerType yesterdayPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, yesterday);
727
            PartnerType todayPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, today);
728
            if (!yesterdayPartnerType.nextPartnerTypes().contains(todayPartnerType)) {
729
                continue;
730
            }
731
            if (!yesterdayPartnerType.equals(todayPartnerType)) {
732
                upgradedCount++;
31886 tejbeer 733
                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 734
                sb.append("<br>");
31886 tejbeer 735
                LOGGER.info("Partner Type has been changed for code {} from {} to {}", store.getCode(), yesterdayPartnerType, todayPartnerType);
736
                List<FofoOrder> fofoOrders = fofoOrderRepository.selectByFofoId(fofoId, yesterday.withDayOfMonth(1).atStartOfDay(), yesterday.atStartOfDay(), 0, 0);
31697 amit.gupta 737
                for (FofoOrder fofoOrder : fofoOrders) {
738
                    schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
739
                }
30390 amit.gupta 740
 
31697 amit.gupta 741
            }
742
        }
743
        if (upgradedCount > 0) {
32439 tejbeer 744
            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 745
        } else {
32439 tejbeer 746
            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 747
        }
748
    }
30393 amit.gupta 749
 
31697 amit.gupta 750
    @Autowired
751
    private PartnerStatsService partnerStatsService;
30393 amit.gupta 752
 
31697 amit.gupta 753
    // Temporary Method
754
    public void evaluateExcessSchemeOut() throws Exception {
755
        Map<Integer, String> userNameMap = retailerService.getAllFofoRetailerIdNameMap();
756
        Map<Integer, Float> userAmountMap = new HashMap<>();
30393 amit.gupta 757
 
31697 amit.gupta 758
        List<List<?>> rows = new ArrayList<>();
31886 tejbeer 759
        List<String> headers = Arrays.asList("Scheme", "Item", "Partner", "Amount", "Credited On", "Invoice Number", "Sale On", "Scheme Start", "Scheme End", "Active On", "Expired On");
33256 amit.gupta 760
        for (Scheme scheme : schemeRepository.selectAll()) {
761
            if (scheme.getType().equals(SchemeType.OUT)) {
762
                List<SchemeInOut> sioList = schemeInOutRepository.selectBySchemeIds(new HashSet<>(Arrays.asList(scheme.getId())));
763
                if (scheme.getActiveTimestamp() != null) {
764
                    LocalDateTime endDateTime = scheme.getEndDateTime();
765
                    if (scheme.getExpireTimestamp() != null && scheme.getExpireTimestamp().isBefore(scheme.getEndDateTime())) {
766
                        endDateTime = scheme.getExpireTimestamp();
31697 amit.gupta 767
                    }
768
                    for (SchemeInOut sio : sioList) {
769
                        InventoryItem inventoryItem = null;
770
                        inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
771
                        FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndSerialNumber(
772
                                inventoryItem.getFofoId(), inventoryItem.getSerialNumber(), null, null, 0, 1).get(0);
31886 tejbeer 773
                        Optional<ScanRecord> record = scanRecordRepository.selectByInventoryItemId(sio.getInventoryItemId()).stream().filter(y -> y.getType().equals(ScanType.SALE)).findFirst();
31697 amit.gupta 774
                        if (record.isPresent()) {
775
                            int fofoId = record.get().getFofoId();
33256 amit.gupta 776
                            if (record.get().getCreateTimestamp().isAfter(endDateTime) || record.get().getCreateTimestamp().isBefore(scheme.getStartDateTime())) {
31697 amit.gupta 777
                                if (!userAmountMap.containsKey(fofoId)) {
778
                                    userAmountMap.put(fofoId, 0f);
779
                                }
780
                                userAmountMap.put(fofoId, sio.getAmount() + userAmountMap.get(fofoId));
781
                                try {
33256 amit.gupta 782
                                    rows.add(Arrays.asList(scheme.getDescription(), itemRepository.selectById(inventoryItem.getItemId()).getItemDescription(), userNameMap.get(fofoId), sio.getAmount(), FormattingUtils.formatDate(sio.getCreateTimestamp()), fofoOrder.getInvoiceNumber(), FormattingUtils.formatDate(record.get().getCreateTimestamp()), FormattingUtils.formatDate(scheme.getStartDateTime()), FormattingUtils.formatDate(scheme.getEndDateTime()), FormattingUtils.formatDate(scheme.getActiveTimestamp()), FormattingUtils.formatDate(scheme.getExpireTimestamp())));
31697 amit.gupta 783
                                } catch (Exception e) {
784
                                    e.printStackTrace();
785
                                }
786
                            }
787
                        }
788
                    }
789
                }
790
            }
33256 amit.gupta 791
        }
31886 tejbeer 792
        userAmountMap.entrySet().stream().forEach(x -> LOGGER.info("{} to be deducted from {}({}) for wrongly disbursed due to technical error.", x.getValue(), userNameMap.get(x.getKey())));
30393 amit.gupta 793
 
31697 amit.gupta 794
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
31886 tejbeer 795
        Utils.sendMailWithAttachment(googleMailSender, new String[]{"amit.gupta@shop2020.in"}, null, "Partner Excess Amount", "PFA", "ListofSchemes.csv", new ByteArrayResource(baos.toByteArray()));
30390 amit.gupta 796
 
31697 amit.gupta 797
    }
30390 amit.gupta 798
 
31697 amit.gupta 799
    public void fetchParnterStats() throws Exception {
800
        Map<Integer, PartnerDetailModel> partnerStats = partnerStatsService.getAllPartnerStats();
801
        ObjectOutputStream oos = null;
802
        FileOutputStream fout = null;
803
        try {
804
            fout = new FileOutputStream("/tmp/partnerStat.tmp", false);
805
            oos = new ObjectOutputStream(fout);
806
            oos.writeObject(partnerStats);
30637 amit.gupta 807
 
31697 amit.gupta 808
        } catch (Exception ex) {
809
            ex.printStackTrace();
810
        } finally {
811
            if (oos != null) {
812
                oos.close();
813
            }
814
        }
32421 amit.gupta 815
        ReporticoCacheTable reporticoCacheTable = reporticoCacheTableRepository.selectByTableName("partnerStat");
816
        if (reporticoCacheTable == null) {
817
            reporticoCacheTable = new ReporticoCacheTable();
818
            reporticoCacheTable.setTableName("partnerStat");
819
            reporticoCacheTable.setLastCreatedTimestamp(LocalDateTime.now());
820
            reporticoCacheTableRepository.persist(reporticoCacheTable);
31697 amit.gupta 821
        } else {
32421 amit.gupta 822
            reporticoCacheTable.setLastCreatedTimestamp(LocalDateTime.now());
31697 amit.gupta 823
        }
824
    }
31008 amit.gupta 825
 
31697 amit.gupta 826
    public void processPriceDrop() throws Exception {
31886 tejbeer 827
        List<PriceDrop> priceDrops = priceDropRepository.selectAllByDatesBetween(LocalDateTime.now(), LocalDateTime.now().minusYears(1));
31697 amit.gupta 828
        for (PriceDrop priceDrop : priceDrops) {
829
            if (priceDrop.getDropAmount() > 0) {
830
                priceDropService.processPriceDrop(priceDrop.getId(), true);
831
            }
832
        }
833
    }
31008 amit.gupta 834
 
31697 amit.gupta 835
    @Autowired
836
    CreditNoteService creditNoteService;
25598 amit.gupta 837
 
31697 amit.gupta 838
    public void sendCreditNote(YearMonth yearMonth) throws Exception {
839
        creditNoteService.issueMonthlyMarginsCN(yearMonth);
840
    }
25598 amit.gupta 841
 
31918 amit.gupta 842
    @Autowired
843
    BrandAgeingLimitRepository brandAgeingLimitRepository;
844
 
845
    @Autowired
846
    AgeingService ageingService;
847
 
848
    public void sendMailForAgeingAlert() throws Exception {
849
        //brandAgeingLimitRepository.selectAll();
850
        Map<String, AgeingModel> ageingModelMap = ageingService.getAllAgeingForSecondary();
851
 
852
        System.out.println(ageingModelMap.size());
853
        List<PartnerAgeingModel> partnerAgeingModels = ageingService.getAllAgeingForTertiary();
854
 
855
 
33452 amit.gupta 856
        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 857
 
33452 amit.gupta 858
        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()));
859
        Attachment attachment1 = new Attachment("secondary-alert.csv", new ByteArrayResource(byteArrayOutputStream.toByteArray()));
860
        Attachment attachment2 = new Attachment("tertiary-alert.csv", new ByteArrayResource(byteArrayOutputStream2.toByteArray()));
31918 amit.gupta 861
 
862
        String mailSubject = "Stock ageing Alert";
863
        Utils.sendMailWithAttachments(mailSender, new String[]{"deena.nath@smartdukaan.com"}, null, mailSubject, "PFA", attachment1, attachment2);
864
    }
865
 
32724 amit.gupta 866
    public void rejectPriceDropsOfApprovedImeis() throws ProfitMandiBusinessException {
32690 amit.gupta 867
        priceDropService.rejectPriceDropsOfApprovedImeis();
868
    }
869
 
33357 amit.gupta 870
    public void processDeductions() {
871
        sidbiService.processDeductions();
872
    }
873
 
31697 amit.gupta 874
    private class SaleRoles {
25598 amit.gupta 875
 
31697 amit.gupta 876
        private List<String> l1;
877
        private List<String> l2;
25598 amit.gupta 878
 
31697 amit.gupta 879
        public SaleRoles() {
880
            l1 = new ArrayList<>();
881
            l2 = new ArrayList<>();
882
        }
25598 amit.gupta 883
 
31697 amit.gupta 884
        public List<String> getL1() {
885
            return l1;
886
        }
25598 amit.gupta 887
 
31697 amit.gupta 888
        public List<String> getL2() {
889
            return l2;
890
        }
26945 amit.gupta 891
 
31697 amit.gupta 892
    }
26945 amit.gupta 893
 
31697 amit.gupta 894
    private class FofoReportingModel {
895
        private String code;
896
        private int fofoId;
897
        private String businessName;
898
        private String territoryManager;
899
        private String regionalManager;
900
        private String businessManager;
26945 amit.gupta 901
 
31697 amit.gupta 902
        public String getCode() {
903
            return code;
904
        }
26945 amit.gupta 905
 
31697 amit.gupta 906
        public void setCode(String code) {
907
            this.code = code;
908
        }
26945 amit.gupta 909
 
31697 amit.gupta 910
        public String getBusinessName() {
911
            return businessName;
912
        }
26945 amit.gupta 913
 
31697 amit.gupta 914
        public void setBusinessName(String businessName) {
915
            this.businessName = businessName;
916
        }
26945 amit.gupta 917
 
31697 amit.gupta 918
        public String getTerritoryManager() {
919
            return territoryManager;
920
        }
26945 amit.gupta 921
 
31697 amit.gupta 922
        public void setTerritoryManager(String territoryManager) {
923
            this.territoryManager = territoryManager;
924
        }
26945 amit.gupta 925
 
31697 amit.gupta 926
        public String getRegionalManager() {
927
            return regionalManager;
928
        }
26945 amit.gupta 929
 
31697 amit.gupta 930
        public void setRegionalManager(String regionalManager) {
931
            this.regionalManager = regionalManager;
932
        }
26945 amit.gupta 933
 
31697 amit.gupta 934
        private ScheduledTasks getOuterType() {
935
            return ScheduledTasks.this;
936
        }
26945 amit.gupta 937
 
31697 amit.gupta 938
        @Override
939
        public String toString() {
31886 tejbeer 940
            return "FofoReportingModel{" + "code='" + code + '\'' + ", fofoId=" + fofoId + ", businessName='" + businessName + '\'' + ", territoryManager='" + territoryManager + '\'' + ", regionalManager='" + regionalManager + '\'' + ", businessManager='" + businessManager + '\'' + '}';
31697 amit.gupta 941
        }
26945 amit.gupta 942
 
31697 amit.gupta 943
        @Override
944
        public boolean equals(Object o) {
945
            if (this == o) return true;
946
            if (o == null || getClass() != o.getClass()) return false;
947
            FofoReportingModel that = (FofoReportingModel) o;
948
            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);
949
        }
26945 amit.gupta 950
 
31697 amit.gupta 951
        @Override
952
        public int hashCode() {
953
            return Objects.hash(code, fofoId, businessName, territoryManager, regionalManager, businessManager);
954
        }
26945 amit.gupta 955
 
31697 amit.gupta 956
        public String getBusinessManager() {
957
            return businessManager;
958
        }
26945 amit.gupta 959
 
31697 amit.gupta 960
        public void setBusinessManager(String businessManager) {
961
            this.businessManager = businessManager;
962
        }
25351 tejbeer 963
 
31697 amit.gupta 964
        public int getFofoId() {
965
            return fofoId;
966
        }
25598 amit.gupta 967
 
31697 amit.gupta 968
        public void setFofoId(int fofoId) {
969
            this.fofoId = fofoId;
970
        }
25598 amit.gupta 971
 
31697 amit.gupta 972
    }
26945 amit.gupta 973
 
31697 amit.gupta 974
    @Autowired
975
    WarehouseInventoryItemRepository warehouseInventoryItemRepository;
26945 amit.gupta 976
 
31746 amit.gupta 977
    @Autowired
978
    OfferService offerService;
979
 
980
    @Autowired
981
    PurchaseReturnItemRepository purchaseReturnItemRepository;
982
 
31918 amit.gupta 983
    @Autowired
984
    BrandRegionMappingRepository brandRegionMappingRepository;
985
 
32161 tejbeer 986
    @Autowired
987
    StandAlone standAlone;
32214 jai.hind 988
    @Autowired
989
    ItelImeiActivationNewService itelImeiActivationNewService;
32350 amit.gupta 990
 
991
    public void checkItelImeiActivationNew(LocalDate date, Integer day) throws Exception {
32063 amit.gupta 992
        try {
32223 amit.gupta 993
            itelImeiActivationNewService.checkItelImeiActivationNew(date, day);
32063 amit.gupta 994
        } catch (Throwable e) {
995
            throw new Exception(e);
996
        }
32223 amit.gupta 997
    }
32062 amit.gupta 998
 
32511 amit.gupta 999
    @Autowired
1000
    PurchaseReturnService purchaseReturnService;
1001
 
32682 amit.gupta 1002
    @Autowired
1003
    JavaMailSender javaMailSender;
1004
 
32795 amit.gupta 1005
    @Autowired
1006
    OfferPayoutRepository offerPayoutRepository;
1007
 
1008
    @Autowired
1009
    OfferRepository offerRepository;
1010
 
32817 amit.gupta 1011
    @Autowired
1012
    BluedartAuthService bluedartAuthService;
1013
    @Autowired
1014
    BluedartService bluedartService;
1015
 
1016
    @Autowired
1017
    TransactionRelatedTasks transactionRelatedTasks;
1018
 
32872 amit.gupta 1019
    @Autowired
1020
    PsiSmartService psiSmartService;
32948 amit.gupta 1021
 
32961 amit.gupta 1022
    private void migrateValentine() throws ProfitMandiBusinessException {
1023
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.now().atStartOfDay(), LocalDateTime.now());
1024
        for (FofoOrder fofoOrder : fofoOrders) {
1025
            orderService.processScratchOffer(fofoOrder);
1026
        }
1027
    }
33051 amit.gupta 1028
 
32990 amit.gupta 1029
    @Autowired
1030
    InvoiceService invoiceService;
1031
 
33384 amit.gupta 1032
    @Autowired
1033
    WarehouseService warehouseService;
1034
 
33452 amit.gupta 1035
    @Autowired
1036
    GenericRepository genericRepository;
1037
 
1038
    @Autowired
1039
    PriceCircularService priceCircularService;
1040
 
33638 amit.gupta 1041
    @Autowired
1042
    RedisCacheManager redisFortnightlyCacheManage;
1043
 
1044
    @Autowired
1045
    GstProAuthService gstProAuthService;
33664 amit.gupta 1046
 
33817 amit.gupta 1047
    @Autowired
1048
    GstProService gstProService;
1049
 
1050
    @Autowired
1051
    WarehouseProviderRepository warehouseProviderRepository;
33316 amit.gupta 1052
    public void test() throws Exception {
33832 ranu 1053
        sdCreditService.createLoan(175139295,93000,0,"Amount added for loan adjustment");
33820 ranu 1054
        //this.checkfocusedModelInPartnerStock();
33821 ranu 1055
       // List<SDCreditRequirement> sdCreditRequirements = sdCreditRequirementRepository.selectAll();
33817 amit.gupta 1056
        /*for (SDCreditRequirement sdCreditRequirement : sdCreditRequirements) {
33706 amit.gupta 1057
            long utilizationAmount = sdCreditService.getUtilizationAmount(sdCreditRequirement.getFofoId());
1058
            if (Math.abs(sdCreditRequirement.getUtilizedAmount().doubleValue() - utilizationAmount) > 5) {
1059
                sdCreditRequirement.setUtilizedAmount(BigDecimal.valueOf(utilizationAmount));
33664 amit.gupta 1060
            }
1061
 
33817 amit.gupta 1062
        }*/
1063
        //warehouseProviderRepository.selectAllByWarehouseId(1);
1064
        /*String sellerGstin = GstProService.SANDBOX_GST_NUMBER;
1065
        E_InvoiceCommon.RespAuthPl respAuthPl = gstProAuthService.getAuthToken(sellerGstin);
1066
        if (LocalDateTime.now().isAfter(respAuthPl.getData().TokenExpiry)) {
1067
            redisFortnightlyCacheManage.getCache("gstAuthToken").evict(sellerGstin);
1068
            respAuthPl = gstProAuthService.getAuthToken(sellerGstin);
33664 amit.gupta 1069
        }
33817 amit.gupta 1070
        Map<String, String> authMap = gstProAuthService.getAuthHeaders(sellerGstin);
1071
        String authToken = respAuthPl.getData().getAuthToken();
1072
        authMap.put("AuthToken", authToken);
1073
        authMap.put("QrCodeSize", "250");
1074
        authMap.put("ParseIrnResp", "1");
1075
        authMap.put("Content-Type", "application/json; charset=utf-8");
1076
        authMap.put("AuthToken", authToken);
1077
        authMap.put("QrCodeSize", "250");
1078
        authMap.put("ParseIrnResp", "1");
1079
        authMap.put("Content-Type", "application/json; charset=utf-8");
1080
 
1081
        System.out.println(gstProService.getEInvoiceByIrn(authMap, "5d95f5759fdfe48aeb86a7605727f37fc472d779a0f7bfbff98669e06dfd5ab2"));*/
1082
 
1083
        //List<Loan> loans = loanRepository.selectAllLoan();
1084
 
1085
        /*System.out.println(ageingService.getAllAgeingForWarehouseBilling(8718, Arrays.asList(34354)));
1086
        System.out.println(ageingService.getAllAgeingForWarehouseBilling(8646, Arrays.asList(36323)));
1087
        System.out.println(ageingService.getAllAgeingForWarehouseBilling(8954, Arrays.asList(34358)));*/
33820 ranu 1088
        //System.out.println(ageingService.getAgeingForWarehouseBilling(8718, Arrays.asList(new ItemIdQuantity(34354,10))));
33452 amit.gupta 1089
    }
1090
 
1091
    public void test4() throws Exception {
1092
        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);
1093
        for (Integer offerId : offerIds) {
1094
            Offer fromOffer = offerRepository.selectById(offerId);
1095
            CreateOfferRequest createOfferRequest = offerService.getCreateOfferRequest(fromOffer);
1096
            System.out.println("Processing offer Id " + fromOffer);
1097
            offerService.processActivationtOffer(createOfferRequest);
1098
        }
33433 amit.gupta 1099
        //sdCreditService.checkLoans();
33384 amit.gupta 1100
        /*System.out.println(warehouseService.moveToBad(Arrays.asList("860374066889716",
1101
                "863587077946699",
1102
                "865883067303639",
1103
                "868116066180113",
1104
                "868116066179719")));*/
33423 amit.gupta 1105
        /*System.out.println(warehouseService.moveToGood(Arrays.asList("354814720314877",
33391 amit.gupta 1106
                "43356/c21100001116",
33423 amit.gupta 1107
                "34850/c21100054629")));*/
33355 amit.gupta 1108
        //this.test1();
33433 amit.gupta 1109
        this.processSidbiDeductions();
33316 amit.gupta 1110
        /*List<Order> orders = orderRepository.selectByInvoiceNumber("NSDL43328");
1111
        invoiceService.saveInvoice(orders);*/
33355 amit.gupta 1112
        /*for ( int fofoId : Arrays.asList(4149607,175138674,175138854,175138934,175138958,175139138,175139150,175139245,175139259,175139306,175139324,175139344,175139346,175139362,175139386,175139395,175139412,175139452,175139455,175139460,175139462,175139463,175139488,175139489,175139499,175139504,175139508,175139511,175139513,175139521,175139524,175139531,175139532,175139557,175139559,175139576,175139603,175139605,175139608,175139612,175139621,175139630,175139638,175139657,175139661,175139690,175139697,175139716,175139731)) {
33317 amit.gupta 1113
            try {
1114
                sdCreditService.fundWallet(fofoId);
1115
            } catch (ProfitMandiBusinessException pbse) {
1116
                LOGGER.info("Failed to fund wallet for - {}", fofoId);
1117
            }
33355 amit.gupta 1118
        }*/
33295 amit.gupta 1119
 
1120
        //transactionService.moveOrdersFulfimentWarehouseByBillingWarehouseId(7573);
32817 amit.gupta 1121
    }
1122
 
1123
    public void test3() throws Exception {
1124
        List<Long> payoutIds = Arrays.asList();
32795 amit.gupta 1125
        List<OfferPayout> offerPayouts = offerPayoutRepository.selectAllByIds(payoutIds);
33452 amit.gupta 1126
        Map<Integer, List<OfferPayout>> offerPayoutMap = offerPayouts.stream().collect(groupingBy(x -> (int) x.getOfferId()));
1127
        for (Entry<Integer, List<OfferPayout>> offerPayoutEntry : offerPayoutMap.entrySet()) {
32795 amit.gupta 1128
            int offerId = offerPayoutEntry.getKey();
1129
            List<OfferPayout> offerPayoutList = offerPayoutEntry.getValue();
33452 amit.gupta 1130
            Map<Integer, List<OfferPayout>> partnerOfferPayoutMap = offerPayoutList.stream().collect(groupingBy(x -> (int) x.getFofoId()));
32795 amit.gupta 1131
            for (Entry<Integer, List<OfferPayout>> partnerOfferPayoutEntry : partnerOfferPayoutMap.entrySet()) {
1132
                int fofoId = partnerOfferPayoutEntry.getKey();
1133
                List<OfferPayout> partnerPayouts = partnerOfferPayoutEntry.getValue();
1134
                float amount = 0;
1135
                for (OfferPayout offerPayout : partnerPayouts) {
1136
                    amount += offerPayout.getAmount();
1137
                    offerPayout.setStatus(SchemePayoutStatus.REJECTED);
1138
                    offerPayout.setRejectTimestamp(LocalDateTime.now());
1139
                }
1140
                walletService.rollbackAmountFromWallet(fofoId, amount, offerId,
1141
                        WalletReferenceType.ADDITIONAL_SCHEME, "Imeis returned - " + partnerPayouts.size() + "pc(s)", LocalDateTime.now());
1142
            }
1143
        }
1144
    }
1145
 
33316 amit.gupta 1146
    public void test1() throws Exception {
32690 amit.gupta 1147
        System.out.println("Hello from test");
32724 amit.gupta 1148
        //this.calculateInterestAccured();
32690 amit.gupta 1149
        //sendMailOfHtmlFormat(javaMailSender, new String[]{"amit.gupta@smartdukaan.com"}, "hello", null, "Hello");
32698 amit.gupta 1150
        //priceDropService.rejectPriceDropsOfApprovedImeis();
32511 amit.gupta 1151
        //Create return
32600 amit.gupta 1152
        //this.updatePartnerLimit();
32607 ranu 1153
        //creditNoteService.sendCnMails(YearMonth.now().minusMonths(2));
32690 amit.gupta 1154
        //orderService.createMissingScratchOffers();
33315 amit.gupta 1155
        LocalDateTime debitNoteDate = LocalDate.of(2024, Month.APRIL, 30).atStartOfDay();
32698 amit.gupta 1156
        Map<Integer, Set<String>> fofoIdImeiReturnMap = new LinkedHashMap<>();
33355 amit.gupta 1157
        /*fofoIdImeiReturnMap.put(175139690,	new HashSet<>(Arrays.asList("862054078463472","863862077158219","866202075810858","866202077654494","866335072023651","866518078002718")));
33315 amit.gupta 1158
        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")));
1159
        fofoIdImeiReturnMap.put(175139603,	new HashSet<>(Arrays.asList("350886063151961","356412387787135","357594162824701","357594162874771","860600078193972","863862077025350","863862077875796","863967075815072","866335073794995","866335074287874","869116067546048")));
1160
        fofoIdImeiReturnMap.put(175139657,	new HashSet<>(Arrays.asList("350933415734746","354324787135850","354324788766356","354990352512960","354990352580181","358142881241184","866611064207332","869116067600464")));
1161
        fofoIdImeiReturnMap.put(175139223,	new HashSet<>(Arrays.asList("350210770983048","350210771169027","350210771179844","350210771180784","863975067090596","866611060326797","868565075758196","869452074016992","869452074609515","869452074609556","869452074976674","869452074978654")));
1162
        fofoIdImeiReturnMap.put(175139557,	new HashSet<>(Arrays.asList("861977073551795","861977073552678","861977074486819","862046062571245","862046067278226","862046067734921","862046067756866","864468070394741","864468071225506","864468071668341","864468073604740","864468074854625","866993074734475")));
1163
        fofoIdImeiReturnMap.put(175139079,	new HashSet<>(Arrays.asList("862046068861921","862282079169299","865388071283496","866335072007753","866335073946256","866518073601712","866518077425993","866518078760471","868938062675394","868938062690799","868938064895552")));
1164
        fofoIdImeiReturnMap.put(175139711,	new HashSet<>(Arrays.asList("861753065266498","861888066009099","864468073703369","866993071640154","869116062800465")));
1165
        fofoIdImeiReturnMap.put(175139488,	new HashSet<>(Arrays.asList("862054076866114","862054076866650","866335071879079","866335077875998","866335077876095","866518078758939","868938062692878")));
1166
        fofoIdImeiReturnMap.put(175138934,	new HashSet<>(Arrays.asList("862054072810231","862054072823150","862054076867674","862054078659590","863862075768456","863862077158193","863975064472490","863975064473233","865388071160033","865610079408035","866335072117370","866335073899471","866335074306153","866335075664477","868938062669876","868938062677895","868938062685997")));
1167
        fofoIdImeiReturnMap.put(4149607	 ,   new HashSet<>(Arrays.asList("864468073415741","864468075548523","864468075549927","864468079499426","866657074106022","868938062686656","868938062696978","868938062699352","868938064895198","868938066363799")));
1168
        fofoIdImeiReturnMap.put(175139138,	new HashSet<>(Arrays.asList("862286066217631","864259076533691","864468073358842","864487061610014","864487061675918","866083066080028","866518078760950","866518078768979","866657075343848","868544061108518","868544061138432","869116065510848","869116065519781","869452074116891","869452074972939")));
1169
        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")));
1170
        fofoIdImeiReturnMap.put(175139731,	new HashSet<>(Arrays.asList("860600079214413","861753063502217","861753065084172","861753065084636","863975064472094","863975064473076","863975064477218","864468074456462","865883068726994","866657074641481","866657078016946","868938062699832","868938062700754")));
1171
        fofoIdImeiReturnMap.put(175138958,	new HashSet<>(Arrays.asList("863862075766393","864179064784108","866202075811732","866202076252654","866202078005571","868544060277439")));
1172
        fofoIdImeiReturnMap.put(175139612,	new HashSet<>(Arrays.asList("864468073474946","864468073477808","864468075031082","864468075280689","864468075745723","864468079481747","864468079483123","866657074538125","866657074538141","866657074573106","867467071856465","867467071875465","867467071891223","867467071913845","867467072729125","867467072760088")));
1173
        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")));
1174
        fofoIdImeiReturnMap.put(175139245,	new HashSet<>(Arrays.asList("354324787133962","354324787569397","354324787602750","863816078139719","863816078448318","866335070534139")));
1175
        fofoIdImeiReturnMap.put(175139324,	new HashSet<>(Arrays.asList("863718060410316","863862075060755","865610074109257","866518078844457","866518079735159")));
1176
        fofoIdImeiReturnMap.put(175139576,	new HashSet<>(Arrays.asList("354324789013261","861128071288044","862736064686138","863718062236859","863816074642674","863816074646691","864259078939631","867467071870367","867467072760625","868565073047048")));
1177
        fofoIdImeiReturnMap.put(175139150,	new HashSet<>(Arrays.asList("860492060436217","861977073052257","862054073026738","862054073052056","863862077158938","866993074147710","867907071407074","868938060257450","868956064835055")));
1178
        fofoIdImeiReturnMap.put(175139463,	new HashSet<>(Arrays.asList("862181066909552","863816077757719","863816078448516","864214068977273","866335070447936","866335071699212","866335071699592","866335071700291")));
1179
        fofoIdImeiReturnMap.put(175139722,	new HashSet<>(Arrays.asList("358250293364682","358250294683627","358250295102007","861858064421273","861888066009537","864214068983198","864259078491112","864259078787733","865883068445694","866335072878930","866518078371014","868492068014968","868565072254660","868565073401468","868565073465661")));
1180
        fofoIdImeiReturnMap.put(168311083,	new HashSet<>(Arrays.asList("863718064506176","864468070873488","865883068175572","866335071204435","866335072093738","866518077064313","866657077386209","866657077862282","868938061427359")));
1181
        fofoIdImeiReturnMap.put(175139691,	new HashSet<>(Arrays.asList("863718061338714","863718061339258")));
1182
        fofoIdImeiReturnMap.put(175139395,	new HashSet<>(Arrays.asList("860492060436910","861220079009850","862054077288730","863511068660374","863718060300574","863718060617936","866335072874111","869452070894897")));
1183
        fofoIdImeiReturnMap.put(175139621,	new HashSet<>(Arrays.asList("351240553452191","351240553483527","351240553502920","354990353485570","860492062979750","860492062980998","864214068585274","864214068784398","864214068795378","864214068946534","864214068946757","864214068982075","868938061418754","868938061427391","868938062623139")));
1184
        fofoIdImeiReturnMap.put(175139638,	new HashSet<>(Arrays.asList("863862077159191","866518078780438","866518079750471","868428060238049","868938061532836","868938062619517")));
1185
        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")));
1186
        fofoIdImeiReturnMap.put(175139513,	new HashSet<>(Arrays.asList("861977073670355","863718060618439","864468075204986","868024064295935","868024065473754","868024065567811","868024065763972","868956063947893")));
1187
        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")));
1188
        fofoIdImeiReturnMap.put(175139359,	new HashSet<>(Arrays.asList("358250293060942","358250293061387","863718063044252","863862077160991","866335072536793","866335072536975","866335072537130","866335072726691","866335072726733","866335073628532","866335073925250","866335073925292","866335073926233","866335075267156")));
1189
        fofoIdImeiReturnMap.put(175139397,	new HashSet<>(Arrays.asList("861977073659010","863511069721050","864468071611101","864468074432844","864468074435284")));
1190
        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")));
1191
        fofoIdImeiReturnMap.put(175139460,	new HashSet<>(Arrays.asList("860492061918494","862054079983072","862054079983171","866335070533032","866518078995119","866518079014993","868938060095017")));
1192
        fofoIdImeiReturnMap.put(175139585,	new HashSet<>(Arrays.asList("358250293614706","358250293614904","358250294602908","358250294603120","358250295002181","861977074487718","863718061173699","863816078050254","865883068445777","866335070453439","866335070526812","866335071204351","866518078640293","869116067596803")));
1193
        fofoIdImeiReturnMap.put(175139726,	new HashSet<>(Arrays.asList("861858064489411","863718063927654","864468073702221","864468073928784","864468074193149","865883068445819","866657078378742","866657078498904","867949078179850","867949078180494","868544060023197")));
1194
        fofoIdImeiReturnMap.put(175139532,	new HashSet<>(Arrays.asList("863718060615096","863718060615617","863718060727537","863816077797897","866335073405139","868565072217287","868565072264560","868956065132510")));
1195
        fofoIdImeiReturnMap.put(175139462,	new HashSet<>(Arrays.asList("865610074119819","865610074120536","866335072878658","866335072882098","866335073617030")));
1196
        fofoIdImeiReturnMap.put(175139259,	new HashSet<>(Arrays.asList("350210771180644","355300593052348","860492061918213","861858064422651","864259078402572","864259078924310","866335070769719","866335071700556","866335071742558","866657073553208","867949078178530","867949078692472","868024065518616","868024065619091","869116067492540")));
1197
        fofoIdImeiReturnMap.put(175139344,	new HashSet<>(Arrays.asList("350115571135781","354990352587723","358250293362843","358250293363148","862736064732510","865610070849617","865610070851290","866518078899998","868938062623378","868956065234613")));
1198
        fofoIdImeiReturnMap.put(175139602,	new HashSet<>(Arrays.asList("861128070090482","868565072242160","868565072243044","868565072261004","868565073051644")));
1199
        fofoIdImeiReturnMap.put(175139605,	new HashSet<>(Arrays.asList("861515075217922","861515076369466","863816074206397","863816075080072","864259078661755","864468075627368","867467071860541","868565072177903","868565073075726","868565073401625","868938060248012","868938066709652","869452074088611","869452074609234")));
1200
        fofoIdImeiReturnMap.put(175139640,	new HashSet<>(Arrays.asList("358250293363429","358250293363684","861753065277792","863511069733998","864214068943713","864259078496574","864259078518773","864487060042870","864487060050352","865883069366170","866518079782391","867949078692639","867949078692852","868273068551617","868938066464571","869452073150115")));
1201
        fofoIdImeiReturnMap.put(175139346,	new HashSet<>(Arrays.asList("356494471614953","860600076022215","861765072074616","861977070097412","864468074885181","864468076046105","865610073263139","865883065558994","866335075002538","866657079093605","867907070983216")));
1202
        fofoIdImeiReturnMap.put(175139489,	new HashSet<>(Arrays.asList("354324789015209","354324789081797","861515075189824","861515075575501","861977070268997","864468072790144","864468072983921","864468075233225","866657077951960","869452071082492","869452071982378","869452074617070")));
1203
        fofoIdImeiReturnMap.put(175139508,	new HashSet<>(Arrays.asList("861515075367024","864468072781283","864468074453386","864468075200448","864468076050669","866083062293849")));
1204
        fofoIdImeiReturnMap.put(175139716,	new HashSet<>(Arrays.asList("350832440575209","358250295571425","860600076019492","861753063494373","861753063501151","864468073696100","864468074855689","865883065542311","865883067956030","866202075825450","866202077663297","866335073632591","866657078023769")));
1205
        fofoIdImeiReturnMap.put(175139727,	new HashSet<>(Arrays.asList("355300592353325","355300593005387","861765072344258","862046060196128","864468073908604","864468073910121","864468073911269","867437074118411","868024064300099","868024065464977","868024065468218","869116065414389")));
1206
        fofoIdImeiReturnMap.put(175139521,	new HashSet<>(Arrays.asList("860600071402594","860600071416719","861888064397496","861977073658616","864468070509587","864468073866406","866335074999056","866657077949642","866657078406964","866993072229072","867437070891698")));
1207
        fofoIdImeiReturnMap.put(175139523,	new HashSet<>(Arrays.asList("354324785409950","354324788632830","354990352587939","358250295736085","358250295805187","358311601935629","863967076359575","866657074163502","867907070986318","869452071963378","869452074611750")));
1208
        fofoIdImeiReturnMap.put(175139697,	new HashSet<>(Arrays.asList("862282078030112","862282078867117","863975067709930","863975068443810","864468072828860","864468073705786","864468075276489","864468075277685","865610073830739","866335073264577","866518079802116","866657074518903","866657077949980","868565073058664","868938060985639","869116065613949")));
1209
        fofoIdImeiReturnMap.put(175139622,	new HashSet<>(Arrays.asList("358250293381926","358250293382304","358250293382601","358250294076046","358250294078109","358250294078463","358250294602064","358250294602429","358250294603062","358250294603203")));
1210
        fofoIdImeiReturnMap.put(175139699,	new HashSet<>(Arrays.asList("863718064441317","865610074942897","866202077653173","866202077653553","866335072262671","866335073632211","866335074805519")));
1211
        fofoIdImeiReturnMap.put(175139741,	new HashSet<>(Arrays.asList("861515071386101","861515074123402","861515074124186","861977073047752","861977073658574","864468075082804","864468076049869","865883065542139","865883067957111","866518070599679","866518079800672","866657078018587","866657078270162","866657079236220")));
1212
        fofoIdImeiReturnMap.put(175139114,	new HashSet<>(Arrays.asList("861888066708856","861977074487692","866335070051217","866335070517274","866993074145631")));
1213
        fofoIdImeiReturnMap.put(175139531,	new HashSet<>(Arrays.asList("863816077976194","863816079685710","866335070997336","866335074729354","866335075514698")));
1214
        fofoIdImeiReturnMap.put(175139386,	new HashSet<>(Arrays.asList("350210771192805","358250295053846","860388068563434","863862077333374","864468075193221","864562077193757","864718076084310","866202077464092","866202077742190","866518077001513","868565079682020","868956065252516")));
1215
        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")));
1216
        fofoIdImeiReturnMap.put(175139306,	new HashSet<>(Arrays.asList("863718064547394","864718076075516","864718076083478","866202077463631","866202077470057")));
1217
        fofoIdImeiReturnMap.put(175139733,	new HashSet<>(Arrays.asList("350210771180008","861515071845668","861888067164877","866335070489094","866518076378276","868565072242269")));
1218
        fofoIdImeiReturnMap.put(175138824,	new HashSet<>(Arrays.asList("862054078573478","863862074697490","863862075442375","864468074485545","866335070216315","866657078016169","866657078449402","869116065542247")));
1219
        fofoIdImeiReturnMap.put(175139511,	new HashSet<>(Arrays.asList("862054075642557","862054075643530","862054076379357","862054077978934","863816078158016","868938062108974")));
1220
        fofoIdImeiReturnMap.put(175139701,	new HashSet<>(Arrays.asList("863862078258331","866611061131790")));
1221
        fofoIdImeiReturnMap.put(175139552,	new HashSet<>(Arrays.asList("861753065084958","866202075814439","866202075825633","866202075864194","866202076138754","866202076252811","866202077646870","866202077651094","866202077653876","866202077659956","866202077660293","866202077663339","866202078006397","866202078006611","866202078008914","866657078023280")));
1222
        fofoIdImeiReturnMap.put(175139499,	new HashSet<>(Arrays.asList("351115165467359","351115166905951","355358277809813","355358277814052","356049795822532","358250290682060","863862075504950","864468073944906","864468076048721","866657079234365")));
1223
        fofoIdImeiReturnMap.put(175139630,	new HashSet<>(Arrays.asList("357349229650288","358250290499184","358250294552947","358250294590301","860946078570556","860946078571059","861977073552215","861977073657790","861977073657832","861977073658731","861977074660850","862054075627517","862054075632756","862054075642979","862054076374879","863967071220830")));
1224
        fofoIdImeiReturnMap.put(175139720,	new HashSet<>(Arrays.asList("865388072300075","866335073071691","866335073073697","866335073390398")));
1225
        fofoIdImeiReturnMap.put(175138854,	new HashSet<>(Arrays.asList("50115570082950","351688420279827","351688420575703","354324788647382","357594162666201","359333606194530","863862075760198")));
1226
        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")));
1227
        fofoIdImeiReturnMap.put(175139610,	new HashSet<>(Arrays.asList("862736063981738","863718063044617","866335072870176","866335072870598")));
1228
        fofoIdImeiReturnMap.put(175139366,	new HashSet<>(Arrays.asList("354324783144864","354324788632608","354889661849990","354990353239423","863967070558271","864718076129396","866657077789543","866657078285368","866657078508066","869116060977828","869116061054429","869116061208546")));
1229
        fofoIdImeiReturnMap.put(175139412,	new HashSet<>(Arrays.asList("351115165488595","351115165491318","351115165491359","351115165491458","351115165492332","355358278026573","355358278081610","861888063460717","861977073052018","863816078633919","865883069477035","866335074538870","866993071639594")));
1230
        fofoIdImeiReturnMap.put(175139504,	new HashSet<>(Arrays.asList("862054072660792","862054075971873","862054076312374","862054077948630","863816075363171","863862075442334","864718075894230","868938062122017","868938065268932","869452071940632","869452073034897","869452073158233","869452073158498","869452074159735")));
1231
        fofoIdImeiReturnMap.put(175139201,	new HashSet<>(Arrays.asList("863718061956671","863862075497734","863862075596915","864718076078510","864718076134834","866335070211639","866611060437032","866611061133812")));
1232
        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 1233
        fofoIdImeiReturnMap.put(175139661,	new HashSet<>(Arrays.asList("860946077691031","861977074661155","862054073218855","866335070523694","867940069973476","868938062656477")));*/
33452 amit.gupta 1234
        fofoIdImeiReturnMap.put(175139556, new HashSet<>(Arrays.asList("863718063534013", "866335072895173", "866335073390810")));
1235
        fofoIdImeiReturnMap.put(175139721, new HashSet<>(Arrays.asList("358250294549067", "865883067508138", "866993072210619")));
33355 amit.gupta 1236
        /*fofoIdImeiReturnMap.put(175139455,	new HashSet<>(Arrays.asList("358293804087913","866518078020694","866518078021650","866518078243676","866518078571936")));
33315 amit.gupta 1237
        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")));
1238
        fofoIdImeiReturnMap.put(175139559,	new HashSet<>(Arrays.asList("863718069016890","863816078879256","864468075283881","866335073245436","866335073403571","866657074268327","868024065473853","868956065899993","869452070362895","869452074030274")));
1239
        fofoIdImeiReturnMap.put(175139575,	new HashSet<>(Arrays.asList("354324786659199","860388067452035","861220078009919","863816078878134","863862075841154","865388070857498","867907071407116")));
33355 amit.gupta 1240
        fofoIdImeiReturnMap.put(175139686,	new HashSet<>(Arrays.asList("866657078019106","866657078032869")));*/
33315 amit.gupta 1241
 
33355 amit.gupta 1242
        //this.processOrdersToRebill(fofoIdImeiReturnMap, debitNoteDate);
1243
        purchaseReturnService.fixReturns(fofoIdImeiReturnMap, debitNoteDate);
32513 amit.gupta 1244
 
32698 amit.gupta 1245
    }
1246
 
1247
 
33315 amit.gupta 1248
    private void processOrdersToRebill(Map<Integer, Set<String>> fofoIdImeiReturnMap, LocalDateTime debitNoteDate) throws Exception {
32698 amit.gupta 1249
 
1250
 
1251
        for (Entry<Integer, Set<String>> fofoIdImeiReturnEntry : fofoIdImeiReturnMap.entrySet()) {
32511 amit.gupta 1252
            int fofoId = fofoIdImeiReturnEntry.getKey();
1253
            Set<String> imeis = fofoIdImeiReturnEntry.getValue();
1254
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(fofoId, imeis, true);
1255
            for (InventoryItem inventoryItem : inventoryItems) {
1256
                //inventoryItem.getId();
1257
                purchaseReturnService.returnInventoryItem(fofoId, true, inventoryItem.getId(), ReturnType.GOOD);
1258
                //Approve return
1259
                PurchaseReturnItem purchaseReturnItem = purchaseReturnItemRepository.selectByInventoryItemId(inventoryItem.getId());
1260
                purchaseReturnItem.setStatus(PurchaseReturnStatus.APPROVED);
1261
                purchaseReturnItem.setApproveTimestamp(LocalDateTime.now());
1262
            }
1263
            Map<Purchase, List<InventoryItem>> purchaseInventoryItemsMap = purchaseReturnService.getPurchaseMapForApprovedReturns(fofoId);
1264
            int walletAmount = walletService.getWalletAmount(fofoId);
1265
            List<DebitNote> debitNotes = purchaseReturnService.generateDebitNotes(purchaseInventoryItemsMap);
1266
            int walletDiff = walletAmount - walletService.getWalletAmount(fofoId);
1267
            if (walletDiff > 0) {
1268
                int reference = walletService.getManualReference(WalletReferenceType.OTHERS);
32514 amit.gupta 1269
                walletService.addAmountToWallet(fofoId, reference, WalletReferenceType.ADVANCE_AMOUNT, "Sytematically added for internal PO", (float) walletDiff + 5000, LocalDateTime.now());
32511 amit.gupta 1270
            }
32698 amit.gupta 1271
            List<CartItem> cartItems = new ArrayList<>();
32511 amit.gupta 1272
            for (DebitNote debitNote : debitNotes) {
33315 amit.gupta 1273
                debitNote.setCreateTimestamp(debitNoteDate);
32511 amit.gupta 1274
                //Try to refund amount per debit note
32698 amit.gupta 1275
                cartItems.addAll(this.refundDnAmount(debitNote));
32511 amit.gupta 1276
            }
32698 amit.gupta 1277
            //If order created
33452 amit.gupta 1278
            Map<Integer, List<CartItem>> warehouseCartItemsMap = cartItems.stream().collect(groupingBy(x -> x.getWarehouseId()));
1279
            for (Entry<Integer, List<CartItem>> warehouseCartItemsEntry : warehouseCartItemsMap.entrySet()) {
32223 amit.gupta 1280
 
32698 amit.gupta 1281
                List<CartItem> warehouseCartItems = warehouseCartItemsEntry.getValue();
1282
 
1283
                List<CartItem> mergedCartItems = warehouseCartItems.stream()
1284
                        .collect(Collectors.collectingAndThen(
33452 amit.gupta 1285
                                groupingBy(x -> x.getItemId(), Collectors.collectingAndThen(
32724 amit.gupta 1286
                                        Collectors.reducing((a, b) -> {
32698 amit.gupta 1287
                                            a.setQuantity(a.getQuantity() + b.getQuantity());
1288
                                            return a;
1289
                                        }), Optional::get)),
1290
                                m -> new ArrayList<>(m.values())));
1291
 
32724 amit.gupta 1292
                double walletTotalAmount = mergedCartItems.stream().mapToDouble(x -> x.getQuantity() * x.getSellingPrice()).sum();
32698 amit.gupta 1293
 
1294
                com.spice.profitmandi.dao.entity.user.User user = userRepository.selectById(fofoId);
1295
                cartService.clearCart(user.getActiveCartId());
1296
                cartService.addItemsToCart(user.getActiveCartId(), mergedCartItems);
1297
 
1298
                UserCart userCart = new UserCart();
1299
                userCart.setCartId(user.getActiveCartId());
1300
                userCart.setUserId(user.getId());
1301
 
1302
                int transactionId = transactionService.createTransactionInternally(userCart, walletTotalAmount, warehouseCartItemsEntry.getKey());
1303
                commonPaymentService.payThroughWallet(transactionId);
1304
                transactionService.processTransaction(transactionId);
1305
            }
1306
        }
31697 amit.gupta 1307
    }
32048 tejbeer 1308
 
32384 amit.gupta 1309
    @Autowired
32511 amit.gupta 1310
    CartService cartService;
1311
    @Autowired
1312
    UserRepository userRepository;
1313
 
1314
    @Autowired
1315
    WarehouseScanRepository warehouseScanRepository;
1316
 
1317
    @Autowired
1318
    WarehouseInventoryService warehouseInventoryService;
1319
 
1320
    @Autowired
1321
    CommonPaymentService commonPaymentService;
1322
 
32533 amit.gupta 1323
    @Autowired
1324
    LineItemImeisRepository lineItemImeisRepository;
1325
 
32698 amit.gupta 1326
 
32511 amit.gupta 1327
    //Also create order
32698 amit.gupta 1328
    private List<CartItem> refundDnAmount(DebitNote debitNote) throws ProfitMandiBusinessException {
32511 amit.gupta 1329
        List<Integer> inventoryItemIds = purchaseReturnItemRepository.selectAllByDebitNoteId(debitNote.getId()).stream().map(x -> x.getInventoryItemId()).collect(Collectors.toList());
33452 amit.gupta 1330
        Map<Integer, Long> inventoryItemCountMap = inventoryItemIds.stream().collect(groupingBy(x -> x, Collectors.counting()));
32511 amit.gupta 1331
        List<InventoryItem> inventoryItems = inventoryItemRepository.selectAllByIds(new ArrayList<>(inventoryItemCountMap.keySet()));
1332
        Purchase purchase = purchaseRepository.selectById(inventoryItems.get(0).getPurchaseId());
1333
        String invoice = purchase.getPurchaseReference();
1334
        List<Order> orders = orderRepository.selectByInvoiceNumber(invoice);
1335
        Set<Integer> orderIds = orders.stream().map(x -> x.getId()).collect(Collectors.toSet());
1336
        Order order = orders.get(0);
1337
        float totalAmount = 0;
1338
        int totalQty = 0;
1339
        Map<Integer, CartItem> itemIdCartItemMap = new HashMap<>();
1340
 
1341
        List<CartItem> cartItems = new ArrayList<>();
1342
        for (InventoryItem inventoryItem : inventoryItems) {
1343
            TagListing tagListing = tagListingRepository.selectByItemId(inventoryItem.getItemId());
1344
            long quantity = inventoryItemCountMap.get(inventoryItem.getId());
1345
            totalAmount += inventoryItem.getUnitPrice() * quantity;
1346
            totalQty += quantity;
1347
            if (!itemIdCartItemMap.containsKey(inventoryItem.getItemId())) {
1348
                CartItem cartItem = new CartItem();
1349
                cartItem.setItemId(inventoryItem.getItemId());
1350
                cartItem.setSellingPrice(tagListing.getSellingPrice());
32698 amit.gupta 1351
                cartItem.setWarehouseId(order.getWarehouseId());
32511 amit.gupta 1352
                cartItems.add(cartItem);
1353
                itemIdCartItemMap.put(inventoryItem.getItemId(), cartItem);
1354
            }
1355
            CartItem cartItem = itemIdCartItemMap.get(inventoryItem.getItemId());
1356
            cartItem.setQuantity((int) quantity + cartItem.getQuantity());
1357
        }
1358
        String rollbackDescription = String.format("Refunded against DN %s, %d pc(s)", debitNote.getDebitNoteNumber(), totalQty);
1359
        walletService.addAmountToWallet(debitNote.getFofoId(), order.getTransactionId(), WalletReferenceType.PURCHASE, rollbackDescription, totalAmount, LocalDateTime.now());
1360
        //Before creating order lets try to in the stock
1361
 
1362
        //All scans pertaining to specific Invoices
1363
        List<WarehouseScan> warehouseScans = warehouseScanRepository.selectAllByOrderIds(new ArrayList<>(orderIds));
32698 amit.gupta 1364
        Map<Integer, Integer> inventoryItemIdOrderIdMap = new HashMap<>();
1365
        try {
1366
            inventoryItemIdOrderIdMap = warehouseScans.stream().collect(Collectors.toMap(x -> x.getInventoryItemId(), x -> x.getQuantity()));
32724 amit.gupta 1367
        } catch (Exception e) {
32698 amit.gupta 1368
            LOGGER.info("Could not process for fofoId - {}, {}", debitNote.getFofoId(), warehouseScans);
1369
        }
32511 amit.gupta 1370
        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)))
1371
                .map(x -> x.getInventoryItemId()).collect(Collectors.toList());
1372
        List<WarehouseInventoryItem> warehouseInventoryItems = warehouseInventoryItemRepository.selectAllByIds(warehouseInventoryItemIds);
1373
 
1374
        Map<String, WarehouseInventoryItem> serialNumberWarehouseInventoryItemMap = warehouseInventoryItems.stream().filter(x -> StringUtils.isNotBlank(x.getSerialNumber())).collect(Collectors.toMap(x -> x.getSerialNumber(), x -> x));
1375
 
1376
        for (InventoryItem inventoryItem : inventoryItems) {
1377
            if (StringUtils.isBlank(inventoryItem.getSerialNumber())) {
1378
                //As of now this should be happening as  dn are specifically for serialized devices
1379
                /*int returnQty = inventoryItemCountMap.get(inventoryItem.getId()).intValue();
1380
                List<WarehouseInventoryItem> warehouseInventoryItemList = itemIdWarehouseInventoryItemsMap.get(inventoryItem.getItemId());
1381
                warehouseInventoryService.returnNonSerializedQty(warehouseInventoryItem)*/
1382
            } else if (StringUtils.isNotBlank(inventoryItem.getSerialNumber())) {
1383
                String serialNumber = inventoryItem.getSerialNumber();
1384
                WarehouseInventoryItem warehouseInventoryItem = serialNumberWarehouseInventoryItemMap.get(serialNumber);
1385
                warehouseInventoryItem.setLastScanType(in.shop2020.warehouse.ScanType.SALE_RET);
1386
                warehouseInventoryService.addQuantity(warehouseInventoryItem.getId(), 1);
1387
                WarehouseScan warehouseScan = new WarehouseScan();
1388
                warehouseScan.setInventoryItemId(warehouseInventoryItem.getId());
1389
                warehouseScan.setQuantity(1);
1390
                warehouseScan.setOrderId(inventoryItemIdOrderIdMap.get(warehouseInventoryItem.getItemId()));
1391
                warehouseScan.setScannedAt(LocalDateTime.now());
1392
                warehouseScan.setType(in.shop2020.warehouse.ScanType.SALE_RET);
1393
                warehouseScanRepository.persist(warehouseScan);
1394
 
1395
            }
1396
        }
1397
 
1398
        //Create Order as well
32724 amit.gupta 1399
        return cartItems;
32698 amit.gupta 1400
    }
32511 amit.gupta 1401
 
32698 amit.gupta 1402
    void addToCartAndCreateOrder() {
32511 amit.gupta 1403
 
1404
    }
1405
 
1406
    @Autowired
32384 amit.gupta 1407
    WarehouseDebitNoteRepository warehouseDebitNoteRepository;
1408
    @Autowired
1409
    WarehouseDebitNoteLineRepository warehouseDebitNoteLineRepository;
1410
 
1411
    @Autowired
1412
    WarehouseInvoiceItemRepository warehouseInvoiceItemRepository;
1413
    @Autowired
1414
    WarehouseSupplierInvoiceRepository warehouseSupplierInvoiceRepository;
1415
 
1416
    @Autowired
1417
    PurchaseOrderService purchaseOrderService;
1418
 
32482 amit.gupta 1419
    @Autowired
1420
    VendorCatalogPricingLogRepository vendorCatalogPricingLogRepository;
32384 amit.gupta 1421
 
32214 jai.hind 1422
//    private void checkItelImeiActivationNew(LocalDate now, int i) {
1423
//    }
1424
 
32169 amit.gupta 1425
    @Autowired
1426
    SessionFactory sessionFactory;
1427
 
1428
    private void checkAllPayoutsDuplicate() throws Exception {
1429
        final Session session = sessionFactory.getCurrentSession();
32439 tejbeer 1430
        final NativeQuery<Object[]> nativeQuery = session.createNativeQuery("select sio.inventory_item_id, sio.scheme_id, sio.status, count(*) c\n" + "from fofo.scheme_in_out sio\n" + "         join catalog.scheme s on s.id = sio.scheme_id\n" + "where (sio.status = 'CREDITED'\n" + "    or sio.status = 'PENDING')\n" + "  and s.type != 'INVESTMENT'\n" + " and sio.create_timestamp >= '2023-01-01' " + "group by sio.inventory_item_id, sio.scheme_id, sio.status\n" + "having c > 1");
32169 amit.gupta 1431
        List<Object[]> resultList = nativeQuery.getResultList();
1432
        for (Object[] tuple : resultList) {
1433
            LOGGER.info("RESULT -- {}, {}, {}", tuple[0], tuple[1], tuple[2]);
1434
            int inventoryItemId = (Integer) tuple[0];
1435
            int schemeId = (Integer) tuple[1];
1436
            SchemePayoutStatus schemePayoutStatus = SchemePayoutStatus.valueOf((String) tuple[2]);
1437
            List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByScheme(schemeId, inventoryItemId);
1438
            List<SchemeInOut> statusSpecificSchemeInOuts = schemeInOuts.stream().filter(x -> x.getStatus().equals(schemePayoutStatus)).collect(Collectors.toList());
1439
            if (statusSpecificSchemeInOuts.size() > 0) {
1440
                InventoryItem inventoryItem = inventoryItemRepository.selectById(inventoryItemId);
1441
                Scheme scheme = schemeRepository.selectById(schemeId);
1442
                List<ScanRecord> scanRecords = scanRecordRepository.selectByInventoryItemId(inventoryItemId);
1443
                if (scheme.getType().equals(SchemeType.IN)) {
1444
                    LOGGER.info("Skipping -- {}", inventoryItem.getSerialNumber());
1445
                } else {
1446
                    int fofoOrderId = scanRecords.stream().filter(x -> x.getOrderId() != 0).max(Comparator.comparing(x -> x.getOrderId())).get().getOrderId();
1447
                    WalletReferenceType walletReferenceType = SchemeType.ACTIVATION.equals(scheme.getType()) ? WalletReferenceType.ACTIVATION_SCHEME : SchemeType.SPECIAL_SUPPORT.equals(scheme.getType()) ? WalletReferenceType.SPECIAL_SUPPORT : WalletReferenceType.SCHEME_OUT;
1448
                    List<UserWalletHistory> userWalletHistoryList = userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrderId, walletReferenceType).stream().filter(x -> x.getAmount() == Math.round(statusSpecificSchemeInOuts.get(0).getAmount())).collect(Collectors.toList());
1449
                    LOGGER.info("UserwalletHistory Entry --> {}, Sios --> {}", userWalletHistoryList.size(), statusSpecificSchemeInOuts.size());
1450
                    if (userWalletHistoryList.size() != statusSpecificSchemeInOuts.size()) {
1451
                        //Skipping them in first run as it is the special casw of upgrade where mismatch has happend.
1452
                        LOGGER.info("problem with {}, sio status - {}, inventoryItem id {}, schemeID {} ", fofoOrderId, statusSpecificSchemeInOuts.stream().map(x -> x.getStatus()).collect(Collectors.toList()), inventoryItemId, schemeId);
1453
                        //Primarily multiple pending cases
1454
                        statusSpecificSchemeInOuts.stream().skip(1).forEach(schemeInOut -> {
1455
                            schemeInOut.setStatus(SchemePayoutStatus.REJECTED);
1456
                            schemeInOut.setStatusDescription("Rejected as entry is duplicate");
1457
                        });
1458
                    } else {
1459
                        userWalletHistoryList.stream().skip(1).forEach(userWalletHistory -> {
1460
                            try {
1461
                                walletService.rollbackAmountFromWallet(inventoryItem.getFofoId(), userWalletHistory.getAmount(), userWalletHistory.getReference(), userWalletHistory.getReferenceType(), "Reversal as multiple entries created", userWalletHistory.getBusinessTimestamp());
1462
                            } catch (ProfitMandiBusinessException e) {
1463
                                throw new RuntimeException(e);
1464
                            }
1465
                        });
1466
 
1467
                        statusSpecificSchemeInOuts.stream().skip(1).forEach(schemeInOut -> {
1468
                            schemeInOut.setStatus(SchemePayoutStatus.REJECTED);
1469
                            if (schemePayoutStatus.equals(SchemePayoutStatus.CREDITED)) {
1470
                                schemeInOut.setRolledBackTimestamp(LocalDateTime.now());
1471
                                schemeInOut.setStatusDescription("Rolled back as entry is duplicate");
1472
                            } else {
1473
                                LOGGER.info("This seems higly unreachable should not come here");
1474
                                schemeInOut.setStatusDescription("Rejected as entry is duplicate");
1475
                            }
1476
                        });
1477
                    }
1478
                }
1479
            }
1480
        }
1481
    }
1482
 
31697 amit.gupta 1483
    public void sendMailForSamsungRebilling() throws Exception {
1484
        List<BilledImeiModel> samsungModels = warehouseInventoryItemRepository.findByBillingDateBrand(LocalDate.now(), "Samsung");
1485
        LOGGER.info("SamsungModels {}", samsungModels);
1486
        samsungModels = samsungModels.stream().sorted(Comparator.comparing(x -> x.getPcmDate() == null ? -1 : 1)).collect(Collectors.toList());
1487
        if (samsungModels.size() > 0) {
1488
            List<String> headers = Arrays.asList("Partner Id", "Code", "Name", "City", "Brand", "Model Name", "Model Number", "Color", "Serial Number", "Remarks");
1489
            List<List<?>> rows = new ArrayList<>();
1490
            for (BilledImeiModel billedImeiModel : samsungModels) {
31886 tejbeer 1491
                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 1492
                rows.add(row);
1493
            }
1494
            ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
1495
            String[] sendToArray = new String[]{"kamini.sharma@smartdukaan.com", "praveen.sharma@smartdukaan.com"};
1496
            String fileName = "Imeis need Rebilling -" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
31886 tejbeer 1497
            Utils.sendMailWithAttachment(googleMailSender, sendToArray, new String[]{"tarun.verma@smartdukaan.com"}, "Samsung Rebilling IMEI Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
31697 amit.gupta 1498
        }
1499
    }
24002 amit.gupta 1500
 
31697 amit.gupta 1501
    public void sendPartnerInvestmentDetails(List<String> sendTo) throws Exception {
1502
        LocalDate yesterDay = LocalDate.now().minusDays(1);
1503
        List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
31886 tejbeer 1504
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
25312 amit.gupta 1505
 
32169 amit.gupta 1506
        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 1507
        List<List<?>> rows = new ArrayList<>();
1508
        Map<Integer, List<?>> partnerRowsMap = new HashMap<>();
25598 amit.gupta 1509
 
31697 amit.gupta 1510
        Map<Integer, FofoReportingModel> partnerIdSalesHeaderMap = this.getPartnerIdSalesHeaders();
25312 amit.gupta 1511
 
31886 tejbeer 1512
        Map<Integer, Integer> shortDaysMap = partnerDailyInvestmentRepository.selectAll(LocalDate.now().withDayOfMonth(1), LocalDate.now()).stream().collect(groupingBy(
1513
                x -> x.getFofoId(), Collectors.summingInt(x -> x.getShortPercentage() > 10 ? 1 : 0)));
24271 amit.gupta 1514
 
31697 amit.gupta 1515
        for (FofoStore fofoStore : fofoStores) {
1516
            LOGGER.info("Fofo Store {},  {}", fofoStore.getId(), fofoStore.getCode());
1517
            int fofoId = fofoStore.getId();
1518
            PartnerDailyInvestment partnerDailyInvestment = partnerInvestmentService.getInvestment(fofoId, 1);
1519
            partnerDailyInvestment.setDate(yesterDay);
24177 govind 1520
 
31697 amit.gupta 1521
            try {
1522
                partnerDailyInvestmentRepository.persist(partnerDailyInvestment);
31886 tejbeer 1523
                shortDaysMap.put(fofoId, shortDaysMap.get(fofoId) + (partnerDailyInvestment.getShortPercentage() > 10 ? 1 : 0));
31697 amit.gupta 1524
            } catch (Exception e) {
1525
                // ignore the exceptions during persist
1526
            }
25598 amit.gupta 1527
 
31697 amit.gupta 1528
            CustomRetailer retailer = customRetailerMap.get(fofoStore.getId());
1529
            if (retailer == null || partnerIdSalesHeaderMap.get(fofoStore.getId()) == null) {
1530
                LOGGER.info("Could not find retailer with retailer Id {}", fofoStore.getId());
1531
                continue;
1532
            }
1533
            FofoReportingModel reportingModel = partnerIdSalesHeaderMap.get(fofoStore.getId());
1534
            List<Serializable> row = new ArrayList<>();
31886 tejbeer 1535
            row.addAll(Arrays.asList(reportingModel.getCode(), reportingModel.getBusinessName(), reportingModel.getRegionalManager(), reportingModel.getTerritoryManager()));
31697 amit.gupta 1536
            row.addAll(
31886 tejbeer 1537
                    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 1538
            partnerRowsMap.put(fofoStore.getId(), row);
1539
            rows.add(row);
25837 amit.gupta 1540
 
31697 amit.gupta 1541
        }
25837 amit.gupta 1542
 
31697 amit.gupta 1543
        String fileName = "InvestmentSummary-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
25837 amit.gupta 1544
 
31697 amit.gupta 1545
        if (sendTo == null) {
33452 amit.gupta 1546
            for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMapping().entrySet()) {
31886 tejbeer 1547
                List<List<?>> filteredRows = storeGuyEntry.getValue().stream().map(x -> partnerRowsMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
31697 amit.gupta 1548
                ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, filteredRows);
1549
                String[] sendToArray = new String[]{storeGuyEntry.getKey()};
31886 tejbeer 1550
                Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
31697 amit.gupta 1551
            }
31886 tejbeer 1552
            sendTo = Arrays.asList("tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com", "neeraj.gupta@smartdukaan.com", "amit.gupta@shop2020.in", "manish.gupta@smartdukaan.com", "niranjan.kala@smartdukaan.com");
31697 amit.gupta 1553
        }
25837 amit.gupta 1554
 
31697 amit.gupta 1555
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
1556
        String[] sendToArray = sendTo.toArray(new String[sendTo.size()]);
31886 tejbeer 1557
        Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
25837 amit.gupta 1558
 
31697 amit.gupta 1559
    }
25598 amit.gupta 1560
 
33256 amit.gupta 1561
    private Map<Integer, FofoReportingModel> getPartnerIdSalesHeaders() throws ProfitMandiBusinessException {
31697 amit.gupta 1562
        Map<String, SaleRoles> partnerEmailSalesMap = new HashMap<>();
1563
        Map<String, SaleRoles> partnerEmailRBMMap = new HashMap<>();
24271 amit.gupta 1564
 
31886 tejbeer 1565
        List<Position> positions = positionRepository.selectPositionByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_RBM));
1566
        Map<Integer, AuthUser> authUsersMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
31697 amit.gupta 1567
        Map<Integer, List<CustomRetailer>> positionIdRetailerMap = csService.getPositionCustomRetailerMap(positions);
1568
        for (Position position : positions) {
1569
            List<CustomRetailer> crList = positionIdRetailerMap.get(position.getId());
1570
            if (crList == null)
1571
                continue;
1572
            if (position.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_SALES) {
1573
                for (CustomRetailer cr : crList) {
1574
                    if (!partnerEmailSalesMap.containsKey(cr.getEmail())) {
1575
                        partnerEmailSalesMap.put(cr.getEmail(), new SaleRoles());
1576
                    }
1577
                    SaleRoles saleRoles = partnerEmailSalesMap.get(cr.getEmail());
1578
                    AuthUser authUser = authUsersMap.get(position.getAuthUserId());
1579
                    if (authUser == null) {
1580
                        continue;
1581
                    }
1582
                    String name = authUser.getFirstName() + " " + authUser.getLastName();
1583
                    if (position.getEscalationType().equals(EscalationType.L1)) {
1584
                        saleRoles.getL1().add(name);
1585
                    } else if (position.getEscalationType().equals(EscalationType.L2)) {
1586
                        saleRoles.getL2().add(name);
1587
                    }
1588
                }
1589
            }
1590
            if (position.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_RBM) {
1591
                for (CustomRetailer cr : crList) {
1592
                    if (!partnerEmailRBMMap.containsKey(cr.getEmail())) {
1593
                        partnerEmailRBMMap.put(cr.getEmail(), new SaleRoles());
1594
                    }
1595
                    SaleRoles saleRoles = partnerEmailRBMMap.get(cr.getEmail());
1596
                    AuthUser authUser = authUsersMap.get(position.getAuthUserId());
1597
                    if (authUser == null) {
1598
                        continue;
1599
                    }
1600
                    String name = authUser.getFirstName() + " " + authUser.getLastName();
1601
                    if (position.getEscalationType().equals(EscalationType.L1) || position.getEscalationType().equals(EscalationType.L1)) {
1602
                        saleRoles.getL1().add(name);
1603
                    }
1604
                    /*else if (position.getEscalationType().equals(EscalationType.L2)) {
1605
                        saleRoles.getL2().add(name);
1606
                    }*/
1607
                }
1608
            }
24692 amit.gupta 1609
 
31697 amit.gupta 1610
        }
25418 amit.gupta 1611
 
31697 amit.gupta 1612
        Set<CustomRetailer> allCrList = new HashSet<>();
1613
        for (List<CustomRetailer> cr : positionIdRetailerMap.values()) {
1614
            allCrList.addAll(cr);
1615
        }
25609 amit.gupta 1616
 
31886 tejbeer 1617
        Map<Integer, FofoStore> fofoStoresMap = fofoStoreRepository.selectActiveStores().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
25503 amit.gupta 1618
 
31697 amit.gupta 1619
        Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = new HashMap<>();
25503 amit.gupta 1620
 
31697 amit.gupta 1621
        for (CustomRetailer cr : allCrList) {
1622
            FofoStore fofoStore = fofoStoresMap.get(cr.getPartnerId());
1623
            if (fofoStore == null) {
1624
                LOGGER.info("Could not find Store {} in active Store", cr.getBusinessName());
1625
                continue;
1626
            }
1627
            String code = fofoStore.getCode();
1628
            // String storeName = "SmartDukaan-" +
1629
            // fofoStore.getCode().replaceAll("[a-zA-Z]", "");
1630
            String businessName = cr.getBusinessName();
1631
            try {
1632
                String stateManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL2(), ", ");
1633
                String territoryManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL1(), ", ");
1634
                String bdm = StringUtils.join(partnerEmailRBMMap.get(cr.getEmail()).getL1(), ", ");
1635
                FofoReportingModel reportingModel = new FofoReportingModel();
1636
                reportingModel.setBusinessName(businessName);
1637
                reportingModel.setCode(code);
1638
                reportingModel.setFofoId(fofoStore.getId());
1639
                reportingModel.setRegionalManager(stateManager);
1640
                reportingModel.setTerritoryManager(territoryManager);
1641
                reportingModel.setBusinessManager(bdm);
1642
                partnerIdSalesHeadersMap.put(fofoStore.getId(), reportingModel);
1643
            } catch (Exception e) {
1644
                LOGGER.warn("Could not find partner with email - {}", cr.getEmail());
1645
            }
1646
        }
1647
        return partnerIdSalesHeadersMap;
24533 govind 1648
 
31697 amit.gupta 1649
    }
28709 amit.gupta 1650
 
31697 amit.gupta 1651
    public void sendPartnerInvestmentDetails() throws Exception {
1652
        this.sendPartnerInvestmentDetails(null);
1653
    }
28709 amit.gupta 1654
 
31697 amit.gupta 1655
    public void sendAgeingReport(String... sendTo) throws Exception {
28790 amit.gupta 1656
 
31886 tejbeer 1657
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.WAREHOUSENEW, "itemstockageing.xml");
1658
        InputStreamSource isr1 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "ItemwiseOverallPendingIndent.xml");
31697 amit.gupta 1659
        Attachment attachment = new Attachment(
1660
                "ageing-report-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr);
1661
        Attachment attachment1 = new Attachment(
1662
                "pending-indent-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr1);
28790 amit.gupta 1663
 
31886 tejbeer 1664
        Utils.sendMailWithAttachments(googleMailSender, STOCK_AGEING_MAIL_LIST, null, "Stock Ageing Report", "PFA", attachment);
1665
        Utils.sendMailWithAttachments(googleMailSender, ITEMWISE_PENDING_INDENT_MAIL_LIST, null, "Itemwise Pending indent", "PFA", attachment1);
28790 amit.gupta 1666
 
31697 amit.gupta 1667
        // Reports to be sent to mapped partners
1668
        Map<String, Set<String>> storeGuysMap = csService.getAuthUserPartnerEmailMapping();
28790 amit.gupta 1669
 
33452 amit.gupta 1670
        for (Entry<String, Set<String>> storeGuyEntry : storeGuysMap.entrySet()) {
31697 amit.gupta 1671
            Map<String, String> params = new HashMap<>();
1672
            if (storeGuyEntry.getValue().size() == 0)
1673
                continue;
1674
            params.put("MANUAL_email", String.join(",", storeGuyEntry.getValue()));
31886 tejbeer 1675
            InputStreamSource isr3 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "focostockreport.xml", params);
31697 amit.gupta 1676
            Attachment attache = new Attachment(
1677
                    "Franchise-stock-report" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr3);
1678
            System.out.println(storeGuyEntry.getValue());
31886 tejbeer 1679
            Utils.sendMailWithAttachments(googleMailSender, new String[]{storeGuyEntry.getKey()}, null, "Franchise Stock Report", "PFA", attache);
31697 amit.gupta 1680
        }
28839 tejbeer 1681
 
31697 amit.gupta 1682
    }
28839 tejbeer 1683
 
31697 amit.gupta 1684
    public void sendIndentTertiary() throws Exception {
28790 amit.gupta 1685
 
31886 tejbeer 1686
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "indentandtertiary.xml");
31697 amit.gupta 1687
        Attachment attachment = new Attachment(
1688
                "indentandtertiary-report-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr);
31886 tejbeer 1689
        Utils.sendMailWithAttachments(googleMailSender, INDENT_TERTIARY_MAIL_LIST, null, "Indent Tertiary Report", "PFA", attachment);
28790 amit.gupta 1690
 
31697 amit.gupta 1691
    }
28790 amit.gupta 1692
 
31697 amit.gupta 1693
    public void sendAttendanceMorningAlert() throws Exception {
1694
        LocalDateTime moriningTime = LocalDate.now().atTime(10, 31);
1695
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
31886 tejbeer 1696
        Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28775 amit.gupta 1697
 
31697 amit.gupta 1698
        List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
1699
        Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28790 amit.gupta 1700
 
31886 tejbeer 1701
        List<EmployeeAttendance> employeeAttendances = employeeAttendanceRepository.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now());
28784 amit.gupta 1702
 
31886 tejbeer 1703
        Map<Integer, Optional<EmployeeAttendance>> employeeMorningAttendance = employeeAttendances.stream().collect(groupingBy(EmployeeAttendance::getUserId, Collectors.minBy(Comparator.comparing(EmployeeAttendance::getCreateTimestamp))));
31697 amit.gupta 1704
        for (AuthUser authUser : authUsers) {
1705
            User user = userMap.get(authUser.getEmailId());
1706
            Optional<EmployeeAttendance> employeeAttendanceOptional = employeeMorningAttendance.get(user.getId());
1707
            LOGGER.info("AuthUser - {}, employeeAttendanceOptional {}", authUser.getName(), employeeAttendanceOptional);
1708
            if (employeeAttendanceOptional != null) {
1709
                LOGGER.info("employeeAttendanceOptional.orElse {}", employeeAttendanceOptional.orElse(null));
1710
                if (employeeAttendanceOptional.orElse(null) != null) {
31886 tejbeer 1711
                    LOGGER.info("employeeAttendanceOptional.get().getCreateTimestamp() {}", employeeAttendanceOptional.get().getCreateTimestamp());
31697 amit.gupta 1712
                }
1713
            }
31886 tejbeer 1714
            if (employeeAttendanceOptional == null || employeeAttendanceOptional.orElse(null) == null || employeeAttendanceOptional.get().getCreateTimestamp().isAfter(moriningTime)) {
31697 amit.gupta 1715
                LOGGER.info("Will Send Email to {}", authUser.getFullName());
1716
                String body = String.format(
31886 tejbeer 1717
                        "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 1718
 
31886 tejbeer 1719
                Utils.sendMailWithAttachments(googleMailSender, new String[]{authUser.getEmailId()}, new String[]{"kangan.monga@smartdukaan.com"}, "Attendance Alert", body);
28790 amit.gupta 1720
 
31697 amit.gupta 1721
            }
1722
        }
28790 amit.gupta 1723
 
31697 amit.gupta 1724
    }
28790 amit.gupta 1725
 
31697 amit.gupta 1726
    public void sendAttendanceEveningAlert() throws Exception {
1727
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
31886 tejbeer 1728
        Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28709 amit.gupta 1729
 
31697 amit.gupta 1730
        List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
1731
        Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28709 amit.gupta 1732
 
31886 tejbeer 1733
        Map<Integer, List<EmployeeAttendance>> employeeAttendancesMap = employeeAttendanceRepository.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now()).stream().collect(groupingBy(x -> x.getUserId()));
28709 amit.gupta 1734
 
31697 amit.gupta 1735
        for (AuthUser authUser : authUsers) {
1736
            User user = userMap.get(authUser.getEmailId());
1737
            String body = null;
1738
            List<EmployeeAttendance> employeeAttendances = employeeAttendancesMap.get(user.getId());
1739
            if (employeeAttendances == null) {
1740
                body = String.format(
31886 tejbeer 1741
                        "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 1742
            } else {
31886 tejbeer 1743
                List<LocalDateTime> punchTimes = employeeAttendances.stream().sorted(Comparator.comparing(EmployeeAttendance::getCreateTimestamp)).map(x -> x.getCreateTimestamp()).collect(Collectors.toList());
31697 amit.gupta 1744
                if (punchTimes.size() == 1) {
1745
                    // body = String.format("Dear %s,\n Pls note that you haven't punched out yet.
1746
                    // You have been marked absent for half the day. You may contact your manager
1747
                    // and get it regularise.\n\nRegards\nHR Team", authUser.getFullName());
1748
                } else {
1749
                    LocalDateTime firstPunch = punchTimes.get(0);
1750
                    LocalDateTime lastPunch = punchTimes.get(punchTimes.size() - 1);
1751
                    Duration duration = Duration.between(firstPunch, lastPunch);
1752
                    boolean hoursCompleted = lastPunch.isAfter(firstPunch.plusHours(8).plusMinutes(30));
1753
                    if (!hoursCompleted) {
1754
                        body = String.format(
31886 tejbeer 1755
                                "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 1756
                    }
1757
                }
28709 amit.gupta 1758
 
31697 amit.gupta 1759
            }
1760
            if (body != null) {
31886 tejbeer 1761
                Utils.sendMailWithAttachments(googleMailSender, new String[]{authUser.getEmailId()}, new String[]{"kangan.monga@smartdukaan.com"}, "Attendance Alert", body);
31697 amit.gupta 1762
            }
1763
        }
28709 amit.gupta 1764
 
31697 amit.gupta 1765
        this.sendMailToHR();
28709 amit.gupta 1766
 
31697 amit.gupta 1767
    }
28709 amit.gupta 1768
 
31697 amit.gupta 1769
    private void sendMailToHR() throws Exception {
1770
        Map<String, String> map = new HashMap<>();
1771
        String reporticoDate = FormattingUtils.formatReporitcoDate(LocalDateTime.now());
1772
        map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
1773
        map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
31886 tejbeer 1774
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "employeeattendance.xml");
1775
        Attachment attachment = new Attachment("attendance-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr);
1776
        Utils.sendMailWithAttachments(googleMailSender, EMPLOYEE_ATTENDANCE_MAIL_LIST, null, "Attendance - " + FormattingUtils.formatDate(LocalDateTime.now()), "PFA Attendance", attachment);
31697 amit.gupta 1777
    }
28709 amit.gupta 1778
 
31697 amit.gupta 1779
    public void checkPartnerActiveStore() throws Exception {
24697 amit.gupta 1780
 
31697 amit.gupta 1781
        List<FofoStore> fofoStores = fofoStoreRepository.selectByStatus(true);
23929 amit.gupta 1782
 
31697 amit.gupta 1783
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
1784
        if (!fofoStores.isEmpty()) {
1785
            for (FofoStore fofoStore : fofoStores) {
24551 amit.gupta 1786
 
31697 amit.gupta 1787
                if (currentDate.isBefore(fofoStore.getActiveTimeStamp())) {
24542 amit.gupta 1788
 
31697 amit.gupta 1789
                    fofoStore.setActive(true);
1790
                    fofoStoreRepository.persist(fofoStore);
1791
                    LOGGER.info("inserted into InActiveFofoStore successfully");
29160 amit.gupta 1792
 
31697 amit.gupta 1793
                } else {
1794
                    fofoStore.setActive(false);
1795
                    fofoStore.setActiveTimeStamp(null);
1796
                    fofoStoreRepository.persist(fofoStore);
1797
                    LOGGER.info("inserted into InActiveFofoStore successfully");
1798
                }
24542 amit.gupta 1799
 
31697 amit.gupta 1800
            }
1801
        }
24542 amit.gupta 1802
 
31697 amit.gupta 1803
    }
24548 amit.gupta 1804
 
31697 amit.gupta 1805
    public void sendAgeingReport() throws Exception {
33820 ranu 1806
        sendAgeingReport("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com", "niranjan.kala@smartdukaan.com", "kuldeep.kumar@smartdukaan.com");
31697 amit.gupta 1807
    }
24542 amit.gupta 1808
 
31697 amit.gupta 1809
    public void moveImeisToPriceDropImeis() throws Exception {
1810
        List<PriceDrop> priceDrops = priceDropRepository.selectAll();
1811
        for (PriceDrop priceDrop : priceDrops) {
1812
            priceDropService.priceDropStatus(priceDrop.getId());
1813
        }
1814
    }
29160 amit.gupta 1815
 
31697 amit.gupta 1816
    public void walletmismatch() throws Exception {
1817
        LocalDate curDate = LocalDate.now();
1818
        List<PartnerDailyInvestment> pdis = partnerDailyInvestmentRepository.selectAll(curDate.minusDays(2));
1819
        System.out.println(pdis.size());
1820
        for (PartnerDailyInvestment pdi : pdis) {
1821
            int fofoId = pdi.getFofoId();
31886 tejbeer 1822
            for (PartnerDailyInvestment investment : Lists.reverse(partnerDailyInvestmentRepository.selectAll(fofoId, null, null))) {
1823
                float statementAmount = walletService.getOpeningTill(fofoId, investment.getDate().plusDays(1).atTime(LocalTime.of(4, 0)));
31697 amit.gupta 1824
                CustomRetailer retailer = retailerService.getFofoRetailer(fofoId);
31886 tejbeer 1825
                LOGGER.info("{}\t{}\t{}\t{}\t{}", fofoId, retailer.getBusinessName(), retailer.getMobileNumber(), investment.getDate().toString(), investment.getWalletAmount(), statementAmount);
29160 amit.gupta 1826
 
31697 amit.gupta 1827
            }
1828
        }
29160 amit.gupta 1829
 
31697 amit.gupta 1830
    }
29160 amit.gupta 1831
 
31697 amit.gupta 1832
    @Autowired
1833
    StateRepository stateRepository;
29160 amit.gupta 1834
 
31697 amit.gupta 1835
    public void gst() throws Exception {
31886 tejbeer 1836
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.of(2021, 8, 16).atStartOfDay(), LocalDateTime.now());
31697 amit.gupta 1837
        for (FofoOrder fofoOrder : fofoOrders) {
31886 tejbeer 1838
            int retailerAddressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoOrder.getFofoId());
24548 amit.gupta 1839
 
31697 amit.gupta 1840
            Address retailerAddress = addressRepository.selectById(retailerAddressId);
1841
            CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
1842
            Integer stateId = null;
1843
            if (customerAddress.getState().equals(retailerAddress.getState())) {
1844
                try {
1845
                    stateId = stateRepository.selectByName(customerAddress.getState()).getId();
1846
                } catch (Exception e) {
1847
                    LOGGER.error("Cannot found state named {}", customerAddress.getState());
1848
                    continue;
1849
                }
1850
            }
1851
            Map<Integer, GstRate> itemIdStateTaxRateMap = null;
24542 amit.gupta 1852
 
31697 amit.gupta 1853
            List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1854
            List<Integer> itemIds = fofoOrderItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
1855
            if (stateId != null) {
1856
                itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(itemIds, stateId);
1857
            } else {
32145 tejbeer 1858
                itemIdStateTaxRateMap = stateGstRateRepository.getIgstTaxRate(itemIds);
31697 amit.gupta 1859
            }
24580 amit.gupta 1860
 
31697 amit.gupta 1861
            for (FofoOrderItem foi : fofoOrderItems) {
1862
                float sgstRate = foi.getSgstRate();
1863
                float cgstRate = foi.getCgstRate();
1864
                float igstRate = foi.getIgstRate();
32145 tejbeer 1865
                foi.setCgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate());
1866
                foi.setSgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
1867
                foi.setIgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getIgstRate());
24587 amit.gupta 1868
 
32145 tejbeer 1869
                LOGGER.info("Invoice {}, Date {}", fofoOrder.getInvoiceNumber(), fofoOrder.getCreateTimestamp());
1870
                LOGGER.info("customerAddress.getState() {}, retailerAddress.getState() {}", customerAddress.getState(), retailerAddress.getState());
1871
                LOGGER.info("Rates getIgstRate() {}", itemIdStateTaxRateMap.get(foi.getItemId()).getIgstRate());
1872
                LOGGER.info("Rates getCgstRate() {}, getSgstRate() {}", itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate(), itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
24587 amit.gupta 1873
 
1874
 
31697 amit.gupta 1875
            }
1876
        }
26092 amit.gupta 1877
 
31697 amit.gupta 1878
    }
24590 amit.gupta 1879
 
33256 amit.gupta 1880
    public void schemewalletmismatch() throws ProfitMandiBusinessException {
31697 amit.gupta 1881
        LocalDate dateToReconcile = LocalDate.of(2018, 4, 1);
1882
        while (dateToReconcile.isBefore(LocalDate.now())) {
1883
            reconcileSchemes(dateToReconcile);
1884
            // reconcileOrders(dateTime);
1885
            // reconcileRecharges(dateTime);
1886
            dateToReconcile = dateToReconcile.plusDays(1);
1887
        }
1888
    }
24587 amit.gupta 1889
 
33256 amit.gupta 1890
    private void reconcileSchemes(LocalDate date) throws ProfitMandiBusinessException {
31697 amit.gupta 1891
        LocalDateTime startDate = date.atStartOfDay();
1892
        LocalDateTime endDate = startDate.plusDays(1);
1893
        List<SchemeInOut> siosCreated = schemeInOutRepository.selectAllByCreateDate(startDate, endDate);
1894
        List<SchemeInOut> siosRefunded = schemeInOutRepository.selectAllByRefundDate(startDate, endDate);
1895
        double totalSchemeDisbursed = siosCreated.stream().mapToDouble(x -> x.getAmount()).sum();
1896
        double totalSchemeRolledback = siosRefunded.stream().mapToDouble(x -> x.getAmount()).sum();
1897
        double netSchemeDisbursed = totalSchemeDisbursed - totalSchemeRolledback;
31886 tejbeer 1898
        List<WalletReferenceType> walletReferenceTypes = Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT);
1899
        List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByDateType(startDate, endDate, walletReferenceTypes);
31697 amit.gupta 1900
        double schemeAmountWalletTotal = history.stream().mapToDouble(x -> x.getAmount()).sum();
1901
        if (Math.abs(netSchemeDisbursed - schemeAmountWalletTotal) > 10d) {
1902
            LOGGER.info("Scheme Amount mismatched for Date {}", date);
24590 amit.gupta 1903
 
31724 amit.gupta 1904
            Map<Integer, Double> inventoryItemSchemeIO = siosCreated.stream().collect(groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
24635 amit.gupta 1905
 
31886 tejbeer 1906
            Map<Integer, Double> userSchemeMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIO.keySet()).stream().collect(groupingBy(x -> x.getFofoId(), Collectors.summingDouble(x -> inventoryItemSchemeIO.get(x.getId()))));
24635 amit.gupta 1907
 
31724 amit.gupta 1908
            Map<Integer, Double> inventoryItemSchemeIORefunded = siosRefunded.stream().collect(groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
24635 amit.gupta 1909
 
31886 tejbeer 1910
            Map<Integer, Double> userSchemeRefundedMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIORefunded.keySet()).stream().collect(groupingBy(x -> x.getFofoId(), Collectors.summingDouble(x -> inventoryItemSchemeIORefunded.get(x.getId()))));
24635 amit.gupta 1911
 
31697 amit.gupta 1912
            Map<Integer, Double> finalUserSchemeAmountMap = new HashMap<>();
24635 amit.gupta 1913
 
33452 amit.gupta 1914
            for (Entry<Integer, Double> schemeAmount : userSchemeRefundedMap.entrySet()) {
31697 amit.gupta 1915
                if (!finalUserSchemeAmountMap.containsKey(schemeAmount.getKey())) {
1916
                    finalUserSchemeAmountMap.put(schemeAmount.getKey(), schemeAmount.getValue());
1917
                } else {
31886 tejbeer 1918
                    finalUserSchemeAmountMap.put(schemeAmount.getKey(), finalUserSchemeAmountMap.get(schemeAmount.getKey()) + schemeAmount.getValue());
31697 amit.gupta 1919
                }
1920
            }
31886 tejbeer 1921
            Map<Integer, Integer> userWalletMap = userWalletRepository.selectByRetailerIds(finalUserSchemeAmountMap.keySet()).stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24635 amit.gupta 1922
 
31724 amit.gupta 1923
            Map<Integer, Double> walletAmountMap = history.stream().collect(groupingBy(
31697 amit.gupta 1924
                    UserWalletHistory::getWalletId, Collectors.summingDouble((UserWalletHistory::getAmount))));
33452 amit.gupta 1925
            for (Entry<Integer, Double> userAmount : walletAmountMap.entrySet()) {
31697 amit.gupta 1926
                double diff = Math.abs(finalUserSchemeAmountMap.get(userAmount.getKey()) - userAmount.getValue());
1927
                if (diff > 5) {
1928
                    LOGGER.info("Partner scheme mismatched for Userid {}", userWalletMap.get(userAmount.getKey()));
1929
                }
1930
            }
1931
        }
24635 amit.gupta 1932
 
31697 amit.gupta 1933
    }
24635 amit.gupta 1934
 
31697 amit.gupta 1935
    public void dryRunSchemeReco() throws Exception {
31886 tejbeer 1936
        Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24635 amit.gupta 1937
 
31697 amit.gupta 1938
        List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1939
        List<SchemeInOut> rolledbackSios = new ArrayList<>();
31886 tejbeer 1940
        Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream().collect(Collectors.toMap(Scheme::getId, Scheme::getType));
31697 amit.gupta 1941
        Set<String> serialNumbersConsidered = new HashSet<>();
24631 amit.gupta 1942
 
31697 amit.gupta 1943
        LocalDateTime startDate = LocalDate.of(2018, 3, 1).atStartOfDay();
1944
        LocalDateTime endDate = LocalDate.now().atStartOfDay();
1945
        List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
24598 amit.gupta 1946
 
31697 amit.gupta 1947
        Map<Integer, String> storeNameMap = fofoStoreRepository.getStoresMap();
33256 amit.gupta 1948
        for (Purchase purchase : purchases) {
31697 amit.gupta 1949
            float amountToRollback = 0;
31886 tejbeer 1950
            String description = "Adjustment of Duplicate Scheme for Purchase Invoice " + purchase.getPurchaseReference();
1951
            Map<Integer, String> inventorySerialNumberMap = inventoryItemRepository.selectByPurchaseId(purchase.getId()).stream().filter(ii -> ii.getSerialNumber() != null).collect(Collectors.toMap(InventoryItem::getId, InventoryItem::getSerialNumber));
31697 amit.gupta 1952
            if (inventorySerialNumberMap.size() > 0) {
33256 amit.gupta 1953
                for (Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
31697 amit.gupta 1954
                    String serialNumber = inventorySerialNumberEntry.getValue();
1955
                    int inventoryItemId = inventorySerialNumberEntry.getKey();
1956
                    if (serialNumbersConsidered.contains(serialNumber)) {
1957
                        // This will rollback scheme for differenct orders for same serial
31886 tejbeer 1958
                        List<SchemeInOut> sios = schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream().filter(x -> x.getRolledBackTimestamp() == null && schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN)).collect(Collectors.toList());
31697 amit.gupta 1959
                        Collections.reverse(sios);
1960
                        for (SchemeInOut sio : sios) {
1961
                            sio.setRolledBackTimestamp(LocalDateTime.now());
1962
                            amountToRollback += sio.getAmount();
1963
                            // sio.setSchemeType(SchemeType.OUT);
1964
                            sio.setSerialNumber(serialNumber);
1965
                            rolledbackSios.add(sio);
1966
                        }
1967
                        description = description.concat(" " + serialNumber + " ");
1968
                    } else {
1969
                        serialNumbersConsidered.add(serialNumber);
1970
                        List<Integer> schemesConsidered = new ArrayList<>();
31886 tejbeer 1971
                        List<SchemeInOut> sios = schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream().filter(x -> x.getRolledBackTimestamp() == null && schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN)).collect(Collectors.toList());
31697 amit.gupta 1972
                        Collections.reverse(sios);
1973
                        for (SchemeInOut sio : sios) {
1974
                            if (!schemesConsidered.contains(sio.getSchemeId())) {
1975
                                schemesConsidered.add(sio.getSchemeId());
1976
                                continue;
1977
                            }
1978
                            sio.setRolledBackTimestamp(LocalDateTime.now());
1979
                            amountToRollback += sio.getAmount();
1980
                            // sio.setSchemeType(SchemeType.OUT);
1981
                            sio.setSerialNumber(serialNumber);
1982
                            sio.setStoreCode(storeNameMap.get(purchase.getFofoId()));
1983
                            sio.setReference(purchase.getId());
1984
                            rolledbackSios.add(sio);
1985
                        }
1986
                    }
24592 amit.gupta 1987
 
31697 amit.gupta 1988
                }
1989
            }
1990
            if (amountToRollback > 0) {
1991
                // Address address =
1992
                // addressRepository.selectAllByRetailerId(purchase.getFofoId(), 0, 10).get(0);
1993
                UserWalletHistory uwh = new UserWalletHistory();
1994
                uwh.setAmount(Math.round(amountToRollback));
1995
                uwh.setDescription(description);
1996
                uwh.setTimestamp(LocalDateTime.now());
1997
                uwh.setReferenceType(WalletReferenceType.SCHEME_IN);
1998
                uwh.setReference(purchase.getId());
1999
                uwh.setWalletId(userWalletMap.get(purchase.getFofoId()));
2000
                uwh.setFofoId(purchase.getFofoId());
2001
                uwh.setStoreCode(storeNameMap.get(purchase.getFofoId()));
2002
                userWalletHistory.add(uwh);
2003
            }
33256 amit.gupta 2004
        }
31697 amit.gupta 2005
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
31886 tejbeer 2006
                Arrays.asList("User Id", "Store Code", "Reference Type", "Reference", "Amount", "Description", "Timestamp"), userWalletHistory.stream().map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(), x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp())).collect(Collectors.toList()));
24592 amit.gupta 2007
 
31697 amit.gupta 2008
        ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
31886 tejbeer 2009
                Arrays.asList("Scheme ID", "SchemeType", "Reference", "Store Code", "Serial Number", "Amount", "Created", "Rolledback"), rolledbackSios.stream().map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getReference(), x.getStoreCode(), x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp())).collect(Collectors.toList()));
24631 amit.gupta 2010
 
31886 tejbeer 2011
        Utils.sendMailWithAttachments(googleMailSender, new String[]{"amit.gupta@shop2020.in"}, null, "Partner Excess Amount Scheme In", "PFA", new Attachment[]{new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())), new Attachment("SchemeInRolledback.csv", new ByteArrayResource(baosOuts.toByteArray()))});
24615 amit.gupta 2012
 
31697 amit.gupta 2013
        throw new Exception();
24615 amit.gupta 2014
 
31697 amit.gupta 2015
    }
24615 amit.gupta 2016
 
31697 amit.gupta 2017
    public void dryRunOutSchemeReco() throws Exception {
2018
        List<UserWalletHistory> userWalletHistory = new ArrayList<>();
2019
        List<SchemeInOut> rolledbackSios = new ArrayList<>();
31886 tejbeer 2020
        Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
2021
        Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream().collect(Collectors.toMap(Scheme::getId, Scheme::getType));
31697 amit.gupta 2022
        LocalDateTime startDate = LocalDate.of(2019, 5, 1).atStartOfDay();
2023
        LocalDateTime endDate = LocalDate.now().atStartOfDay();
2024
        List<FofoOrder> allOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
2025
        // Collections.reverse(allOrders);
2026
        // List<FofoOrder> allOrders =
2027
        // List<FofoOrder> allOrders =
2028
        // Arrays.asList(fofoOrderRepository.selectByInvoiceNumber("UPGZ019/25"));
2029
        Set<String> serialNumbersConsidered = new HashSet<>();
33256 amit.gupta 2030
        for (FofoOrder fofoOrder : allOrders) {
31697 amit.gupta 2031
            String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
2032
            Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
2033
            float amountToRollback = 0;
2034
            List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
2035
            orderItems.forEach(x -> {
31886 tejbeer 2036
                inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null).collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
31697 amit.gupta 2037
            });
2038
            if (inventorySerialNumberMap.size() > 0) {
33256 amit.gupta 2039
                for (Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
31697 amit.gupta 2040
                    String serialNumber = inventorySerialNumberEntry.getValue();
2041
                    int inventoryItemId = inventorySerialNumberEntry.getKey();
2042
                    if (serialNumbersConsidered.contains(serialNumber)) {
2043
                        // This will rollback scheme for differenct orders for same serial
33256 amit.gupta 2044
                        List<SchemeInOut> sios = new ArrayList<>();
2045
                        for (SchemeInOut schemeInOut : schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId)))) {
2046
                            if (schemeInOut.getRolledBackTimestamp() == null && schemeTypeMap.get(schemeInOut.getSchemeId()).equals(SchemeType.OUT)) {
2047
                                sios.add(schemeInOut);
2048
                            }
2049
                        }
31697 amit.gupta 2050
                        Collections.reverse(sios);
2051
                        for (SchemeInOut sio : sios) {
2052
                            sio.setRolledBackTimestamp(LocalDateTime.now());
2053
                            amountToRollback += sio.getAmount();
2054
                            // sio.setSchemeType(SchemeType.OUT);
2055
                            sio.setSerialNumber(serialNumber);
2056
                            sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
2057
                            sio.setReference(fofoOrder.getId());
2058
                            rolledbackSios.add(sio);
2059
                        }
2060
                        description = description.concat(" " + serialNumber + " ");
2061
                    } else {
2062
                        serialNumbersConsidered.add(serialNumber);
2063
                        List<Integer> schemesConsidered = new ArrayList<>();
31886 tejbeer 2064
                        List<SchemeInOut> sios = schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream().filter(x -> x.getRolledBackTimestamp() == null && schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT)).collect(Collectors.toList());
31697 amit.gupta 2065
                        Collections.reverse(sios);
2066
                        for (SchemeInOut sio : sios) {
2067
                            if (!schemesConsidered.contains(sio.getSchemeId())) {
2068
                                schemesConsidered.add(sio.getSchemeId());
2069
                                continue;
2070
                            }
2071
                            sio.setRolledBackTimestamp(LocalDateTime.now());
2072
                            amountToRollback += sio.getAmount();
2073
                            // sio.setSchemeType(SchemeType.OUT);
2074
                            sio.setReference(fofoOrder.getId());
2075
                            sio.setSerialNumber(serialNumber);
2076
                            sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
2077
                            rolledbackSios.add(sio);
2078
                        }
2079
                    }
24615 amit.gupta 2080
 
31697 amit.gupta 2081
                }
2082
            }
2083
            if (amountToRollback > 0) {
2084
                UserWalletHistory uwh = new UserWalletHistory();
2085
                uwh.setAmount(Math.round(amountToRollback));
2086
                uwh.setDescription(description);
2087
                uwh.setTimestamp(LocalDateTime.now());
2088
                uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
2089
                uwh.setReference(fofoOrder.getId());
2090
                uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
2091
                uwh.setFofoId(fofoOrder.getFofoId());
2092
                uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
2093
                userWalletHistory.add(uwh);
2094
            }
33256 amit.gupta 2095
        }
24615 amit.gupta 2096
 
31697 amit.gupta 2097
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
31886 tejbeer 2098
                Arrays.asList("Wallet Id", "Store Code", "Reference Type", "Reference", "Amount", "Description", "Timestamp"), userWalletHistory.stream().map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(), x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp())).collect(Collectors.toList()));
24615 amit.gupta 2099
 
31697 amit.gupta 2100
        ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
31886 tejbeer 2101
                Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created", "Rolledback"), rolledbackSios.stream().map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(), x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp())).collect(Collectors.toList()));
24631 amit.gupta 2102
 
31886 tejbeer 2103
        Utils.sendMailWithAttachments(googleMailSender, new String[]{"amit.gupta@shop2020.in"}, null, "Partner Excess Amount Scheme Out", "PFA", new Attachment[]{new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())), new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray()))});
24615 amit.gupta 2104
 
31697 amit.gupta 2105
        throw new Exception();
2106
    }
24615 amit.gupta 2107
 
31697 amit.gupta 2108
    public void dryRunSchemeOutReco1() throws Exception {
2109
        List<Integer> references = Arrays.asList(6744, 7347, 8320, 8891, 9124, 9217, 9263, 9379);
2110
        List<UserWalletHistory> userWalletHistory = new ArrayList<>();
2111
        List<SchemeInOut> rolledbackSios = new ArrayList<>();
31886 tejbeer 2112
        Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
2113
        Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream().collect(Collectors.toMap(Scheme::getId, Scheme::getType));
33256 amit.gupta 2114
        for (Integer reference : references) {
31697 amit.gupta 2115
            FofoOrder fofoOrder = null;
2116
            try {
2117
                fofoOrder = fofoOrderRepository.selectByOrderId(reference);
2118
            } catch (Exception e) {
25927 amit.gupta 2119
 
31697 amit.gupta 2120
            }
2121
            String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
2122
            Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
2123
            float amountToRollback = 0;
2124
            List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
2125
            orderItems.forEach(x -> {
31886 tejbeer 2126
                inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null).collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
31697 amit.gupta 2127
            });
2128
            if (inventorySerialNumberMap.size() > 0) {
31886 tejbeer 2129
                List<SchemeInOut> sios = schemeInOutRepository.selectByInventoryItemIds(inventorySerialNumberMap.keySet()).stream().filter(x -> schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT)).collect(Collectors.toList());
31697 amit.gupta 2130
                LOGGER.info("Found {} duplicate schemeouts for Orderid {}", sios.size(), fofoOrder.getId());
2131
                UserWalletHistory uwh = new UserWalletHistory();
31886 tejbeer 2132
                Map<Integer, List<SchemeInOut>> inventoryIdSouts = sios.stream().collect(groupingBy(SchemeInOut::getInventoryItemId, Collectors.toList()));
33256 amit.gupta 2133
                for (Entry<Integer, List<SchemeInOut>> inventorySioEntry : inventoryIdSouts.entrySet()) {
31697 amit.gupta 2134
                    List<SchemeInOut> outList = inventorySioEntry.getValue();
2135
                    if (outList.size() > 1) {
24683 amit.gupta 2136
 
31697 amit.gupta 2137
                    }
2138
                }
2139
                uwh.setAmount(Math.round(amountToRollback));
2140
                uwh.setDescription(description);
2141
                uwh.setTimestamp(LocalDateTime.now());
2142
                uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
2143
                uwh.setReference(fofoOrder.getId());
2144
                uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
2145
                uwh.setFofoId(fofoOrder.getFofoId());
2146
                uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
2147
                userWalletHistory.add(uwh);
2148
            }
33256 amit.gupta 2149
        }
26945 amit.gupta 2150
 
31697 amit.gupta 2151
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
31886 tejbeer 2152
                Arrays.asList("User Id", "Reference Type", "Reference", "Amount", "Description", "Timestamp"), userWalletHistory.stream().map(x -> Arrays.asList(x.getWalletId(), x.getReferenceType(), x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp())).collect(Collectors.toList()));
26945 amit.gupta 2153
 
31697 amit.gupta 2154
        ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
31886 tejbeer 2155
                Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created", "Rolledback"), rolledbackSios.stream().map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(), x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp())).collect(Collectors.toList()));
26941 amit.gupta 2156
 
31886 tejbeer 2157
        Utils.sendMailWithAttachments(googleMailSender, new String[]{"amit.gupta@shop2020.in", "neeraj.gupta@smartdukaan.com"}, null, "Partner Excess Amount", "PFA", new Attachment[]{new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())), new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray()))});
26945 amit.gupta 2158
 
31697 amit.gupta 2159
        throw new Exception();
25880 amit.gupta 2160
 
31697 amit.gupta 2161
    }
30982 tejbeer 2162
 
31697 amit.gupta 2163
    public void sendDailySalesNotificationToPartner(Integer fofoIdInt) throws Exception {
30982 tejbeer 2164
 
31697 amit.gupta 2165
        LocalDateTime now = LocalDateTime.now();
2166
        LocalDateTime from = now.with(LocalTime.MIN);
2167
        String timeString = "Today %s";
2168
        // Send yesterday's report
2169
        /*
2170
         * if (now.getHour() < 13) { timeString = "Yesterday %s"; from =
2171
         * now.minusDays(1).; now = from.with(LocalTime.MAX);
2172
         *
2173
         * }
2174
         */
30982 tejbeer 2175
 
31697 amit.gupta 2176
        List<Integer> fofoIds = null;
31886 tejbeer 2177
        Map<Integer, FofoStore> fofoStoreMap = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getId(), x -> x));
30982 tejbeer 2178
 
24653 govind 2179
 
31697 amit.gupta 2180
        if (fofoIdInt == null) {
2181
            fofoIds = new ArrayList<>(fofoStoreMap.keySet());
2182
        } else {
2183
            fofoIds = Arrays.asList(fofoIdInt);
2184
        }
2185
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
28368 tejbeer 2186
 
31886 tejbeer 2187
        Map<Integer, Float> partnerPolicyAmountMap = insurancePolicyRepository.selectAmountSumGroupByRetailerId(now, null);
31697 amit.gupta 2188
        Map<Integer, Long> partnerPolicyQtyMap = insurancePolicyRepository.selectQtyGroupByRetailerId(now, null);
28368 tejbeer 2189
 
31886 tejbeer 2190
        Map<Integer, Double> spPartnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0, true);
28377 tejbeer 2191
 
31886 tejbeer 2192
        Map<Integer, Double> spPartner3DaysOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from.minusDays(3), now, 0, true);
31697 amit.gupta 2193
        Map<Integer, Long> spPartnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, true);
28368 tejbeer 2194
 
31886 tejbeer 2195
        Map<Integer, Double> partnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0, false);
31697 amit.gupta 2196
        Map<Integer, Long> partnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, false);
28377 tejbeer 2197
 
31697 amit.gupta 2198
        //4 days + current day running
2199
        Map<Integer, Double> partnerBilledValueMap = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(from.minusDays(4), now);
28377 tejbeer 2200
 
31697 amit.gupta 2201
        Map<Integer, SaleTargetReportModel> saleTargetReportModelMap = new HashMap<>();
2202
        for (int fofoId : fofoIds) {
2203
            SaleTargetReportModel model = new SaleTargetReportModel();
2204
            model.setInsuranceSale(
2205
                    partnerPolicyAmountMap.containsKey(fofoId) ? partnerPolicyAmountMap.get(fofoId).doubleValue() : 0);
2206
            model.setInsruanceQty(partnerPolicyQtyMap.containsKey(fofoId) ? partnerPolicyQtyMap.get(fofoId) : 0);
2207
            model.setSecondary(partnerBilledValueMap.containsKey(fofoId) ? partnerBilledValueMap.get(fofoId) : 0);
2208
            model.setSmartphoneSale(spPartnerOrderValMap.containsKey(fofoId) ? spPartnerOrderValMap.get(fofoId) : 0);
2209
            model.setSmartphoneQty(spPartnerOrderQtyMap.containsKey(fofoId) ? spPartnerOrderQtyMap.get(fofoId) : 0);
2210
            model.setTotalSale(partnerOrderValMap.containsKey(fofoId) ? partnerOrderValMap.get(fofoId) : 0);
2211
            model.setTotalQty(partnerOrderQtyMap.containsKey(fofoId) ? partnerOrderQtyMap.get(fofoId) : 0);
2212
            model.setPast3daysSale(
2213
                    spPartner3DaysOrderValMap.containsKey(fofoId) ? spPartner3DaysOrderValMap.get(fofoId) : 0);
2214
            model.setFofoId(fofoId);
2215
            model.setCode(fofoStoreMap.get(fofoId).getCode());
31724 amit.gupta 2216
            model.setActivationType(fofoStoreMap.get(fofoId).getActivationType());
31697 amit.gupta 2217
            saleTargetReportModelMap.put(fofoId, model);
2218
        }
28377 tejbeer 2219
 
31697 amit.gupta 2220
        Map<Integer, FofoReportingModel> partnerSalesHeadersMap = this.getPartnerIdSalesHeaders();
2221
        for (Integer fofoId : fofoIds) {
2222
            SaleTargetReportModel model = saleTargetReportModelMap.get(fofoId);
28368 tejbeer 2223
 
31697 amit.gupta 2224
            // com.spice.profitmandi.dao.entity.user.User user =
2225
            // userUserRepository.selectById(fofoId);
28377 tejbeer 2226
 
31697 amit.gupta 2227
            // Address address = addressRepository.selectById(user.getAddressId());
28377 tejbeer 2228
 
31697 amit.gupta 2229
            String title = "Sale Update";
31886 tejbeer 2230
            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 2231
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
2232
            sendNotificationModel.setCampaignName("Sales update alert");
2233
            sendNotificationModel.setTitle(title);
2234
            sendNotificationModel.setMessage(messageTemplate);
2235
            sendNotificationModel.setType("url");
2236
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
2237
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
2238
            sendNotificationModel.setMessageType(MessageType.notification);
2239
            int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
2240
            sendNotificationModel.setUserIds(Arrays.asList(userId));
2241
            notificationService.sendNotification(sendNotificationModel);
2242
            String whatsappMessageTemplate = String.format(
31886 tejbeer 2243
                    "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 2244
            // notificationService.sendWhatsappMessage(whatsappMessageTemplate, title,
2245
            // address.getPhoneNumber());
28377 tejbeer 2246
 
31697 amit.gupta 2247
        }
2248
        // String saleReport = this.getDailySalesReportHtml(partnerSalesHeadersMap,
2249
        // saleTargetReportModelMap);
2250
        this.getStateWiseSales(saleTargetReportModelMap, partnerSalesHeadersMap);
2251
    }
28377 tejbeer 2252
 
31697 amit.gupta 2253
    public void checkRazorPayPaymentStatus() throws Exception {
31886 tejbeer 2254
        List<PendingOrder> pendingOrder = pendingOrderRepository.selectAllByStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PENDING);
28377 tejbeer 2255
 
31697 amit.gupta 2256
        for (PendingOrder po : pendingOrder) {
2257
            RazorPay razorPay = razorPayRepository.selectByOrdeId(po.getId());
2258
            List<PendingOrderItem> poItems = pendingOrderItemRepository.selectByOrderId(po.getId());
28369 tejbeer 2259
 
31697 amit.gupta 2260
            LOGGER.info("razorPay" + razorPay);
2261
            if (razorPay != null) {
2262
                List<Payment> payments = razorPaymentService.fetchOrderForPayment(razorPay.getRazorOrderId());
28368 tejbeer 2263
 
31697 amit.gupta 2264
                if (!payments.isEmpty()) {
2265
                    List<String> statusList = new ArrayList<>();
2266
                    for (Payment payment : payments) {
25880 amit.gupta 2267
 
31697 amit.gupta 2268
                        JSONObject jsonObj = new JSONObject(payment.toString());
25880 amit.gupta 2269
 
31697 amit.gupta 2270
                        String status = jsonObj.getString("status");
25880 amit.gupta 2271
 
31697 amit.gupta 2272
                        statusList.add(status);
25865 amit.gupta 2273
 
31697 amit.gupta 2274
                    }
2275
                    LOGGER.info("statusList" + statusList);
26941 amit.gupta 2276
 
31697 amit.gupta 2277
                    if (statusList.contains("authorized") || statusList.contains("captured")) {
2278
                        po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
2279
                        po.setPaidAmount(po.getTotalAmount());
2280
                        for (PendingOrderItem poi : poItems) {
2281
                            poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
2282
                        }
2283
                        Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(po);
26941 amit.gupta 2284
 
31697 amit.gupta 2285
                        CustomRetailer customRetailer = retailerService.getFofoRetailer(po.getFofoId());
2286
                        Customer customer = customerRepository.selectById(po.getCustomerId());
2287
                        String[] customerEmail = null;
2288
                        if (customer.getEmailId() != null) {
2289
                            customerEmail = new String[]{customer.getEmailId()};
2290
                        }
31886 tejbeer 2291
                        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 2292
                        List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
2293
                        if (authUserEmails != null) {
2294
                            authUserEmails = new ArrayList<>();
2295
                        }
2296
                        authUserEmails.addAll(bccTo);
26945 amit.gupta 2297
 
31697 amit.gupta 2298
                        // emailService.sendMailWithAttachments("Order Created with SmartDukaan",
2299
                        // "order-confirm.vm",
2300
                        // emailModel, customerEmail, null, authUserEmails.toArray(new String[0]));
26945 amit.gupta 2301
 
31697 amit.gupta 2302
                    } else if (statusList.contains("refunded") || statusList.contains("failed")) {
2303
                        for (PendingOrderItem poi : poItems) {
2304
                            poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
2305
                        }
25865 amit.gupta 2306
 
31697 amit.gupta 2307
                        po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
2308
                    }
25865 amit.gupta 2309
 
31697 amit.gupta 2310
                }
2311
                // LOGGER.info("payment" + payments);
25865 amit.gupta 2312
 
31697 amit.gupta 2313
            }
2314
        }
2315
    }
25865 amit.gupta 2316
 
31697 amit.gupta 2317
    public static class SaleTargetReportModel {
2318
        private double totalSale;
2319
        private long totalQty;
2320
        private double past3daysSale;
2321
        private int fofoId;
2322
        private String code;
31724 amit.gupta 2323
        private ActivationType activationType;
25865 amit.gupta 2324
 
31724 amit.gupta 2325
 
2326
        @Override
2327
        public boolean equals(Object o) {
2328
            if (this == o) return true;
2329
            if (o == null || getClass() != o.getClass()) return false;
2330
            SaleTargetReportModel that = (SaleTargetReportModel) o;
2331
            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;
2332
        }
2333
 
2334
        @Override
2335
        public int hashCode() {
2336
            return Objects.hash(totalSale, totalQty, past3daysSale, fofoId, code, activationType, secondary, smartphoneSale, smartphoneQty, insuranceSale, insruanceQty);
2337
        }
2338
 
2339
        public ActivationType getActivationType() {
2340
            return activationType;
2341
        }
2342
 
2343
        public void setActivationType(ActivationType activationType) {
2344
            this.activationType = activationType;
2345
        }
2346
 
31697 amit.gupta 2347
        public double getSecondary() {
2348
            return secondary;
2349
        }
25865 amit.gupta 2350
 
31697 amit.gupta 2351
        public void setSecondary(double secondary) {
2352
            this.secondary = secondary;
2353
        }
25865 amit.gupta 2354
 
31697 amit.gupta 2355
        private double secondary;
25865 amit.gupta 2356
 
31697 amit.gupta 2357
        public int getFofoId() {
2358
            return fofoId;
2359
        }
25865 amit.gupta 2360
 
31697 amit.gupta 2361
        @Override
2362
        public String toString() {
31886 tejbeer 2363
            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 2364
        }
25865 amit.gupta 2365
 
31697 amit.gupta 2366
        public String getCode() {
2367
            return code;
2368
        }
25865 amit.gupta 2369
 
31697 amit.gupta 2370
        public void setCode(String code) {
2371
            this.code = code;
2372
        }
25865 amit.gupta 2373
 
31697 amit.gupta 2374
        public void setFofoId(int fofoId) {
2375
            this.fofoId = fofoId;
2376
        }
25872 tejbeer 2377
 
31697 amit.gupta 2378
        private double smartphoneSale;
2379
        private long smartphoneQty;
2380
        private double insuranceSale;
2381
        private long insruanceQty;
26945 amit.gupta 2382
 
31697 amit.gupta 2383
        public long getTotalQty() {
2384
            return totalQty;
2385
        }
30765 tejbeer 2386
 
31697 amit.gupta 2387
        public void setTotalQty(long totalQty) {
2388
            this.totalQty = totalQty;
2389
        }
2390
 
2391
        public double getPast3daysSale() {
2392
            return past3daysSale;
2393
        }
2394
 
2395
        public void setPast3daysSale(double past3daysSale) {
2396
            this.past3daysSale = past3daysSale;
2397
        }
2398
 
2399
        public double getTotalSale() {
2400
            return totalSale;
2401
        }
2402
 
2403
        public void setTotalSale(double totalSale) {
2404
            this.totalSale = totalSale;
2405
        }
2406
 
2407
        public double getSmartphoneSale() {
2408
            return smartphoneSale;
2409
        }
2410
 
2411
        public void setSmartphoneSale(double smartphoneSale) {
2412
            this.smartphoneSale = smartphoneSale;
2413
        }
2414
 
2415
        public long getSmartphoneQty() {
2416
            return smartphoneQty;
2417
        }
2418
 
2419
        public void setSmartphoneQty(long smartphoneQty) {
2420
            this.smartphoneQty = smartphoneQty;
2421
        }
2422
 
2423
        public double getInsuranceSale() {
2424
            return insuranceSale;
2425
        }
2426
 
2427
        public void setInsuranceSale(double insuranceSale) {
2428
            this.insuranceSale = insuranceSale;
2429
        }
2430
 
2431
        public long getInsruanceQty() {
2432
            return insruanceQty;
2433
        }
2434
 
2435
        public void setInsruanceQty(long insruanceQty) {
2436
            this.insruanceQty = insruanceQty;
2437
        }
2438
 
2439
    }
2440
 
32482 amit.gupta 2441
    private void getStateWiseSales
2442
            (Map<Integer, SaleTargetReportModel> saleTargetReportModelMap, Map<Integer, FofoReportingModel> partnerSalesHeadersMap) throws
2443
            Exception {
31697 amit.gupta 2444
        String timeString = "Today %s";
2445
        LocalDateTime now = LocalDateTime.now();
2446
 
2447
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
31886 tejbeer 2448
        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_MARKETING, ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS, ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT, ProfitMandiConstants.TICKET_CATEGORY_TECHNOLOGY);
31697 amit.gupta 2449
 
2450
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false);
2451
 
31746 amit.gupta 2452
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
2453
            String email = storeGuyEntry.getKey();
2454
            Set<Integer> fofoIds = storeGuyEntry.getValue();
2455
            LOGGER.info("fofoIds {}", fofoIds);
24683 amit.gupta 2456
 
31746 amit.gupta 2457
            if (!fofoIds.isEmpty()) {
31886 tejbeer 2458
                List<FofoStore> stores = fofoStoreRepository.selectActivePartnersByRetailerIds(new ArrayList<>(fofoIds));
26945 amit.gupta 2459
 
31724 amit.gupta 2460
                Map<String, List<Integer>> stateMap = stores.stream().collect(groupingBy(
2461
                        x -> x.getCode().substring(0, 2), mapping(x -> x.getId(), Collectors.toList())));
31697 amit.gupta 2462
                List<List<Serializable>> stateWiseSales = new ArrayList<>();
33452 amit.gupta 2463
                for (Entry<String, List<Integer>> stateMapEntry : stateMap.entrySet()) {
31886 tejbeer 2464
                    long totalQty = stateMapEntry.getValue().stream().collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getTotalQty()));
2465
                    double totalSale = stateMapEntry.getValue().stream().collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getTotalSale()));
2466
                    long smartPhoneQty = stateMapEntry.getValue().stream().collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getSmartphoneQty()));
31697 amit.gupta 2467
                    double smartPhoneSale = stateMapEntry.getValue().stream().collect(
2468
                            Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getSmartphoneSale()));
2469
                    stateWiseSales.add(
2470
                            Arrays.asList(stateMapEntry.getKey(), smartPhoneQty, smartPhoneSale, totalQty, totalSale));
2471
                }
2472
                StringBuilder sb = new StringBuilder();
2473
                sb.append("<html><body>");
2474
                sb.append("<p>Statewise Sale Report:</p><br/><table style=\"border-collapse: collapse;\">");
31886 tejbeer 2475
                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 2476
                for (List<Serializable> stateSale : stateWiseSales) {
2477
                    sb.append("<tr>");
2478
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(0) + "</td>");
2479
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(1) + "</td>");
2480
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(2) + "</td>");
2481
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(3) + "</td>");
2482
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(4) + "</td>");
2483
                    sb.append("</tr>");
2484
                }
2485
                sb.append("</tbody></table><br><br>");
26945 amit.gupta 2486
 
31697 amit.gupta 2487
                sb.append("<p>Partnerwise Report:</p><br/><table style=\"border-collapse: collapse;\">");
31886 tejbeer 2488
                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 2489
 
2490
 
31886 tejbeer 2491
                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 2492
 
31697 amit.gupta 2493
                String subject = String.format("Sale till %s", String.format(timeString, now.format(timeFormatter)));
31169 tejbeer 2494
 
31886 tejbeer 2495
                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 2496
                List<List<?>> rows = new ArrayList<>();
2497
                for (Integer fofoId : sortedSaleTargetReport) {
2498
                    FofoReportingModel fofoReportingModel = partnerSalesHeadersMap.get(fofoId);
31886 tejbeer 2499
                    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 2500
                    ));
31169 tejbeer 2501
 
31724 amit.gupta 2502
                    //Now try to populate html rows
2503
                    if (!saleTargetReportModelMap.get(fofoId).getActivationType().equals(ActivationType.ACTIVE)) {
31697 amit.gupta 2504
                        continue;
2505
                    }
2506
                    if (saleTargetReportModelMap.get(fofoId).getSecondary() == 0) {
2507
                        sb.append("<tr style='background-color:#D21F3C;color:white'>");
2508
                    } else {
2509
                        sb.append("<tr>");
2510
                    }
31886 tejbeer 2511
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getCode() + "</td>");
2512
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getBusinessName() + "</td>");
2513
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getBusinessManager() + "</td>");
2514
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getRegionalManager() + "</td>");
2515
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getTerritoryManager() + "</td>");
2516
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSecondary() + "</td>");
2517
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getTotalSale() + "</td>");
2518
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSmartphoneSale() + "</td>");
2519
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSmartphoneQty() + "</td>");
31697 amit.gupta 2520
                    sb.append("</tr>");
24841 govind 2521
 
25300 tejbeer 2522
 
31697 amit.gupta 2523
                }
2524
                sb.append("</tr>");
2525
                sb.append("</body></html>");
2526
                String statewiseSaleReport = sb.toString();
25300 tejbeer 2527
 
2528
 
31697 amit.gupta 2529
                ByteArrayOutputStream baos = null;
2530
                try {
2531
                    baos = FileUtil.getCSVByteStream(headers, rows);
2532
                } catch (Exception e2) {
2533
                    e2.printStackTrace();
2534
                }
2535
                Attachment attachment = new Attachment("PartnerSalePerformance.csv", new ByteArrayResource(baos.toByteArray()));
2536
                Utils.sendHtmlMailWithAttachments(googleMailSender, new String[]{email}, null, "Statewise " + subject, statewiseSaleReport, attachment);
2537
            }
2538
        }
2539
    }
29668 tejbeer 2540
 
32350 amit.gupta 2541
 
32482 amit.gupta 2542
    private void sendMailOfHtmlFormat(JavaMailSender sender, String[] email, String body, String cc[], String subject) throws
2543
            MessagingException, ProfitMandiBusinessException, IOException {
32350 amit.gupta 2544
        MimeMessage message = sender.createMimeMessage();
31697 amit.gupta 2545
        MimeMessageHelper helper = new MimeMessageHelper(message);
2546
        helper.setSubject(subject);
2547
        helper.setText(body, true);
2548
        helper.setTo(email);
2549
        if (cc != null) {
2550
            helper.setCc(cc);
2551
        }
2552
        InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
2553
        helper.setFrom(senderAddress);
2554
        mailSender.send(message);
2555
    }
25694 amit.gupta 2556
 
31697 amit.gupta 2557
    public void sendNotification() throws Exception {
32610 amit.gupta 2558
        List<PushNotifications> pushNotifications = pushNotificationRepository.selectAllPendingNotifications();
31697 amit.gupta 2559
        if (!pushNotifications.isEmpty()) {
2560
            for (PushNotifications pushNotification : pushNotifications) {
2561
                Device device = deviceRepository.selectById(pushNotification.getDeviceId());
31886 tejbeer 2562
                NotificationCampaign notificationCampaign = notificationCampaignRepository.selectById(pushNotification.getNotificationCampaignid());
2563
                SimpleCampaignParams scp = gson.fromJson(notificationCampaign.getImplementationParams(), SimpleCampaignParams.class);
31697 amit.gupta 2564
                Campaign campaign = new SimpleCampaign(scp);
2565
                String result_url = campaign.getUrl() + "&user_id=" + device.getUser_id();
2566
                JSONObject json = new JSONObject();
2567
                json.put("to", device.getFcmId());
2568
                JSONObject jsonObj = new JSONObject();
2569
                jsonObj.put("message", campaign.getMessage());
2570
                jsonObj.put("title", campaign.getTitle());
2571
                jsonObj.put("type", campaign.getType());
2572
                jsonObj.put("url", result_url);
2573
                jsonObj.put("time_to_live", campaign.getExpireTimestamp());
2574
                jsonObj.put("image", campaign.getImageUrl());
2575
                jsonObj.put("largeIcon", "large_icon");
2576
                jsonObj.put("smallIcon", "small_icon");
2577
                jsonObj.put("vibrate", 1);
2578
                jsonObj.put("pid", pushNotification.getId());
2579
                jsonObj.put("sound", 1);
2580
                jsonObj.put("priority", "high");
2581
                json.put("data", jsonObj);
2582
                try {
2583
                    CloseableHttpClient client = HttpClients.createDefault();
2584
                    HttpPost httpPost = new HttpPost(FCM_URL);
25694 amit.gupta 2585
 
31697 amit.gupta 2586
                    httpPost.setHeader("Content-Type", "application/json; utf-8");
2587
                    httpPost.setHeader("authorization", "key=" + FCM_API_KEY);
2588
                    StringEntity entity = new StringEntity(json.toString());
2589
                    httpPost.setEntity(entity);
2590
                    CloseableHttpResponse response = client.execute(httpPost);
30858 amit.gupta 2591
 
31697 amit.gupta 2592
                    if (response.getStatusLine().getStatusCode() == 200) {
2593
                        pushNotification.setSentTimestamp(LocalDateTime.now());
2594
                    } else {
2595
                        pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
2596
                        LOGGER.info("message" + "not sent");
2597
                        response.toString();
2598
                    }
25694 amit.gupta 2599
 
31697 amit.gupta 2600
                } catch (Exception e) {
2601
                    e.printStackTrace();
2602
                    pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
2603
                    LOGGER.info("message " + "not sent " + e.getMessage());
2604
                }
2605
            }
2606
        }
2607
    }
25721 tejbeer 2608
 
31697 amit.gupta 2609
    public void grouping() throws Exception {
2610
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yyyy hh:mm");
2611
        List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByStatus(PriceDropImeiStatus.APPROVED);
31886 tejbeer 2612
        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 2613
        Map<Integer, CustomRetailer> retailersMap = retailerService.getFofoRetailers(false);
2614
        for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
2615
            if (priceDropIMEI.getPartnerId() == 0)
2616
                continue;
2617
            HashSet<String> imeis = new HashSet<>();
2618
            PriceDrop priceDrop = priceDropRepository.selectById(priceDropIMEI.getPriceDropId());
2619
            imeis.add(priceDropIMEI.getImei());
31886 tejbeer 2620
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(priceDropIMEI.getPartnerId(), imeis, false);
31697 amit.gupta 2621
            if (inventoryItems.size() == 0) {
2622
                LOGGER.info("Need to investigate partnerId - {} imeis - {}", priceDropIMEI.getPartnerId(), imeis);
2623
                continue;
2624
            }
2625
            InventoryItem inventoryItem = inventoryItems.get(0);
2626
            CustomRetailer customRetailer = retailersMap.get(inventoryItem.getFofoId());
31886 tejbeer 2627
            if (inventoryItem.getLastScanType().equals(ScanType.DOA_OUT) || inventoryItem.getLastScanType().equals(ScanType.PURCHASE_RET)) {
31697 amit.gupta 2628
                // check if pricedrop has been rolled out
31886 tejbeer 2629
                List<UserWalletHistory> uwh = walletService.getAllByReference(inventoryItem.getFofoId(), priceDropIMEI.getPriceDropId(), WalletReferenceType.PRICE_DROP);
31697 amit.gupta 2630
                if (uwh.size() > 0) {
2631
                    Item item = itemRepository.selectById(inventoryItem.getItemId());
31886 tejbeer 2632
                    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 2633
                }
2634
            }
2635
        }
2636
    }
25721 tejbeer 2637
 
31697 amit.gupta 2638
    public void toffeeRollback() throws Exception {
2639
        toffeeService.cancelPolicyCopy("110143521986");
2640
        toffeeService.getOrderId("110143521986");
2641
    }
27212 tejbeer 2642
 
31697 amit.gupta 2643
    public void attachToffeeInvoices() throws Exception {
31886 tejbeer 2644
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(3, Optional.of(false));
31697 amit.gupta 2645
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
2646
            String invoiceNumber = insurancePolicy.getInvoiceNumber();
2647
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2648
            InvoicePdfModel pdfModel = orderService.getInvoicePdfModel(fofoOrder.getId());
2649
            java.io.ByteArrayOutputStream byteArrayOutputStream = new java.io.ByteArrayOutputStream();
2650
            PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
31886 tejbeer 2651
            String pdfInvoiceString = "data:application/pdf;base64," + Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());
2652
            boolean attached = toffeeService.attachInvoice(insurancePolicy.getPolicyNumber().split("#")[1], pdfInvoiceString);
31697 amit.gupta 2653
            if (attached) {
2654
                insurancePolicy.setPosted(true);
2655
            }
2656
        }
2657
    }
25721 tejbeer 2658
 
31697 amit.gupta 2659
    public void sendBAGPendingPolicies() throws Exception {
31886 tejbeer 2660
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(4, Optional.of(false));
31697 amit.gupta 2661
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
2662
            String invoiceNumber = insurancePolicy.getInvoiceNumber();
2663
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2664
            FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId()).get(0);
2665
            CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
2666
            Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
2667
            BAGInsuranceModel bagInsuranceModel = new BAGInsuranceModel();
2668
            // bagInsuranceModel.setModelId();
2669
            bagInsuranceModel.setAddressLine1(customerAddress.getLine1());
2670
            bagInsuranceModel.setAddressLine2(customerAddress.getLine2());
2671
            bagInsuranceModel.setCity(customerAddress.getCity());
2672
            bagInsuranceModel.setBrandWarranty("1 Year");
2673
            Item item = itemRepository.selectById(fofoOrderItem.getId());
2674
            bagInsuranceModel.setModelName(item.getItemDescription());
2675
            bagInsuranceModel.setDateOfPurchase(fofoOrder.getFormattedDate());
2676
            bagInsuranceModel.setEmail(customer.getEmailId());
2677
            bagInsuranceModel.setImei1(insurancePolicy.getSerialNumber());
2678
            bagInsuranceModel.setFirstName(customer.getFirstName());
2679
            bagInsuranceModel.setLastName(customer.getLastName());
2680
            bagInsuranceModel.setMobileNumber(customer.getMobileNumber());
2681
            bagInsuranceModel.setPlanId("");
2682
            insurancePolicy.setPosted(true);
2683
        }
2684
    }
25721 tejbeer 2685
 
31697 amit.gupta 2686
    public void schemeRollback(List<String> schemeIds) throws Exception {
2687
        List<Integer> schemeIdsInt = schemeIds.stream().map(x -> Integer.parseInt(x)).collect(Collectors.toList());
31886 tejbeer 2688
        Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIdsInt, 0, schemeIds.size()).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
31697 amit.gupta 2689
        List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectBySchemeIds(new HashSet<>(schemeIdsInt));
2690
        for (SchemeInOut sio : schemeInOuts) {
2691
            Scheme scheme = schemesMap.get(sio.getSchemeId());
2692
            if (scheme.getType().equals(SchemeType.IN)) {
25721 tejbeer 2693
 
31697 amit.gupta 2694
            } else if (scheme.getType().equals(SchemeType.OUT)) {
2695
                InventoryItem inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
2696
                List<ScanRecord> sr = scanRecordRepository.selectByInventoryItemId(sio.getInventoryItemId());
31886 tejbeer 2697
                ScanRecord scanRecord = sr.stream().filter(x -> x.getType().equals(ScanType.SALE)).max((x1, x2) -> x1.getCreateTimestamp().compareTo(x2.getCreateTimestamp())).get();
2698
                if (scanRecord.getCreateTimestamp().isAfter(scheme.getEndDateTime()) || scanRecord.getCreateTimestamp().isBefore(scheme.getStartDateTime())) {
31697 amit.gupta 2699
                    sio.setRolledBackTimestamp(LocalDateTime.now());
2700
                    FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(scanRecord.getOrderId());
31886 tejbeer 2701
                    String rollbackReason = "Scheme reversed for " + itemRepository.selectById(inventoryItem.getItemId()).getItemDescription() + "/Inv - " + fofoOrder.getInvoiceNumber();
2702
                    walletService.rollbackAmountFromWallet(scanRecord.getFofoId(), sio.getAmount(), scanRecord.getOrderId(), WalletReferenceType.SCHEME_OUT, rollbackReason, LocalDateTime.now());
2703
                    System.out.printf("Amount %f,SchemeId %d,Reason %s\n", sio.getAmount(), sio.getSchemeId(), rollbackReason);
31697 amit.gupta 2704
                }
2705
            }
2706
        }
2707
        // throw new Exception();
2708
    }
25721 tejbeer 2709
 
31697 amit.gupta 2710
    public void checkfocusedModelInPartnerStock() throws Exception {
25721 tejbeer 2711
 
31886 tejbeer 2712
        List<Integer> fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
2713
        Map<Integer, Map<Integer, List<SaholicCIS>>> warehouseItemAvailabilityMap = saholicInventoryService.getSaholicStock();
31697 amit.gupta 2714
        Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
2715
        Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = this.getPartnerIdSalesHeaders();
25721 tejbeer 2716
 
31886 tejbeer 2717
        Map<Integer, Map<Integer, List<SaholicPOItem>>> warehousePoItemAvailabilityMap = saholicInventoryService.getSaholicPOItems();
31697 amit.gupta 2718
        Map<Integer, List<FocusedModelShortageModel>> focusedModelShortageReportMap = new HashMap<>();
2719
        for (Integer fofoId : fofoIds) {
2720
            List<FocusedModelShortageModel> focusedModelShortageList = new ArrayList<>();
2721
            focusedModelShortageReportMap.put(fofoId, focusedModelShortageList);
2722
            CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
2723
            Map<Integer, Integer> processingOrderMap = null;
2724
            Map<Integer, Integer> catalogIdAndQtyMap = null;
2725
            Map<Integer, Integer> grnPendingOrdersMap = null;
25721 tejbeer 2726
 
31886 tejbeer 2727
            Map<Integer, Integer> currentInventorySnapshot = currentInventorySnapshotRepository.selectByFofoId(fofoId).stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
25721 tejbeer 2728
 
31697 amit.gupta 2729
            if (!currentInventorySnapshot.isEmpty()) {
31886 tejbeer 2730
                catalogIdAndQtyMap = itemRepository.selectByIds(currentInventorySnapshot.keySet()).stream().collect(groupingBy(x -> x.getCatalogItemId(), Collectors.summingInt(x -> currentInventorySnapshot.get(x.getId()))));
25800 tejbeer 2731
 
31697 amit.gupta 2732
            }
25800 tejbeer 2733
 
31886 tejbeer 2734
            Map<Integer, Integer> grnPendingOrders = orderRepository.selectPendingGrnOrders(fofoId).stream().collect(groupingBy(x -> x.getLineItem().getItemId(), Collectors.summingInt(x -> x.getLineItem().getQuantity())));
31697 amit.gupta 2735
            if (!grnPendingOrders.isEmpty()) {
31886 tejbeer 2736
                grnPendingOrdersMap = itemRepository.selectByIds(grnPendingOrders.keySet()).stream().collect(groupingBy(x -> x.getCatalogItemId(), Collectors.summingInt(x -> grnPendingOrders.get(x.getId()))));
25721 tejbeer 2737
 
31697 amit.gupta 2738
            }
25721 tejbeer 2739
 
31886 tejbeer 2740
            Map<Integer, Integer> processingOrder = orderRepository.selectOrders(fofoId, orderStatusList).stream().collect(groupingBy(x -> x.getLineItem().getItemId(), Collectors.summingInt(x -> x.getLineItem().getQuantity())));
31697 amit.gupta 2741
            if (!processingOrder.isEmpty()) {
31886 tejbeer 2742
                processingOrderMap = itemRepository.selectByIds(processingOrder.keySet()).stream().collect(groupingBy(x -> x.getCatalogItemId(), Collectors.summingInt(x -> processingOrder.get(x.getId()))));
25721 tejbeer 2743
 
31697 amit.gupta 2744
            }
25721 tejbeer 2745
 
31886 tejbeer 2746
            List<String> brands = mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name")).collect(Collectors.toList());
28526 tejbeer 2747
 
31886 tejbeer 2748
            List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId()).collect(Collectors.toList());
31697 amit.gupta 2749
            LOGGER.info("regionIds" + regionIds);
2750
            if (regionIds.size() == 0) {
2751
                LOGGER.info("No region found for partner {}", fofoId);
2752
                continue;
2753
            }
31886 tejbeer 2754
            Map<Integer, Optional<Integer>> focusedCatalogIdAndQtyMap = focusedModelRepository.selectAllByRegionIds(regionIds).stream().collect(groupingBy(FocusedModel::getCatalogId, mapping(FocusedModel::getObsMinimumQty, Collectors.maxBy(Integer::compareTo))));
25721 tejbeer 2755
 
31697 amit.gupta 2756
            LOGGER.info("focusedCatalogIdAndQtyMap" + focusedCatalogIdAndQtyMap);
32060 amit.gupta 2757
 
32048 tejbeer 2758
            Map<String, RetailerBlockBrands> retailerBlockBrands = retailerBlockBrandsRepository.selectAllByRetailer(fofoId).stream().collect(Collectors.toMap(x -> x.getBlockBrands(), x -> x));
31388 amit.gupta 2759
 
32048 tejbeer 2760
 
33452 amit.gupta 2761
            for (Entry<Integer, Optional<Integer>> entry : focusedCatalogIdAndQtyMap.entrySet()) {
31697 amit.gupta 2762
                int minQty = entry.getValue().get();
2763
                int inStockQty = 0;
2764
                int processingQty = 0;
2765
                int grnPendingQty = 0;
2766
                int allColorNetAvailability = 0;
2767
                int allColorPoAvailability = 0;
2768
                if (processingOrderMap != null) {
31886 tejbeer 2769
                    processingQty = (processingOrderMap.get(entry.getKey()) == null) ? 0 : processingOrderMap.get(entry.getKey());
31388 amit.gupta 2770
 
31697 amit.gupta 2771
                }
2772
                if (grnPendingOrdersMap != null) {
31886 tejbeer 2773
                    grnPendingQty = (grnPendingOrdersMap.get(entry.getKey()) == null) ? 0 : grnPendingOrdersMap.get(entry.getKey());
25721 tejbeer 2774
 
31697 amit.gupta 2775
                }
2776
                if (catalogIdAndQtyMap != null) {
31886 tejbeer 2777
                    inStockQty = (catalogIdAndQtyMap.get(entry.getKey()) == null) ? 0 : catalogIdAndQtyMap.get(entry.getKey());
27213 tejbeer 2778
 
31697 amit.gupta 2779
                }
25721 tejbeer 2780
 
31697 amit.gupta 2781
                int grnStockQty = grnPendingQty + inStockQty;
2782
                int totalQty = processingQty + grnPendingQty + inStockQty;
27208 tejbeer 2783
 
31697 amit.gupta 2784
                int shortageQty = minQty - totalQty;
2785
                List<Item> items = itemRepository.selectAllByCatalogItemId(entry.getKey());
28528 tejbeer 2786
 
31697 amit.gupta 2787
                TagListing tagListing = tagListingRepository.selectByCatalogId(entry.getKey());
27208 tejbeer 2788
 
31697 amit.gupta 2789
                FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
25721 tejbeer 2790
 
31886 tejbeer 2791
                Map<Integer, List<SaholicCIS>> itemAvailabilityMap = warehouseItemAvailabilityMap.get(fofoStore.getWarehouseId());
27233 tejbeer 2792
 
31886 tejbeer 2793
                Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = warehousePoItemAvailabilityMap.get(fofoStore.getWarehouseId());
29801 manish 2794
 
31697 amit.gupta 2795
                for (Item item : items) {
2796
                    List<SaholicCIS> currentAvailability = null;
2797
                    List<SaholicPOItem> poItemAvailability = null;
2798
                    if (itemAvailabilityMap != null) {
2799
                        currentAvailability = itemAvailabilityMap.get(item.getId());
2800
                    }
25721 tejbeer 2801
 
31697 amit.gupta 2802
                    if (poItemAvailabilityMap != null) {
2803
                        poItemAvailability = poItemAvailabilityMap.get(item.getId());
2804
                    }
2805
                    if (currentAvailability != null) {
31886 tejbeer 2806
                        allColorNetAvailability += currentAvailability.stream().collect(Collectors.summingInt(SaholicCIS::getNetavailability));
31697 amit.gupta 2807
                    }
25800 tejbeer 2808
 
31697 amit.gupta 2809
                    if (poItemAvailability != null) {
31886 tejbeer 2810
                        allColorPoAvailability += poItemAvailability.stream().collect(Collectors.summingInt(SaholicPOItem::getUnfulfilledQty));
31697 amit.gupta 2811
                    }
25800 tejbeer 2812
 
31697 amit.gupta 2813
                }
33821 ranu 2814
 
31697 amit.gupta 2815
                FocusedModelShortageModel fm = new FocusedModelShortageModel();
2816
                fm.setFofoId(fofoId);
2817
                fm.setStoreCode(fofoStore.getCode());
2818
                fm.setStoreName(customRetailer.getBusinessName());
2819
                fm.setBrandName(items.get(0).getBrand());
2820
                fm.setModelName(items.get(0).getModelName());
2821
                fm.setModelNumber(items.get(0).getModelNumber());
2822
                fm.setGrnStockQty(grnStockQty);
2823
                fm.setPendingIndentQty(processingQty);
2824
                fm.setShortageQty(shortageQty);
2825
                fm.setPoAvailability(allColorPoAvailability);
2826
                fm.setDp(tagListing.getSellingPrice());
2827
                fm.setWarehouseName(warehouseMap.get(customRetailer.getWarehouseId()));
33820 ranu 2828
                if(partnerIdSalesHeadersMap.get(fofoId) != null){
2829
                    fm.setStateManager(partnerIdSalesHeadersMap.get(fofoId).getRegionalManager());
2830
                    fm.setTerritoryManager(partnerIdSalesHeadersMap.get(fofoId).getTerritoryManager());
2831
                }else {
33821 ranu 2832
                    LOGGER.info("else fofoId - {}",fofoId);
33820 ranu 2833
                    fm.setStateManager("");
2834
                    fm.setTerritoryManager("");
2835
                }
2836
 
31697 amit.gupta 2837
                fm.setItemName(items.get(0).getBrand() + items.get(0).getModelNumber() + items.get(0).getModelName());
2838
                fm.setAvailability(allColorNetAvailability);
25721 tejbeer 2839
 
31697 amit.gupta 2840
                focusedModelShortageList.add(fm);
2841
            }
25721 tejbeer 2842
 
31697 amit.gupta 2843
        }
33821 ranu 2844
        LOGGER.info("focusedModelShortageReportMap {}",focusedModelShortageReportMap);
31697 amit.gupta 2845
        if (!focusedModelShortageReportMap.isEmpty()) {
2846
            String fileName = "Stock Alert-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
2847
            Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
2848
            Map<String, List<List<?>>> emailRowsMap = new HashMap<>();
25721 tejbeer 2849
 
31697 amit.gupta 2850
            focusedModelShortageReportMap.entrySet().forEach(x -> {
2851
                storeGuyMap.entrySet().forEach(y -> {
28526 tejbeer 2852
 
31697 amit.gupta 2853
                    if (y.getValue().contains(x.getKey())) {
2854
                        if (!emailRowsMap.containsKey(y.getKey())) {
2855
                            emailRowsMap.put(y.getKey(), new ArrayList<>());
2856
                        }
31886 tejbeer 2857
                        List<List<? extends Serializable>> fms = x.getValue().stream().map(r -> Arrays.asList(r.getStoreCode(), r.getStoreName(), r.getBrandName(), r.getModelName(), r.getModelNumber(), r.getDp(), r.getWarehouseName(), r.getStateManager(), r.getTerritoryManager(), r.getPendingIndentQty(), r.getGrnStockQty(), r.getShortageQty(), r.getAvailability())).collect(Collectors.toList());
31697 amit.gupta 2858
                        emailRowsMap.get(y.getKey()).addAll(fms);
29995 tejbeer 2859
 
31697 amit.gupta 2860
                    }
29995 tejbeer 2861
 
31697 amit.gupta 2862
                });
25721 tejbeer 2863
 
31697 amit.gupta 2864
            });
25721 tejbeer 2865
 
31886 tejbeer 2866
            List<String> headers = Arrays.asList("Store Code", "Store Name", "Brand", "Model Name", "Model Number", "DP", "Warehouse Name", "State Manager", "Territory Manager", "Pending Indent", "InStock", "Shortage Qty", "Availability");
31697 amit.gupta 2867
            emailRowsMap.entrySet().forEach(entry -> {
25721 tejbeer 2868
 
31697 amit.gupta 2869
                ByteArrayOutputStream baos = null;
2870
                try {
2871
                    baos = FileUtil.getCSVByteStream(headers, entry.getValue());
2872
                } catch (Exception e2) {
2873
                    e2.printStackTrace();
2874
                }
2875
                String[] sendToArray = new String[]{
25721 tejbeer 2876
 
33821 ranu 2877
                        entry.getKey(), "alok.divedi@smartdukaan.com","ranu.rajput@smartdukaan.com"
25721 tejbeer 2878
 
31697 amit.gupta 2879
                };
25721 tejbeer 2880
 
31886 tejbeer 2881
 
31697 amit.gupta 2882
                try {
31886 tejbeer 2883
                    Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Stock Alert", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
31697 amit.gupta 2884
                } catch (Exception e1) { // TODO Auto-generated catch block
2885
                    e1.printStackTrace();
2886
                }
25721 tejbeer 2887
 
31697 amit.gupta 2888
            });
2889
        }
2890
    }
25721 tejbeer 2891
 
31697 amit.gupta 2892
    private String getNotificationMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2893
        StringBuilder sb = new StringBuilder();
2894
        sb.append("Focused Model Shortage in Your Stock : \n");
2895
        for (FocusedModelShortageModel entry : focusedModelShortageModel) {
25721 tejbeer 2896
 
31697 amit.gupta 2897
            sb.append(entry.getItemName() + "-" + entry.getShortageQty());
2898
            sb.append(String.format("%n", ""));
2899
        }
2900
        return sb.toString();
2901
    }
25721 tejbeer 2902
 
31697 amit.gupta 2903
    private void sendMailWithAttachments(String subject, String messageText, String email) throws Exception {
2904
        MimeMessage message = mailSender.createMimeMessage();
2905
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
25721 tejbeer 2906
 
31697 amit.gupta 2907
        helper.setSubject(subject);
2908
        helper.setText(messageText, true);
2909
        helper.setTo(email);
2910
        InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
2911
        helper.setFrom(senderAddress);
2912
        mailSender.send(message);
25721 tejbeer 2913
 
31697 amit.gupta 2914
    }
25721 tejbeer 2915
 
31697 amit.gupta 2916
    private String getMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2917
        StringBuilder sb = new StringBuilder();
31886 tejbeer 2918
        sb.append("<html><body><p>Alert</p><p>Focused Model Shortage in Your Stock:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
2919
        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 2920
        for (FocusedModelShortageModel entry : focusedModelShortageModel) {
25721 tejbeer 2921
 
31697 amit.gupta 2922
            sb.append("<tr>");
2923
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getItemName() + "</td>");
25936 amit.gupta 2924
 
31697 amit.gupta 2925
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getShortageQty() + "</td>");
26790 tejbeer 2926
 
31697 amit.gupta 2927
            sb.append("</tr>");
25927 amit.gupta 2928
 
31697 amit.gupta 2929
        }
26790 tejbeer 2930
 
31697 amit.gupta 2931
        sb.append("</tbody></table></body></html>");
26945 amit.gupta 2932
 
31697 amit.gupta 2933
        return sb.toString();
2934
    }
26945 amit.gupta 2935
 
31697 amit.gupta 2936
    public void notifyLead() throws Exception {
31886 tejbeer 2937
        List<Lead> leadsToNotify = leadRepository.selectLeadsScheduledBetweenDate(null, LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
2938
        Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
31697 amit.gupta 2939
        LOGGER.info("authUserEmailMap {}", authUserEmailMap);
31886 tejbeer 2940
        Map<String, Integer> dtrEmailMap = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
25982 amit.gupta 2941
 
31697 amit.gupta 2942
        LOGGER.info("dtrEmailMap {}", dtrEmailMap);
26283 tejbeer 2943
 
31697 amit.gupta 2944
        Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26283 tejbeer 2945
 
33452 amit.gupta 2946
        for (Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
31697 amit.gupta 2947
            int authId = authUserEmail.getKey();
2948
            String email = authUserEmail.getValue();
2949
            authUserKeyMap.put(authId, dtrEmailMap.get(email));
2950
        }
2951
        LOGGER.info("authUserKeyMap", authUserKeyMap);
2952
        LOGGER.info("leadsToNotify {}", leadsToNotify);
26283 tejbeer 2953
 
31697 amit.gupta 2954
        String templateMessage = "Lead followup for %s %s, %s, %s is due by %s";
2955
        for (Lead lead : leadsToNotify) {
2956
            if (authUserKeyMap.get(lead.getAssignTo()) == null) {
2957
                LOGGER.info("Assignee no longer part of system {}", lead.getAssignTo());
2958
                continue;
2959
            }
2960
            String title = "Leads followup Reminder";
31886 tejbeer 2961
            String notificationMessage = String.format(templateMessage, lead.getFirstName(), lead.getLastName(), lead.getAddress(), lead.getLeadMobile(), leadTimeFormatter.format(lead.getScheduledTimestamp()));
31697 amit.gupta 2962
            String url = "https://app.smartdukaan.com/pages/home/leadUpdate?leadId=" + lead.getId();
2963
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
2964
            sendNotificationModel.setCampaignName("Lead Reminder");
2965
            sendNotificationModel.setTitle(title);
2966
            sendNotificationModel.setMessage(notificationMessage);
2967
            sendNotificationModel.setType("url");
2968
            sendNotificationModel.setUrl(url);
2969
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2970
            sendNotificationModel.setMessageType(MessageType.reminder);
2971
            sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(lead.getAssignTo())));
2972
            System.out.println(sendNotificationModel);
2973
            notificationService.sendNotification(sendNotificationModel);
2974
        }
2975
    }
26790 tejbeer 2976
 
32350 amit.gupta 2977
    @Autowired
2978
    AuthService authService;
2979
 
2980
    public void sendUnscheduledFollowUpMail() throws Exception {
2981
        List<Lead> missedScheduleLeads = leadRepository.selectLeadsScheduledBetweenDate(null, LocalDate.now().atStartOfDay().minusDays(30), LocalDateTime.now().toLocalDate().atStartOfDay());
2982
        List<Lead> leadsScheduledForToday = leadRepository.selectLeadsScheduledBetweenDate(null, LocalDate.now().atStartOfDay(), LocalDate.now().atTime(LocalTime.MAX));
2983
        List<Integer> authIds = missedScheduleLeads.stream().map(x -> x.getAssignTo()).distinct().collect(Collectors.toList());
2984
        LOGGER.info(authIds.size());
2985
        Map<Integer, AuthUser> authUserMap = authRepository.selectAllAuthUserByIds(authIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
2986
        LOGGER.info(authUserMap.size());
2987
        //if(true) return;
2988
 
2989
        missedScheduleLeads = missedScheduleLeads.stream().sorted(Comparator.comparing(Lead::getState, String.CASE_INSENSITIVE_ORDER).thenComparing(Lead::getAssignTo).thenComparing(Lead::getScheduledTimestamp)).collect(Collectors.toList());
2990
        //leadsScheduledForToday
2991
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
2992
        LOGGER.info("Auth Users Size - {}", authUsers.size());
2993
        for (AuthUser authUser : authUsers) {
2994
            LOGGER.info("Auth Name - {}", authUser.getFullName());
2995
            List<Integer> reporteeAuthIds = authService.getAllReportees(authUser.getId());
2996
            reporteeAuthIds.add(authUser.getId());
2997
            StringBuilder sb = new StringBuilder();
2998
            sb.append("<html><body>");
2999
            List<Lead> authMissedScheduledLeads = missedScheduleLeads.stream().filter(x -> reporteeAuthIds.contains(x.getAssignTo())).collect(Collectors.toList());
3000
            LOGGER.info("authMissedScheduledLeads {}", authMissedScheduledLeads.size());
3001
            if (authMissedScheduledLeads.size() > 0) {
3002
                addMissedScheduledLeadsTable(sb, authMissedScheduledLeads, authUserMap);
3003
                sb.append("</body></html>");
3004
 
3005
                String subject = "Lead Updates Summary";
32421 amit.gupta 3006
                String[] email = Arrays.asList(authUser.getEmailId()).toArray(new String[1]);
3007
                //String[] email = Arrays.asList("amit.gupta@smartdukaan.com").toArray(new String[1]);
32350 amit.gupta 3008
                this.sendMailOfHtmlFormat(googleMailSender, email, sb.toString(), null, subject);
32421 amit.gupta 3009
                //break;
32350 amit.gupta 3010
            }
3011
        }
3012
 
3013
    }
3014
 
32482 amit.gupta 3015
    private void addMissedScheduledLeadsTable(StringBuilder
3016
                                                      sb, List<Lead> missedScheduleLeads, Map<Integer, AuthUser> authUserMap) {
32350 amit.gupta 3017
        sb.append("<h3>Leads That Missed the schedule</h3>");
32439 tejbeer 3018
        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 3019
        for (Lead lead : missedScheduleLeads) {
32439 tejbeer 3020
            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(
3021
                    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 3022
        }
3023
        sb.append("</table>");
3024
    }
3025
 
31697 amit.gupta 3026
    public void notifyVisits() throws Exception {
31886 tejbeer 3027
        List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository.selectVisitsScheduledBetweenDate(LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
3028
        Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
3029
        Map<String, Integer> dtrEmailMap = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
31697 amit.gupta 3030
        Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26790 tejbeer 3031
 
33452 amit.gupta 3032
        for (Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
31697 amit.gupta 3033
            int authId = authUserEmail.getKey();
3034
            String email = authUserEmail.getValue();
3035
            authUserKeyMap.put(authId, dtrEmailMap.get(email));
3036
        }
3037
        String visitTemplate = "Planned visit to franchisee %s is due by %s";
3038
        String followupTemplate = "Lead followup for franchisee %s is due by %s";
3039
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("MMM 7, EEEE h:m a");
3040
        for (FranchiseeVisit visit : franchiseeVisits) {
3041
            if (authUserKeyMap.containsKey(visit.getAuthId())) {
3042
                continue;
3043
            }
3044
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
3045
            String message = null;
3046
            if (visit.getFranchiseActivityId() == 0) {
31886 tejbeer 3047
                message = String.format(visitTemplate, visit.getPartnerName(), timeFormatter.format(visit.getScheduleTimestamp()));
31697 amit.gupta 3048
                sendNotificationModel.setCampaignName("Franchisee visit Reminder");
3049
            } else {
31886 tejbeer 3050
                message = String.format(followupTemplate, visit.getPartnerName(), timeFormatter.format(visit.getScheduleTimestamp()));
31697 amit.gupta 3051
                sendNotificationModel.setCampaignName("Franchisee followup Reminder");
3052
            }
3053
            sendNotificationModel.setMessage(message);
3054
            sendNotificationModel.setType("url");
3055
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
3056
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
3057
            sendNotificationModel.setMessageType(MessageType.reminder);
3058
            sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(visit.getAuthId())));
3059
            // notificationService.sendNotification(sendNotificationModel);
3060
        }
3061
    }
26792 tejbeer 3062
 
31697 amit.gupta 3063
    public void ticketClosed() throws Exception {
26790 tejbeer 3064
 
31697 amit.gupta 3065
        List<Ticket> tickets = ticketRepository.selectAllNotClosedTicketsWithStatus(ActivityType.RESOLVED);
3066
        for (Ticket ticket : tickets) {
3067
            if (ticket.getUpdateTimestamp().toLocalDate().isBefore(LocalDate.now().minusDays(7))) {
3068
                ticket.setCloseTimestamp(LocalDateTime.now());
3069
                ticket.setLastActivity(ActivityType.RESOLVED_ACCEPTED);
3070
                ticket.setUpdateTimestamp(LocalDateTime.now());
3071
                ticketRepository.persist(ticket);
3072
            }
3073
        }
26790 tejbeer 3074
 
31697 amit.gupta 3075
    }
26790 tejbeer 3076
 
31697 amit.gupta 3077
    public void checkValidateReferral() throws Exception {
26790 tejbeer 3078
 
31697 amit.gupta 3079
        List<Refferal> referrals = refferalRepository.selectByStatus(RefferalStatus.pending);
3080
        LOGGER.info("referrals" + referrals);
3081
        if (!referrals.isEmpty()) {
3082
            String subject = "Referral Request";
3083
            String messageText = this.getMessageForReferral(referrals);
26790 tejbeer 3084
 
31697 amit.gupta 3085
            MimeMessage message = mailSender.createMimeMessage();
3086
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
3087
            String[] email = {"kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com"};
3088
            helper.setSubject(subject);
3089
            helper.setText(messageText, true);
3090
            helper.setTo(email);
3091
            InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
3092
            helper.setFrom(senderAddress);
3093
            mailSender.send(message);
26790 tejbeer 3094
 
31697 amit.gupta 3095
        }
3096
    }
26790 tejbeer 3097
 
31697 amit.gupta 3098
    private String getMessageForReferral(List<Refferal> referrals) {
3099
        StringBuilder sb = new StringBuilder();
31886 tejbeer 3100
        sb.append("<html><body><p>Alert</p><p>Pending Referrals:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
3101
        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 3102
        for (Refferal entry : referrals) {
26790 tejbeer 3103
 
31697 amit.gupta 3104
            sb.append("<tr>");
3105
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeName() + "</td>");
30421 tejbeer 3106
 
31697 amit.gupta 3107
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeEmail() + "</td>");
3108
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getFirstName() + "</td>");
3109
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMobile() + "</td>");
3110
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCity() + "</td>");
3111
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getState() + "</td>");
30421 tejbeer 3112
 
31697 amit.gupta 3113
            sb.append("</tr>");
30421 tejbeer 3114
 
31697 amit.gupta 3115
        }
30421 tejbeer 3116
 
31697 amit.gupta 3117
        sb.append("</tbody></table></body></html>");
30421 tejbeer 3118
 
31697 amit.gupta 3119
        return sb.toString();
3120
    }
30421 tejbeer 3121
 
32832 amit.gupta 3122
    private String getMessageForRBMEscalatedPartners(List<PartnerCollectionRemark> pcrs) throws
32482 amit.gupta 3123
            ProfitMandiBusinessException {
31697 amit.gupta 3124
        StringBuilder sb = new StringBuilder();
32832 amit.gupta 3125
        sb.append("<html><body><p>Alert</p><p>Escalated by RBM-L1:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
3126
        sb.append("<tbody>" +
3127
                "<tr>" +
3128
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>" +
3129
                "<th style='border:1px solid black;padding: 5px'>Escalated Since</th>" +
3130
                "<th style='border:1px solid black;padding: 5px'>Message</th>" +
3131
                "</tr>");
30421 tejbeer 3132
 
31697 amit.gupta 3133
        for (PartnerCollectionRemark entry : pcrs) {
30421 tejbeer 3134
 
31697 amit.gupta 3135
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
30421 tejbeer 3136
 
31697 amit.gupta 3137
            sb.append("<tr>");
31886 tejbeer 3138
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
3139
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
32832 amit.gupta 3140
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMessage() + "</td>");
28205 tejbeer 3141
 
31697 amit.gupta 3142
            sb.append("</tr>");
28205 tejbeer 3143
 
31697 amit.gupta 3144
        }
28205 tejbeer 3145
 
31697 amit.gupta 3146
        sb.append("</tbody></table></body></html>");
28205 tejbeer 3147
 
31697 amit.gupta 3148
        return sb.toString();
3149
    }
28208 tejbeer 3150
 
32795 amit.gupta 3151
    private String getMessageForSalesEscalatedPartners(List<PartnerCollectionRemark> pcrs) throws
3152
            ProfitMandiBusinessException {
3153
        StringBuilder sb = new StringBuilder();
3154
        sb.append("<html><body><p>Alert</p><p>Escalated to Sales Team:-</p>" + "<br/>" +
3155
                "<table style='border:1px solid black ;padding: 5px';>");
3156
        sb.append("<tbody>" +
3157
                "<tr>" +
3158
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>" +
3159
                "<th style='border:1px solid black;padding: 5px'>Escalated Since</th>" +
3160
                "<th style='border:1px solid black;padding: 5px'>Message</th>" +
3161
                "</tr>");
3162
        for (PartnerCollectionRemark entry : pcrs) {
3163
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
3164
            sb.append("<tr>");
3165
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
3166
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
3167
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMessage() + "</td>");
3168
            sb.append("</tr>");
3169
        }
3170
 
3171
        sb.append("</tbody></table></body></html>");
3172
 
3173
        return sb.toString();
3174
    }
3175
 
33078 ranu 3176
    private String getMessageForUnauthorizedBuying(List<NonSdBuying> nsb) throws
3177
            ProfitMandiBusinessException {
3178
        StringBuilder sb = new StringBuilder();
3179
        sb.append("<html><body><p>Alert</p><p>Unauthorized Buying-</p>" + "<br/>" +
3180
                "<table style='border:1px solid black ;padding: 5px';>");
3181
        sb.append("<tbody>" +
3182
                "<tr>" +
3183
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>" +
3184
                "<th style='border:1px solid black;padding: 5px'>Brand Name</th>" +
3185
                "<th style='border:1px solid black;padding: 5px'>Brand Value</th>" +
3186
                "<th style='border:1px solid black;padding: 5px'>Created At</th>" +
3187
                "<th style='border:1px solid black;padding: 5px'>Reason</th>" +
3188
                "</tr>");
3189
        for (NonSdBuying entry : nsb) {
3190
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
3191
            List<Integer> brandIds = Collections.singletonList(entry.getBrandId());
3192
            BrandCatalog brandsDisplay = brandsRepository.selectByIds(brandIds).get(0);
3193
            sb.append("<tr>");
3194
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
3195
            sb.append("<td style='border:1px solid black;padding: 5px'>" + brandsDisplay.getName() + "</td>");
3196
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getBrandValue() + "</td>");
3197
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
3198
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getReason() + "</td>");
3199
            sb.append("</tr>");
3200
        }
3201
 
3202
        sb.append("</tbody></table></body></html>");
3203
 
3204
        return sb.toString();
3205
    }
3206
 
31697 amit.gupta 3207
    public void reverseWallet() throws Exception {
3208
        LocalDate localDate = LocalDate.of(2020, 10, 28);
31886 tejbeer 3209
        List<UserWalletHistory> uwhList = userWalletHistoryRepository.selectAllByDateType(localDate.atStartOfDay(), localDate.plusDays(1).atStartOfDay(), Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
31697 amit.gupta 3210
        for (UserWalletHistory uwh : uwhList) {
3211
            if (uwh.getBusinessTimestamp().getMonth().equals(Month.SEPTEMBER)) {
3212
                UserWallet uw = userWalletRepository.selectById(uwh.getWalletId());
3213
                // LOGGER.info("UWH - {}", uwh);
3214
                // amount += uwh.getAmount();
3215
                // System.out.println("Amount is - " + amount);
3216
                // walletService.rollbackAmountFromWallet(uw.getUserId(), uwh.getAmount(),
3217
                // uwh.getReference(), uwh.getReferenceType(), "Margin reversal for error prone
3218
                // run", uwh.getBusinessTimestamp());
3219
                int orderId = uwh.getReference();
3220
                FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
3221
                int inventoryItemId = 0;
3222
                // fofoOrderRepository.delete(fofoOrder);
3223
                List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
3224
                /*
3225
                 * List<PaymentOptionTransaction> paymentOptionTransactions =
3226
                 * paymentOptionTransactionRepository.selectByReferenceIdAndType(fofoOrder.getId
3227
                 * (), PaymentOptionReferenceType.ORDER); for(PaymentOptionTransaction
3228
                 * paymentOptionTransaction : paymentOptionTransactions) {
3229
                 * //paymentOptionTransactionRepository.delete(paymentOptionTransaction); }
3230
                 */
3231
                for (FofoOrderItem foi : fofoOrderItems) {
3232
                    // fofoOrderItemRepository.delete(foi);
3233
                    List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(foi.getId());
3234
                    for (FofoLineItem fli : flis) {
3235
                        // fofoLineItemRepository.delete(fli);
3236
                        inventoryItemId = fli.getInventoryItemId();
3237
                    }
3238
                }
3239
                List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(
33452 amit.gupta 3240
                        Stream.of(inventoryItemId).collect(Collectors.toSet()));
31697 amit.gupta 3241
                for (SchemeInOut sio : schemeInOuts) {
3242
                    if (sio.getCreateTimestamp().toLocalDate().equals(localDate)) {
3243
                        LOGGER.info("SIO - {}", sio);
3244
                        sio.setRolledBackTimestamp(LocalDateTime.now());
3245
                    }
3246
                }
28208 tejbeer 3247
 
31697 amit.gupta 3248
            }
3249
        }
28208 tejbeer 3250
 
31697 amit.gupta 3251
    }
28208 tejbeer 3252
 
31697 amit.gupta 3253
    public void partnerProblemAlert() throws Exception {
3254
        LocalDateTime curDate = LocalDate.now().atStartOfDay();
3255
        Map<Integer, Double> lmtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
3256
                curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1), 0, false);
31886 tejbeer 3257
        Map<Integer, Double> mtdSales = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX), 0, false);
3258
        Map<Integer, PartnerDailyInvestment> pdi = partnerDailyInvestmentRepository.selectAll(LocalDate.now()).stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
28205 tejbeer 3259
 
31697 amit.gupta 3260
        for (Entry<Integer, Double> ls : lmtdSale.entrySet()) {
28208 tejbeer 3261
 
31697 amit.gupta 3262
            double lmtdTwentyPercentSale = ls.getValue() * 0.2;
28208 tejbeer 3263
 
31697 amit.gupta 3264
            LOGGER.info("lmtdTwentyPercentSale" + lmtdTwentyPercentSale);
28208 tejbeer 3265
 
31697 amit.gupta 3266
            double mtdSale = mtdSales.get(ls.getKey()) == null ? 0 : mtdSales.get(ls.getKey());
28205 tejbeer 3267
 
31697 amit.gupta 3268
            LOGGER.info("mtdSale" + mtdSale);
28205 tejbeer 3269
 
31886 tejbeer 3270
            double totalSixtyPercentInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getTotalInvestment() * 0.6;
28205 tejbeer 3271
 
31697 amit.gupta 3272
            LOGGER.info("totalSixtyPercentInvestment" + totalSixtyPercentInvestment);
28205 tejbeer 3273
 
31697 amit.gupta 3274
            double stockInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getInStockAmount();
28205 tejbeer 3275
 
31697 amit.gupta 3276
            LOGGER.info("stockInvestment" + stockInvestment);
28205 tejbeer 3277
 
31697 amit.gupta 3278
            boolean Investmentvalue = partnerInvestmentService.isInvestmentBelow(ls.getKey(), 25);
28205 tejbeer 3279
 
31697 amit.gupta 3280
            PartnerProblem partnerProblem = partnerProblemRepository.selectByFofoId(ls.getKey());
28205 tejbeer 3281
 
31697 amit.gupta 3282
            if (partnerProblem == null) {
3283
                partnerProblem = new PartnerProblem();
3284
                partnerProblem.setFofoId(ls.getKey());
3285
                if (mtdSale < lmtdTwentyPercentSale) {
3286
                    partnerProblem.setMtd(1);
3287
                }
3288
                if (Investmentvalue) {
3289
                    partnerProblem.setInvestment(1);
3290
                }
28205 tejbeer 3291
 
31697 amit.gupta 3292
                if (stockInvestment < totalSixtyPercentInvestment) {
3293
                    partnerProblem.setInvestment(1);
3294
                }
28205 tejbeer 3295
 
31697 amit.gupta 3296
                partnerProblemRepository.persist(partnerProblem);
3297
            } else {
3298
                if (mtdSale < lmtdTwentyPercentSale) {
3299
                    partnerProblem.setMtd(partnerProblem.getMtd() + 1);
28213 tejbeer 3300
 
31697 amit.gupta 3301
                } else {
3302
                    partnerProblem.setMtd(0);
28227 tejbeer 3303
 
31697 amit.gupta 3304
                }
3305
                if (Investmentvalue) {
3306
                    partnerProblem.setInvestment(partnerProblem.getInvestment() + 1);
3307
                } else {
3308
                    partnerProblem.setInvestment(0);
28227 tejbeer 3309
 
31697 amit.gupta 3310
                }
3311
                if (stockInvestment < totalSixtyPercentInvestment) {
3312
                    partnerProblem.setStockInvestment(partnerProblem.getStockInvestment() + 1);
3313
                } else {
3314
                    partnerProblem.setStockInvestment(0);
3315
                }
28213 tejbeer 3316
 
31697 amit.gupta 3317
            }
28213 tejbeer 3318
 
31697 amit.gupta 3319
        }
28213 tejbeer 3320
 
31886 tejbeer 3321
        List<PartnerProblem> partnerProblems = partnerProblemRepository.selectAll().stream().filter(x -> x.getMtd() + x.getInvestment() + x.getStockInvestment() > 0).collect(Collectors.toList());
28205 tejbeer 3322
 
31697 amit.gupta 3323
        partnerProblems = partnerProblems.stream().sorted((x1, x2) -> {
31886 tejbeer 3324
            return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment() + x2.getStockInvestment() ? 1 : -1;
31697 amit.gupta 3325
        }).collect(Collectors.toList());
28205 tejbeer 3326
 
31697 amit.gupta 3327
        Map<Integer, PartnerProblem> partnerProblemMap = partnerProblems.stream().sorted((x1, x2) -> {
31886 tejbeer 3328
            return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment() + x2.getStockInvestment() ? 1 : -1;
31697 amit.gupta 3329
        }).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
28205 tejbeer 3330
 
31697 amit.gupta 3331
        Map<Integer, CustomRetailer> customRetailers = retailerService.getAllFofoRetailers();
28205 tejbeer 3332
 
31697 amit.gupta 3333
        List<Integer> assignTo = Arrays.asList(15, 9, 54, 53);
28205 tejbeer 3334
 
31886 tejbeer 3335
        Map<Integer, AuthUser> assignAuthUserMap = authRepository.selectAllAuthUserByIds(assignTo).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
28222 tejbeer 3336
 
31886 tejbeer 3337
        List<String> sendTo = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com", "sm@smartdukaan.com");
31697 amit.gupta 3338
        LOGGER.info("partnerProblem" + partnerProblems);
3339
        StringBuilder sb = new StringBuilder();
3340
        sb.append("<htl><body>");
3341
        sb.append(
3342
                "<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 3343
        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 3344
 
31697 amit.gupta 3345
                + "	    				</tr>");
28218 tejbeer 3346
 
31697 amit.gupta 3347
        for (PartnerProblem pp : partnerProblems) {
3348
            int value = pp.getFofoId() % 4;
28218 tejbeer 3349
 
31697 amit.gupta 3350
            Map<EscalationType, AuthUser> authUserMap = csService.getAuthUserAndEsclationByPartnerId(pp.getFofoId());
3351
            LOGGER.info("authUserMap" + authUserMap);
3352
            sb.append("<tr>");
31886 tejbeer 3353
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
3354
            sb.append("<td style='border:1px solid black;padding: 5px'>" + assignAuthUserMap.get(assignTo.get(value)).getName() + "</td>");
31697 amit.gupta 3355
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
3356
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
3357
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
31886 tejbeer 3358
            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 3359
 
31697 amit.gupta 3360
            sb.append("</tr>");
3361
        }
3362
        sb.append("</tbody></table><br><br>");
3363
        String subject = "Partner Problem Alert!";
3364
        String[] email = sendTo.toArray(new String[sendTo.size()]);
28227 tejbeer 3365
 
32350 amit.gupta 3366
        this.sendMailOfHtmlFormat(googleMailSender, email, sb.toString(), null, subject);
28227 tejbeer 3367
 
31697 amit.gupta 3368
        Map<Integer, List<Integer>> authUserPartnerMapping = csService.getAuthUserIdPartnerIdMapping();
28224 tejbeer 3369
 
31697 amit.gupta 3370
        for (Entry<Integer, List<Integer>> authUserPartner : authUserPartnerMapping.entrySet()) {
3371
            AuthUser authUser = authRepository.selectById(authUserPartner.getKey());
3372
            for (Integer patnerId : authUserPartner.getValue()) {
3373
                if (partnerProblemMap.get(patnerId) != null) {
28230 tejbeer 3374
 
31697 amit.gupta 3375
                    StringBuilder sbbuilder = new StringBuilder();
3376
                    sbbuilder.append("<hml><body>");
3377
                    sb.append(
3378
                            "<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 3379
                    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 3380
 
31697 amit.gupta 3381
                            + "	    				</tr>");
28205 tejbeer 3382
 
31697 amit.gupta 3383
                    for (Integer partnerId : authUserPartner.getValue()) {
3384
                        if (partnerProblemMap.get(partnerId) != null) {
3385
                            PartnerProblem pp = partnerProblemMap.get(partnerId);
3386
                            sbbuilder.append("<tr>");
31886 tejbeer 3387
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
3388
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
31697 amit.gupta 3389
                            sbbuilder.append(
3390
                                    "<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
31886 tejbeer 3391
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
28790 amit.gupta 3392
 
31697 amit.gupta 3393
                            sbbuilder.append("</tr>");
3394
                        }
28790 amit.gupta 3395
 
31697 amit.gupta 3396
                    }
3397
                    sbbuilder.append("</tbody></table><br><br>");
29488 manish 3398
 
32350 amit.gupta 3399
                    this.sendMailOfHtmlFormat(googleMailSender, new String[]{authUser.getEmailId()}, sbbuilder.toString(), null, subject);
31697 amit.gupta 3400
                }
29488 manish 3401
 
31697 amit.gupta 3402
            }
3403
        }
3404
    }
28775 amit.gupta 3405
 
31697 amit.gupta 3406
    @Autowired
3407
    WarehouseRepository warehouseRepository;
29488 manish 3408
 
33256 amit.gupta 3409
    public void getVendorWarehouses(int warehouseId) throws ProfitMandiBusinessException {
31697 amit.gupta 3410
        LOGGER.info("Warehouses - {}", warehouseRepository.getVendorWarehouses().get(warehouseId));
29488 manish 3411
 
31697 amit.gupta 3412
    }
29488 manish 3413
 
31697 amit.gupta 3414
    public void checkImeiActivation() {
29801 manish 3415
 
31697 amit.gupta 3416
        try {
3417
            vivoImeiActivationService.checkImeiActivation();
3418
        } catch (ProfitMandiBusinessException e) {
3419
            // TODO Auto-generated catch block
3420
            e.printStackTrace();
3421
        } catch (IOException e) {
3422
            // TODO Auto-generated catch block
3423
            e.printStackTrace();
3424
        } catch (Exception e) {
3425
            // TODO Auto-generated catch block
3426
            e.printStackTrace();
3427
        }
29807 manish 3428
 
31697 amit.gupta 3429
    }
29801 manish 3430
 
31697 amit.gupta 3431
    public void checkItelImeiActivation(LocalDate date, Integer day) {
3432
        LOGGER.info("Hello - {}", "hhh");
29488 manish 3433
 
31697 amit.gupta 3434
        try {
3435
            itelImeiActivationService.checkItelImeiActivation(date, day);
3436
        } catch (ProfitMandiBusinessException e) {
3437
            // TODO Auto-generated catch block
3438
            e.printStackTrace();
3439
        } catch (IOException e) {
3440
            // TODO Auto-generated catch block
3441
            e.printStackTrace();
3442
        } catch (Exception e) {
3443
            // TODO Auto-generated catch block
3444
            e.printStackTrace();
3445
        }
29488 manish 3446
 
31697 amit.gupta 3447
    }
29488 manish 3448
 
32482 amit.gupta 3449
    public void selectFinServiceFollowUpDateByCurrDate(LocalDate currentDate) throws
3450
            MessagingException, ProfitMandiBusinessException, IOException {
31697 amit.gupta 3451
        LOGGER.info("selectfinServiceFollow - {}", "selectfinServiceFollowUpDateByCurrDate");
29308 tejbeer 3452
 
31697 amit.gupta 3453
        serviceConfigService.selectFinServicePartnerfollowUpDateByCurrentDate(currentDate);
29252 amit.gupta 3454
 
31697 amit.gupta 3455
    }
29451 manish 3456
 
31697 amit.gupta 3457
    public void checkTecnoImeiActivation(LocalDate date, Integer day) {
3458
        LOGGER.info("Hello - {}", "hhh");
29308 tejbeer 3459
 
31697 amit.gupta 3460
        try {
3461
            tecnoImeiActivation.checkTecnoImeiActivation(date, day);
3462
        } catch (ProfitMandiBusinessException e) {
3463
            // TODO Auto-generated catch block
3464
            e.printStackTrace();
3465
        } catch (IOException e) {
3466
            // TODO Auto-generated catch block
3467
            e.printStackTrace();
3468
        } catch (Exception e) {
3469
            // TODO Auto-generated catch block
3470
            e.printStackTrace();
3471
        }
29308 tejbeer 3472
 
31697 amit.gupta 3473
    }
29441 tejbeer 3474
 
31697 amit.gupta 3475
    public void checkCancellationMargin() throws Exception {
3476
        LocalDateTime startDate = LocalDate.of(2021, 4, 1).atStartOfDay();
3477
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectCancelledBetweenSaleDate(startDate, LocalDateTime.now());
3478
        LOGGER.info("Total Orders =  {}", fofoOrders.size());
3479
        for (FofoOrder fofoOrder : fofoOrders) {
31886 tejbeer 3480
            List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.SCHEME_OUT);
3481
            history.addAll(userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.ACTIVATION_SCHEME));
31697 amit.gupta 3482
            int walletSum = history.stream().mapToInt(x -> x.getAmount()).sum();
3483
            if (Math.abs(walletSum) > 1) {
3484
                // LOGGER.info("Cancelled invoice {}, Order Id = {}, = havent rolledback, Value
3485
                // = {}", fofoOrder.getInvoiceNumber(), fofoOrder.getId(), walletSum);
3486
                List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
3487
                List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(fofoOrderItems.get(0).getId());
3488
                FofoLineItem fli = flis.get(0);
3489
                if (StringUtils.isEmpty(fli.getSerialNumber()))
3490
                    continue;
31886 tejbeer 3491
                List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(fli.getInventoryItemId())));
31697 amit.gupta 3492
                InventoryItem inventoryItem = inventoryItemRepository.selectById(fli.getInventoryItemId());
31886 tejbeer 3493
                double schemeSum = schemeInOuts.stream().filter(x -> x.getRolledBackTimestamp() == null).mapToDouble(x -> x.getAmount()).sum();
31697 amit.gupta 3494
                /*
3495
                 * if(inventoryItem.getGoodQuantity()==1) {
3496
                 * LOGGER.info("GoodQty, Serial Number {}, InventoryItem = {}, Billed on {}",
3497
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3498
                 * inventoryItem.getUpdateTimestamp()); } else
3499
                 * if(inventoryItem.getBadQuantity()==1){
3500
                 * LOGGER.info("Bad Qty, Serial Number {}, InventoryItem = {}, Billed on {}",
3501
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3502
                 * inventoryItem.getUpdateTimestamp()); } else if
3503
                 * (inventoryItem.getLastScanType().equals(ScanType.SALE)) { LOGGER.
3504
                 * info("Problem Sold, Serial Number {}, InventoryItem = {}, Billed on {}",
3505
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3506
                 * inventoryItem.getUpdateTimestamp()); }
3507
                 */
31886 tejbeer 3508
                if (inventoryItem.getLastScanType().equals(ScanType.SALE) || inventoryItem.getLastScanType().equals(ScanType.SALE_RET)) {
3509
                    Map<String, Double> map = schemeInOuts.stream().collect(
3510
                            groupingBy(
3511
                                    x -> DateTimeFormatter.ofPattern("yyyyMMddHH").format(x.getCreateTimestamp()) + "- " + x.getSchemeId(), Collectors.summingDouble(x -> x.getAmount())));
33452 amit.gupta 3512
                    for (Entry<String, Double> entry : map.entrySet()) {
31697 amit.gupta 3513
                        LOGGER.info("{} = {}", entry.getKey(), entry.getValue());
3514
                    }
31886 tejbeer 3515
                    LOGGER.info("id- {}, imei- {}, lastScan = {}, Scheme sum - {}", inventoryItem.getId(), inventoryItem.getSerialNumber(), inventoryItem.getLastScanType(), schemeSum);
31697 amit.gupta 3516
                }
3517
            }
3518
        }
29441 tejbeer 3519
 
31697 amit.gupta 3520
    }
29308 tejbeer 3521
 
31697 amit.gupta 3522
    public static String readFileAsString(String file) throws Exception {
3523
        String data = "";
3524
        data = new String(Files.readAllBytes(Paths.get(file)));
3525
        return data;
3526
    }
29308 tejbeer 3527
 
31697 amit.gupta 3528
    @Autowired
3529
    private PartnerCollectionRemarkRepository partnerCollectionRemarkRepository;
30421 tejbeer 3530
 
32832 amit.gupta 3531
    //RBM L2 Escalations
32482 amit.gupta 3532
    public void reviewUncontactablePartner() throws
3533
            ProfitMandiBusinessException, MessagingException, UnsupportedEncodingException {
30421 tejbeer 3534
 
31697 amit.gupta 3535
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
30421 tejbeer 3536
 
32832 amit.gupta 3537
        List<Integer> partnerLastCollectionRemarkIds = partnerCollectionRemarkRepository.selectMaxRemarkId(new ArrayList<>(customRetailerMap.keySet()));
30859 tejbeer 3538
 
32832 amit.gupta 3539
        if (!partnerLastCollectionRemarkIds.isEmpty()) {
3540
            List<PartnerCollectionRemark> partnerCollectionRemarks = partnerCollectionRemarkRepository.selectByIds(partnerLastCollectionRemarkIds);
30421 tejbeer 3541
 
33064 ranu 3542
            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 3543
            Map<Integer, PartnerCollectionRemark> salesEscalatedRemarksMap = partnerCollectionRemarks.stream().filter(x -> x.getRemark().equals(CollectionRemark.SALES_ESCALATION)).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
30859 tejbeer 3544
 
32832 amit.gupta 3545
 
3546
            if (!rbmEscalatedRemarksMap.isEmpty()) {
3547
                //
33452 amit.gupta 3548
                for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_RBM), true).entrySet()) {
32832 amit.gupta 3549
                    List<PartnerCollectionRemark> filteredRows = storeGuyEntry.getValue().stream()
3550
                            .map(x -> rbmEscalatedRemarksMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
3551
                    String subject = "Partners escalated to RBM-L2";
3552
                    String messageText = this.getMessageForRBMEscalatedPartners(filteredRows);
3553
 
31697 amit.gupta 3554
                    MimeMessage message = mailSender.createMimeMessage();
3555
                    MimeMessageHelper helper = new MimeMessageHelper(message, true);
3556
                    String[] email = new String[]{storeGuyEntry.getKey()};
30859 tejbeer 3557
 
31697 amit.gupta 3558
                    helper.setSubject(subject);
3559
                    helper.setText(messageText, true);
3560
                    helper.setTo(email);
31886 tejbeer 3561
                    InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
31697 amit.gupta 3562
                    helper.setFrom(senderAddress);
3563
                    mailSender.send(message);
30859 tejbeer 3564
 
31697 amit.gupta 3565
                    LOGGER.info("filteredRows {}", filteredRows);
30859 tejbeer 3566
 
31697 amit.gupta 3567
                }
3568
            }
32832 amit.gupta 3569
            if (!salesEscalatedRemarksMap.isEmpty()) {
3570
                //
33452 amit.gupta 3571
                for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_RBM), true).entrySet()) {
32832 amit.gupta 3572
                    List<PartnerCollectionRemark> filteredRows = storeGuyEntry.getValue().stream()
3573
                            .map(x -> salesEscalatedRemarksMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
3574
                    String subject = "Partners escalated to Sales";
3575
                    String messageText = this.getMessageForSalesEscalatedPartners(filteredRows);
30936 tejbeer 3576
 
32832 amit.gupta 3577
                    MimeMessage message = mailSender.createMimeMessage();
3578
                    MimeMessageHelper helper = new MimeMessageHelper(message, true);
3579
                    String[] email = new String[]{storeGuyEntry.getKey()};
3580
 
3581
                    helper.setSubject(subject);
3582
                    helper.setText(messageText, true);
3583
                    helper.setTo(email);
3584
                    InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
3585
                    helper.setFrom(senderAddress);
3586
                    mailSender.send(message);
3587
 
3588
                    LOGGER.info("filteredRows {}", filteredRows);
3589
 
3590
                }
3591
            }
3592
 
31697 amit.gupta 3593
        }
3594
    }
30936 tejbeer 3595
 
33078 ranu 3596
 
31697 amit.gupta 3597
    @Autowired
33078 ranu 3598
    private NonSdBuyingRepository nonSdBuyingRepository;
3599
 
3600
    //Non Sd Buying
3601
    public void reviewNonSdBuyingBrand() throws
3602
            ProfitMandiBusinessException, MessagingException, UnsupportedEncodingException {
3603
        List<NonSdBuying> nonSdByuingActiveList = nonSdBuyingRepository.selectAllActiveNonSDBuyingList(true);
3604
        Map<Integer, NonSdBuying> unAuthorizedBuyingMap = nonSdByuingActiveList.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
3605
 
3606
        if (!unAuthorizedBuyingMap.isEmpty()) {
33452 amit.gupta 3607
            for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_SALES), true).entrySet()) {
33078 ranu 3608
                List<NonSdBuying> unAuthorizedfilteredRows = storeGuyEntry.getValue().stream()
3609
                        .map(x -> unAuthorizedBuyingMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
33112 amit.gupta 3610
                if (!unAuthorizedfilteredRows.isEmpty()) {
33078 ranu 3611
                    String subject = "Unauthorized Buying";
3612
                    String messageText = this.getMessageForUnauthorizedBuying(unAuthorizedfilteredRows);
3613
 
3614
                    MimeMessage message = mailSender.createMimeMessage();
3615
                    MimeMessageHelper helper = new MimeMessageHelper(message, true);
3616
                    String[] email = new String[]{storeGuyEntry.getKey()};
3617
 
3618
                    helper.setSubject(subject);
3619
                    helper.setText(messageText, true);
3620
                    helper.setTo(email);
3621
                    InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
3622
                    helper.setFrom(senderAddress);
3623
                    mailSender.send(message);
3624
                    LOGGER.info("unAuthorizedfilteredRows {}", unAuthorizedfilteredRows);
3625
                }
3626
 
3627
 
3628
            }
3629
 
3630
        }
3631
    }
3632
 
3633
    @Autowired
31697 amit.gupta 3634
    private LoanRepository loanRepository;
31020 tejbeer 3635
 
31697 amit.gupta 3636
    @Autowired
3637
    private LoanStatementRepository loanStatementRepository;
30859 tejbeer 3638
 
31697 amit.gupta 3639
    @Autowired
3640
    private SDCreditService sdCreditService;
30859 tejbeer 3641
 
31697 amit.gupta 3642
    @Autowired
3643
    private SDCreditRequirementRepository sdCreditRequirementRepository;
30859 tejbeer 3644
 
31697 amit.gupta 3645
    @Autowired
3646
    private CurrentPartnerDailyInvestmentRepository currentPartnerDailyInvestmentRepository;
30859 tejbeer 3647
 
31697 amit.gupta 3648
    @Autowired
3649
    private TransactionRepository transactionRepository;
30859 tejbeer 3650
 
31697 amit.gupta 3651
    @Autowired
3652
    private SanctionRequestRepository sanctionRequestRepository;
30859 tejbeer 3653
 
31697 amit.gupta 3654
    public void calculateInterestAccured() throws ProfitMandiBusinessException {
3655
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30859 tejbeer 3656
 
32724 amit.gupta 3657
        for (Loan loan : loans) {
3658
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
3659
            Map<LoanReferenceType, Double> loanStatusAmount = loanStatements.stream().collect(groupingBy(
3660
                    x -> x.getLoanReferenceType(), Collectors.summingDouble(x -> x.getAmount().doubleValue())));
30936 tejbeer 3661
 
32724 amit.gupta 3662
            int freeDays = loan.getFreeDays();
30936 tejbeer 3663
 
32724 amit.gupta 3664
            LocalDateTime freeDaysLimitDate = loan.getCreatedOn().plusDays(freeDays);
30936 tejbeer 3665
 
32724 amit.gupta 3666
            LOGGER.info("freeDaysLimitDate {}", freeDaysLimitDate);
3667
            if (LocalDateTime.now().isAfter(freeDaysLimitDate)) {
3668
                int loanStatementId = loanStatementRepository.selectLatestLoanSatement(loan.getFofoId(), loan.getId());
3669
                LOGGER.info("loanStatementId {}", loanStatementId);
3670
                if (loanStatementId != 0) {
3671
                    this.calculateInterest(loan, loanStatusAmount, loanStatementId);
31697 amit.gupta 3672
                } else {
32724 amit.gupta 3673
                    sdCreditService.addInterest(freeDaysLimitDate.toLocalDate(), LocalDate.now(), loan, loanStatusAmount);
31697 amit.gupta 3674
                }
32724 amit.gupta 3675
            }
31518 amit.gupta 3676
 
31697 amit.gupta 3677
        }
30936 tejbeer 3678
 
32724 amit.gupta 3679
 
31697 amit.gupta 3680
    }
30936 tejbeer 3681
 
31697 amit.gupta 3682
    @Autowired
3683
    FofoPaymentRepository fofoPaymentRepository;
30936 tejbeer 3684
 
31697 amit.gupta 3685
    @Autowired
3686
    CCAvenuePaymentService ccAvenuePaymentService;
30936 tejbeer 3687
 
31697 amit.gupta 3688
    public void settleCCAvePayments() throws Exception {
31886 tejbeer 3689
        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 3690
        for (FofoPayment fofoPayment : fofoPayments) {
3691
            ccAvenuePaymentService.updatePayment(fofoPayment);
3692
        }
3693
    }
30859 tejbeer 3694
 
31697 amit.gupta 3695
    /*
3696
     * public void getCCAvenuePendingOrderStatus(int pendingOrderId) { PendingOrder
3697
     * pendingOrder = pendingOrderRepository.selectById(pendingOrderId);
3698
     * ccAvenuePaymentService.getPaymentStatusMap(pendingOrder); }
3699
     */
30859 tejbeer 3700
 
32482 amit.gupta 3701
    private void calculateInterest(Loan loan, Map<LoanReferenceType, Double> loanStatusAmount,
3702
                                   int loanStatementId) throws ProfitMandiBusinessException {
31697 amit.gupta 3703
        LoanStatement loanStatement = loanStatementRepository.selectById(loanStatementId);
30859 tejbeer 3704
 
31697 amit.gupta 3705
        if (loanStatement.getLoanId() == loan.getId()) {
30859 tejbeer 3706
 
31886 tejbeer 3707
            sdCreditService.addInterest(loanStatement.getCreatedAt().toLocalDate(), LocalDate.now(), loan, loanStatusAmount);
30859 tejbeer 3708
 
31697 amit.gupta 3709
        } else {
3710
            throw new ProfitMandiBusinessException("loanstament", loanStatement.getLoanId(), "Invalid LoanId");
3711
        }
3712
    }
31175 tejbeer 3713
 
31697 amit.gupta 3714
    public void loanSettlement() throws Exception {
33828 ranu 3715
        List<Integer> loanIds = Arrays.asList(21217,21220,21222);
33664 amit.gupta 3716
        List<Loan> blockedLoans = loanRepository.selectAllActiveLoan().stream().filter(x -> x.getFreeDays() >= 365).collect(toList());
3717
        List<Loan> loans = loanRepository.selectAllActiveLoan().stream().filter(x -> x.getFreeDays() < 365).collect(toList());
3718
        //Settle blocked loans only when normal loans are settled
30859 tejbeer 3719
 
33828 ranu 3720
        for(int loanid : loanIds){
3721
            loans.addAll(blockedLoans);
3722
            //TODO:Remove this code
3723
            Loan specificLoan = loanRepository.selectByLoanId(loanid);
3724
            loans.add(0, specificLoan);
3725
            //TODO:Upto here
3726
            if (!loans.isEmpty()) {
31020 tejbeer 3727
 
33828 ranu 3728
                for (Loan loan : loans) {
3729
                    double settledAmount = sdCreditService.settleLoan(loan);
30859 tejbeer 3730
 
33828 ranu 3731
                    List<SanctionRequest> sanctionRequests = sanctionRequestRepository.selectHoldSanctionByFofoId(loan.getFofoId());
3732
                    for (SanctionRequest sanctionRequest : sanctionRequests) {
31175 tejbeer 3733
 
33828 ranu 3734
                        List<Order> orders = orderRepository.selectAllByTransactionId(sanctionRequest.getTransactionId());
3735
                        if (orders.size() == 0) {
3736
                            LOGGER.info("Could not find orders - for Sanction Request {}", sanctionRequest);
3737
                            continue;
3738
                        }
30999 tejbeer 3739
 
33828 ranu 3740
                        if (settledAmount >= sanctionRequest.getPendingAmount().doubleValue()) {
3741
                            settledAmount -= sanctionRequest.getPendingAmount().doubleValue();
3742
                            sanctionRequest.setPendingAmount(BigDecimal.valueOf(0));
3743
                            this.sendUnholdEmail(orders);
3744
                        } else {
3745
                            double pendinAmount = sanctionRequest.getPendingAmount().doubleValue() - settledAmount;
3746
                            System.out.println("Pending Amount - " + pendinAmount);
3747
                            sanctionRequest.setPendingAmount(BigDecimal.valueOf(pendinAmount));
3748
                            break;
3749
 
3750
                        }
3751
 
31697 amit.gupta 3752
                    }
33828 ranu 3753
                }
31020 tejbeer 3754
 
32439 tejbeer 3755
            }
3756
        }
31020 tejbeer 3757
 
33664 amit.gupta 3758
 
33828 ranu 3759
 
32439 tejbeer 3760
    }
31020 tejbeer 3761
 
3762
 
32439 tejbeer 3763
    private void sendUnholdEmail(List<Order> orders) throws Exception {
30859 tejbeer 3764
 
3765
 
32439 tejbeer 3766
        orders.forEach(x -> x.setShipmentHold(false));
33452 amit.gupta 3767
        orders = orders.stream().filter(x -> x.getRefundTimestamp() != null).collect(Collectors.toList());
33506 amit.gupta 3768
        if (orders.size() > 0) {
33427 amit.gupta 3769
 
33664 amit.gupta 3770
            double totalAmount = orders.stream().collect(Collectors.summingDouble(x -> x.getTotalAmount()));
30859 tejbeer 3771
 
33506 amit.gupta 3772
            List<String> authUserEmail = csService.getAuthUserIdByPartnerId(orders.get(0).getRetailerId()).stream().map(x -> x.getEmailId()).collect(Collectors.toList());
3773
            authUserEmail.add("vinay.p@smartdukaan.com");
3774
            authUserEmail.add("shivam.gupta@smartdukaan.com");
30859 tejbeer 3775
 
33506 amit.gupta 3776
            String[] emailTo = authUserEmail.toArray(new String[authUserEmail.size()]);
30859 tejbeer 3777
 
33506 amit.gupta 3778
            String[] ccTo = {"tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com"};
30859 tejbeer 3779
 
33664 amit.gupta 3780
            String subject = "Dispatch held orders of - " + (orders.get(0).getRetailerName());
3781
            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.");
3782
            Utils.sendMailWithAttachments(mailSender, emailTo, ccTo, subject, message);
33506 amit.gupta 3783
        }
30859 tejbeer 3784
 
32439 tejbeer 3785
 
31697 amit.gupta 3786
    }
30859 tejbeer 3787
 
32307 amit.gupta 3788
    public void dailyLoanAlert() throws Exception {
31697 amit.gupta 3789
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30859 tejbeer 3790
 
31697 amit.gupta 3791
        Map<Integer, Double> partnerLoanAmount = new HashMap<>();
30859 tejbeer 3792
 
31697 amit.gupta 3793
        if (!loans.isEmpty()) {
30859 tejbeer 3794
 
31697 amit.gupta 3795
            for (Loan loan : loans) {
30859 tejbeer 3796
 
31697 amit.gupta 3797
                List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
30859 tejbeer 3798
 
31886 tejbeer 3799
                double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
31697 amit.gupta 3800
                if (partnerLoanAmount.get(loan.getFofoId()) != null) {
3801
                    amount += partnerLoanAmount.get(loan.getFofoId());
3802
                    partnerLoanAmount.put(loan.getFofoId(), amount);
3803
                } else {
3804
                    partnerLoanAmount.put(loan.getFofoId(), amount);
3805
                }
30965 tejbeer 3806
 
31697 amit.gupta 3807
            }
30965 tejbeer 3808
 
31697 amit.gupta 3809
        }
30859 tejbeer 3810
 
31697 amit.gupta 3811
        if (!partnerLoanAmount.isEmpty()) {
30965 tejbeer 3812
 
31697 amit.gupta 3813
            for (Entry<Integer, Double> partnerLoanAmountEnrty : partnerLoanAmount.entrySet()) {
30859 tejbeer 3814
 
31697 amit.gupta 3815
                int fofoId = partnerLoanAmountEnrty.getKey();
30859 tejbeer 3816
 
31697 amit.gupta 3817
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(fofoId);
30859 tejbeer 3818
 
31697 amit.gupta 3819
                Address address = addressRepository.selectById(user.getAddressId());
30896 amit.gupta 3820
 
31697 amit.gupta 3821
                String title = "Alert Credit Outstanding!";
3822
                String url = "http://app.smartdukaan.com/pages/home/credit";
31886 tejbeer 3823
                String message = "Your total pending Loan amount is Rs." + FormattingUtils.formatDecimal(Math.abs(partnerLoanAmountEnrty.getValue())) + ".";
31697 amit.gupta 3824
                notificationService.sendNotification(fofoId, title, MessageType.notification, title, message, url);
30913 tejbeer 3825
 
32841 amit.gupta 3826
                //notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30913 tejbeer 3827
 
31697 amit.gupta 3828
            }
30917 tejbeer 3829
 
31697 amit.gupta 3830
        }
30917 tejbeer 3831
 
31697 amit.gupta 3832
    }
30920 tejbeer 3833
 
31697 amit.gupta 3834
    public void processActivatedImeisForSchemes() throws ProfitMandiBusinessException {
3835
        schemeService.processActivatedImeisForSchemes();
3836
    }
30920 tejbeer 3837
 
33112 amit.gupta 3838
    @Autowired
33355 amit.gupta 3839
    SidbiService sidbiService;
33112 amit.gupta 3840
 
33364 amit.gupta 3841
    public void processSidbiDeductions() throws ProfitMandiBusinessException {
33434 amit.gupta 3842
        //sidbiService.migrateSanctions();
33355 amit.gupta 3843
        sidbiService.processDeductions();
3844
    }
3845
 
31697 amit.gupta 3846
    public void updatePartnerLimit() throws ProfitMandiBusinessException {
3847
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
33355 amit.gupta 3848
        Map<Integer, BigDecimal> fofoSidbiLimitMap = sidbiService.getSuggestedLimitMap();
31886 tejbeer 3849
        Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
33159 amit.gupta 3850
        Map<Integer, CreditAccount> creditAccountMap = creditAccountRepository.selectAllByGateways(Arrays.asList(Gateway.SIDBI, Gateway.SDDIRECT))
33112 amit.gupta 3851
                .stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31886 tejbeer 3852
        Map<Integer, CurrentPartnerDailyInvestment> currentPartnerDailyInvestmentMap = currentPartnerDailyInvestmentRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31697 amit.gupta 3853
        for (Entry<Integer, CustomRetailer> customRetailerEntry : customRetailerMap.entrySet()) {
3854
            int fofoId = customRetailerEntry.getKey();
3855
            LocalDateTime firstBillingDate = transactionRepository.getFirstBillingDate(fofoId);
33287 amit.gupta 3856
 
33112 amit.gupta 3857
            CreditAccount creditAccount = creditAccountMap.get(fofoId);
3858
 
31697 amit.gupta 3859
            CurrentPartnerDailyInvestment currentPartnerDailyInvestment = currentPartnerDailyInvestmentMap.get(fofoId);
33355 amit.gupta 3860
            BigDecimal suggestedAmount = this.getSuggestedAmount(creditAccount, currentPartnerDailyInvestment, fofoSidbiLimitMap.get(fofoId));
33112 amit.gupta 3861
            SDCreditRequirement sdCreditRequirement = sdCreditRequirementMap.get(fofoId);
30929 tejbeer 3862
 
31697 amit.gupta 3863
            LOGGER.info("suggestedAmount {} ", suggestedAmount);
30913 tejbeer 3864
 
31697 amit.gupta 3865
            if (sdCreditRequirement == null) {
3866
                sdCreditRequirement = new SDCreditRequirement();
3867
                sdCreditRequirement.setFofoId(fofoId);
3868
                sdCreditRequirement.setCreditDays(15);
33452 amit.gupta 3869
                sdCreditRequirement.setInterestRate(ProfitMandiConstants.NEW_INTEREST_RATE);
31697 amit.gupta 3870
                sdCreditRequirement.setRisk(CreditRisk.HIGH_RISK);
3871
                sdCreditRequirement.setUtilizedAmount(BigDecimal.ZERO);
3872
                sdCreditRequirement.setCreateTimestamp(LocalDateTime.now());
3873
                sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
3874
                sdCreditRequirementRepository.persist(sdCreditRequirement);
3875
            }
30913 tejbeer 3876
 
31697 amit.gupta 3877
            CreditRisk creditRisk = sdCreditService.getCurrentRisk(sdCreditRequirement, firstBillingDate);
30913 tejbeer 3878
 
31697 amit.gupta 3879
            sdCreditRequirement.setRisk(creditRisk);
30913 tejbeer 3880
 
31697 amit.gupta 3881
            sdCreditRequirement.setSuggestedLimit(suggestedAmount);
3882
            sdCreditRequirement.setLimit(suggestedAmount);
3883
            BigDecimal utilizedLimit = new BigDecimal(sdCreditService.getUtilizationAmount(fofoId));
30934 tejbeer 3884
 
31697 amit.gupta 3885
            BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);
30934 tejbeer 3886
 
31697 amit.gupta 3887
            LOGGER.info("utilizedLimit {} ", utilizedLimit);
30913 tejbeer 3888
 
31697 amit.gupta 3889
            LOGGER.info("availableLimit {} ", availableLimit);
30913 tejbeer 3890
 
31697 amit.gupta 3891
            sdCreditRequirement.setUtilizedAmount(utilizedLimit);
30929 tejbeer 3892
 
31697 amit.gupta 3893
            sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
30929 tejbeer 3894
 
31697 amit.gupta 3895
            if (creditAccount != null) {
30929 tejbeer 3896
 
31697 amit.gupta 3897
                creditAccount.setInterestRate(sdCreditRequirement.getInterestRate().floatValue());
3898
                creditAccount.setSanctionedAmount(sdCreditRequirement.getLimit().floatValue());
3899
                creditAccount.setAvailableAmount(availableLimit.floatValue());
3900
                creditAccount.setFreeDays(sdCreditRequirement.getFreeDays());
3901
                creditAccount.setUpdatedOn(LocalDateTime.now());
3902
            }
30929 tejbeer 3903
 
31697 amit.gupta 3904
        }
31177 tejbeer 3905
 
31697 amit.gupta 3906
    }
30929 tejbeer 3907
 
33355 amit.gupta 3908
    private BigDecimal getSuggestedAmount(CreditAccount creditAccount, CurrentPartnerDailyInvestment currentPartnerDailyInvestment, BigDecimal sidbiLimit) {
33112 amit.gupta 3909
        BigDecimal suggestedAmount = BigDecimal.ZERO;
3910
        //1 LAC
3911
        double limitValue = 100000;
33295 amit.gupta 3912
        if (creditAccount == null || creditAccount.getGateway().equals(Gateway.SDDIRECT)) {
33112 amit.gupta 3913
 
3914
            if (currentPartnerDailyInvestment != null) {
3915
                suggestedAmount = BigDecimal.valueOf(Math.min(currentPartnerDailyInvestment.getTotalInvestment() * 0.1, limitValue));
3916
            }
3917
            if (suggestedAmount.doubleValue() < 0) {
3918
                suggestedAmount = BigDecimal.ZERO;
3919
            }
33355 amit.gupta 3920
        } else if (creditAccount.getGateway().equals(Gateway.SIDBI) && sidbiLimit != null) {
33112 amit.gupta 3921
            //Left
33355 amit.gupta 3922
            suggestedAmount = sidbiLimit;
33112 amit.gupta 3923
        }
3924
        return suggestedAmount;
3925
    }
3926
 
31697 amit.gupta 3927
    public void notifyDefaultLoans() throws ProfitMandiBusinessException, MessagingException, IOException {
30929 tejbeer 3928
 
31697 amit.gupta 3929
        sdCreditService.updateRisk();
3930
        List<Loan> defaultLoans = sdCreditService.getDefaultLoan();
3931
        if (!defaultLoans.isEmpty()) {
3932
            this.sendDefaultLoanAlert(defaultLoans);
3933
        }
30929 tejbeer 3934
 
31697 amit.gupta 3935
    }
30929 tejbeer 3936
 
32482 amit.gupta 3937
    public void sendDefaultLoanAlert(List<Loan> defaultLoans) throws
3938
            ProfitMandiBusinessException, MessagingException, IOException {
31697 amit.gupta 3939
        String subject = "Default Partners";
30931 tejbeer 3940
 
31886 tejbeer 3941
        List<Integer> categoryIds = Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_CATEGORY, ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS, ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT);
30929 tejbeer 3942
 
33452 amit.gupta 3943
        for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false).entrySet()) {
31697 amit.gupta 3944
            List<Loan> filteredRows = new ArrayList<>();
3945
            for (Loan loan : defaultLoans) {
30929 tejbeer 3946
 
31697 amit.gupta 3947
                if (storeGuyEntry.getValue().contains(loan.getFofoId())) {
30929 tejbeer 3948
 
31697 amit.gupta 3949
                    filteredRows.add(loan);
3950
                }
3951
            }
3952
            if (!filteredRows.isEmpty()) {
33628 tejus.loha 3953
                String[] email = new String[]{storeGuyEntry.getKey()};
31697 amit.gupta 3954
                String messageText = this.getMessageForDueDateExtend(filteredRows);
32350 amit.gupta 3955
                this.sendMailOfHtmlFormat(googleMailSender, email, messageText, null, subject);
30982 tejbeer 3956
 
31697 amit.gupta 3957
            }
30936 tejbeer 3958
 
31697 amit.gupta 3959
        }
33628 tejus.loha 3960
        String messageText = this.getMessageForDueDateExtend(defaultLoans);
3961
        this.sendMailOfHtmlFormat(googleMailSender, new String[]{"puneet.wahi@smartdukaan.com"}, messageText, null, subject);
30982 tejbeer 3962
 
31697 amit.gupta 3963
        for (Loan defaultLoan : defaultLoans) {
3964
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
30929 tejbeer 3965
 
31886 tejbeer 3966
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30929 tejbeer 3967
 
31697 amit.gupta 3968
            com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(defaultLoan.getFofoId());
30936 tejbeer 3969
 
31697 amit.gupta 3970
            Address address = addressRepository.selectById(user.getAddressId());
30936 tejbeer 3971
 
31697 amit.gupta 3972
            String title = "Loan Amount Overdue!";
3973
            String url = "http://app.smartdukaan.com/pages/home/credit";
31886 tejbeer 3974
            String message = "Your loan due date " + defaultLoan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy")) + " has been exceeded. Additional penal interest of " + defaultLoan.getInterestRate().setScale(2, RoundingMode.HALF_UP) + "%  and Rs.100 shall be levied on daily basis." + " Your total pending Loan amount is Rs." + FormattingUtils.formatDecimal(Math.abs(amount)) + ". !!Pay Now!!";
3975
            notificationService.sendNotification(defaultLoan.getFofoId(), title, MessageType.notification, title, message, url);
30936 tejbeer 3976
 
31697 amit.gupta 3977
            // notificationService.sendWhatsappMessage(message, title,
3978
            // address.getPhoneNumber());
30929 tejbeer 3979
 
31697 amit.gupta 3980
        }
3981
    }
30929 tejbeer 3982
 
31697 amit.gupta 3983
    private String getMessageForDueDateExtend(List<Loan> loans) throws ProfitMandiBusinessException {
33553 ranu 3984
        Map<Integer, com.spice.profitmandi.dao.model.FofoReportingModel> fofoReportingModelMap = csService.getPartnerIdSalesHeaders();
3985
        Map<Integer, FofoRBMReportingModel> fofoRbmReportingModelMap = csService.getPartnerIdRBMHeaders();
3986
        List<AST> asts = astRepository.selectAll();
3987
        Map<Integer, AST> astMap = asts.stream()
3988
                .collect(Collectors.toMap(AST::getId, ast -> ast));
31697 amit.gupta 3989
        StringBuilder sb = new StringBuilder();
3990
        sb.append(
33553 ranu 3991
                "<html><body><p>Alert</p><p>Default Partners :-</p>" + "<br/><p>EveryDay Rs.100 charged as Penalty</p>" + "<br/>" +
3992
                        "<table style='border:1px solid black ;padding: 5px';>");
3993
        sb.append("<tbody>\n" +
3994
                "<tr>\n" +
3995
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>\n" +
33555 ranu 3996
                "<th style='border:1px solid black;padding: 5px'>State Name</th>\n" +
3997
                "<th style='border:1px solid black;padding: 5px'>Area</th>\n" +
3998
                "<th style='border:1px solid black;padding: 5px'>Territory</th>\n" +
33553 ranu 3999
                "<th style='border:1px solid black;padding: 5px'>due date</th>\n" +
4000
                "<th style='border:1px solid black;padding: 5px'>Days</th>\n" +
33664 amit.gupta 4001
                "<th style='border:1px solid black;padding: 5px'>Pending Amount</th>\n" +
33810 ranu 4002
                "<th style='border:1px solid black;padding: 5px'>RBM L2</th>\n" +
33553 ranu 4003
                "<th style='border:1px solid black;padding: 5px'>RBM L1</th>\n" +
4004
                "<th style='border:1px solid black;padding: 5px'>Sales L1</th>\n" +
4005
                "<th style='border:1px solid black;padding: 5px'>Sales L2</th>\n" +
4006
                "</tr>");
31697 amit.gupta 4007
        for (Loan entry : loans) {
30929 tejbeer 4008
 
31697 amit.gupta 4009
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(entry.getId());
30929 tejbeer 4010
 
31886 tejbeer 4011
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30929 tejbeer 4012
 
31697 amit.gupta 4013
            long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getDueDate().toLocalDate(), LocalDateTime.now());
30929 tejbeer 4014
 
31697 amit.gupta 4015
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
30929 tejbeer 4016
 
31697 amit.gupta 4017
            sb.append("<tr>");
31886 tejbeer 4018
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
33555 ranu 4019
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getAddress().getState() + "</td>");
4020
            sb.append("<td style='border:1px solid black;padding: 5px'>" + astMap.get(customRetailer.getAstId()).getArea() + "</td>");
4021
            sb.append("<td style='border:1px solid black;padding: 5px'>" + astMap.get(customRetailer.getAstId()).getTerritory() + "</td>");
31886 tejbeer 4022
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getDueDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
31697 amit.gupta 4023
            sb.append("<td style='border:1px solid black;padding: 5px'>" + noOfdaysBetween + "</td>");
31886 tejbeer 4024
            sb.append("<td style='border:1px solid black;padding: 5px'>" + new DecimalFormat("#.##").format(Math.abs(amount)) + "</td>");
33553 ranu 4025
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoRbmReportingModelMap.get(entry.getFofoId()).getL1Manager() + "</td>");
4026
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoRbmReportingModelMap.get(entry.getFofoId()).getL2Manager() + "</td>");
4027
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoReportingModelMap.get(entry.getFofoId()).getTerritoryManager() + "</td>");
4028
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoReportingModelMap.get(entry.getFofoId()).getRegionalManager() + "</td>");
31397 tejbeer 4029
 
33555 ranu 4030
 
31697 amit.gupta 4031
            sb.append("</tr>");
31397 tejbeer 4032
 
31697 amit.gupta 4033
        }
31397 tejbeer 4034
 
31697 amit.gupta 4035
        sb.append("</tbody></table></body></html>");
31397 tejbeer 4036
 
31697 amit.gupta 4037
        return sb.toString();
4038
    }
31397 tejbeer 4039
 
31697 amit.gupta 4040
    private String getMessageForDueDateCross(List<Loan> loans) throws ProfitMandiBusinessException {
33161 ranu 4041
        Map<Integer, com.spice.profitmandi.dao.model.FofoReportingModel> fofoReportingModelMap = csService.getPartnerIdSalesHeaders();
33452 amit.gupta 4042
        Map<Integer, FofoRBMReportingModel> fofoRbmReportingModelMap = csService.getPartnerIdRBMHeaders();
33553 ranu 4043
        List<AST> asts = astRepository.selectAll();
4044
        Map<Integer, AST> astMap = asts.stream()
4045
                .collect(Collectors.toMap(AST::getId, ast -> ast));
4046
 
31697 amit.gupta 4047
        StringBuilder sb = new StringBuilder();
33161 ranu 4048
        sb.append("<html><body><p>Alert</p><p>Due Date Cross Partners :-</p>" + "<br/><p>Additional penal interest of  shall be levied on daily basis.</p>" + "<br/>" +
4049
                "<table style='border:1px solid black ;padding: 5px';>");
4050
        sb.append("<tbody>\n" + "<tr>\n" +
33256 amit.gupta 4051
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>\n" +
4052
                "<th style='border:1px solid black;padding: 5px'>State Name</th>\n" +
33555 ranu 4053
                "<th style='border:1px solid black;padding: 5px'>Area</th>\n" +
33553 ranu 4054
                "<th style='border:1px solid black;padding: 5px'>Territory</th>\n" +
33256 amit.gupta 4055
                "<th style='border:1px solid black;padding: 5px'>due date</th>\n" +
4056
                "<th style='border:1px solid black;padding: 5px'>Days</th>\n" +
4057
                "<th style='border:1px solid black;padding: 5px'>Pending Amount</th>\n" +
33810 ranu 4058
                "<th style='border:1px solid black;padding: 5px'>RBM L2</th>\n" +
33256 amit.gupta 4059
                "<th style='border:1px solid black;padding: 5px'>RBM L1</th>\n" +
4060
                "<th style='border:1px solid black;padding: 5px'>Sales L1</th>\n" +
4061
                "<th style='border:1px solid black;padding: 5px'>Sales L2</th>\n" +
33161 ranu 4062
                "</tr>");
31397 tejbeer 4063
 
31697 amit.gupta 4064
        for (Loan entry : loans) {
31397 tejbeer 4065
 
31697 amit.gupta 4066
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(entry.getId());
31397 tejbeer 4067
 
31886 tejbeer 4068
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
31397 tejbeer 4069
 
31697 amit.gupta 4070
            long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getDueDate().toLocalDate(), LocalDateTime.now());
31397 tejbeer 4071
 
31697 amit.gupta 4072
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
31397 tejbeer 4073
 
31697 amit.gupta 4074
            sb.append("<tr>");
31886 tejbeer 4075
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
33162 ranu 4076
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getAddress().getState() + "</td>");
33553 ranu 4077
            sb.append("<td style='border:1px solid black;padding: 5px'>" + astMap.get(customRetailer.getAstId()).getArea() + "</td>");
4078
            sb.append("<td style='border:1px solid black;padding: 5px'>" + astMap.get(customRetailer.getAstId()).getTerritory() + "</td>");
30936 tejbeer 4079
 
31886 tejbeer 4080
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getDueDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
31697 amit.gupta 4081
            sb.append("<td style='border:1px solid black;padding: 5px'>" + noOfdaysBetween + "</td>");
31886 tejbeer 4082
            sb.append("<td style='border:1px solid black;padding: 5px'>" + new DecimalFormat("#.##").format(Math.abs(amount)) + "</td>");
33161 ranu 4083
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoRbmReportingModelMap.get(entry.getFofoId()).getL1Manager() + "</td>");
4084
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoRbmReportingModelMap.get(entry.getFofoId()).getL2Manager() + "</td>");
4085
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoReportingModelMap.get(entry.getFofoId()).getTerritoryManager() + "</td>");
4086
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoReportingModelMap.get(entry.getFofoId()).getRegionalManager() + "</td>");
31697 amit.gupta 4087
            sb.append("</tr>");
4088
        }
31397 tejbeer 4089
 
31697 amit.gupta 4090
        sb.append("</tbody></table></body></html>");
31397 tejbeer 4091
 
31697 amit.gupta 4092
        return sb.toString();
4093
    }
31397 tejbeer 4094
 
32307 amit.gupta 4095
    public void notifyLoanDueDateCross() throws Exception {
31397 tejbeer 4096
 
31697 amit.gupta 4097
        List<Loan> dueDateCrossLoans = sdCreditService.getDueDateCrossLoan();
4098
        if (!dueDateCrossLoans.isEmpty()) {
4099
            this.sendDueDateCrossLoanAlert(dueDateCrossLoans);
4100
        }
31397 tejbeer 4101
 
31697 amit.gupta 4102
    }
31397 tejbeer 4103
 
32307 amit.gupta 4104
    private void sendDueDateCrossLoanAlert(List<Loan> dueDateCrossLoans) throws Exception {
31886 tejbeer 4105
        List<Integer> categoryIds = Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_CATEGORY, ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS, ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT);
31397 tejbeer 4106
 
33452 amit.gupta 4107
        for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false).entrySet()) {
33631 tejus.loha 4108
            List<Loan> filteredRows = new ArrayList<>();
31697 amit.gupta 4109
            for (Loan loan : dueDateCrossLoans) {
30936 tejbeer 4110
 
31697 amit.gupta 4111
                if (storeGuyEntry.getValue().contains(loan.getFofoId())) {
30982 tejbeer 4112
 
31697 amit.gupta 4113
                    filteredRows.add(loan);
4114
                }
4115
            }
4116
            if (!filteredRows.isEmpty()) {
4117
                String messageText = this.getMessageForDueDateCross(filteredRows);
33628 tejus.loha 4118
                String[] email = new String[]{storeGuyEntry.getKey()};
30982 tejbeer 4119
 
32350 amit.gupta 4120
                this.sendMailOfHtmlFormat(googleMailSender, email, messageText, null, "Due Date Cross");
30936 tejbeer 4121
 
31697 amit.gupta 4122
            }
30936 tejbeer 4123
 
31697 amit.gupta 4124
        }
33631 tejus.loha 4125
        String messageText = this.getMessageForDueDateCross(dueDateCrossLoans);
33628 tejus.loha 4126
        this.sendMailOfHtmlFormat(googleMailSender, new String[]{"puneet.wahi@smartdukaan.com"}, messageText, null, "Due Date Cross");
4127
 
4128
 
31697 amit.gupta 4129
        if (!dueDateCrossLoans.isEmpty()) {
4130
            for (Loan loan : dueDateCrossLoans) {
30936 tejbeer 4131
 
31697 amit.gupta 4132
                long noOfdaysBetween = ChronoUnit.DAYS.between(loan.getDueDate().toLocalDate(), LocalDate.now());
30989 tejbeer 4133
 
31697 amit.gupta 4134
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(loan.getFofoId());
30989 tejbeer 4135
 
31697 amit.gupta 4136
                Address address = addressRepository.selectById(user.getAddressId());
30982 tejbeer 4137
 
31697 amit.gupta 4138
                LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
30982 tejbeer 4139
 
31697 amit.gupta 4140
                List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
30936 tejbeer 4141
 
31886 tejbeer 4142
                double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30936 tejbeer 4143
 
31697 amit.gupta 4144
                String url = "http://app.smartdukaan.com/pages/home/credit";
30936 tejbeer 4145
 
31697 amit.gupta 4146
                String title = "Alert!";
31886 tejbeer 4147
                String message = "Your loan 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 4148
 
31886 tejbeer 4149
                notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title, message, url);
30936 tejbeer 4150
 
32841 amit.gupta 4151
                //notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 4152
 
31697 amit.gupta 4153
            }
4154
        }
30982 tejbeer 4155
 
31697 amit.gupta 4156
    }
30936 tejbeer 4157
 
32307 amit.gupta 4158
    public void alertForDueDate() throws Exception {
30936 tejbeer 4159
 
31697 amit.gupta 4160
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30936 tejbeer 4161
 
31697 amit.gupta 4162
        if (!loans.isEmpty()) {
4163
            for (Loan loan : loans) {
30936 tejbeer 4164
 
31697 amit.gupta 4165
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(loan.getFofoId());
30936 tejbeer 4166
 
31697 amit.gupta 4167
                Address address = addressRepository.selectById(user.getAddressId());
30936 tejbeer 4168
 
31697 amit.gupta 4169
                long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), loan.getDueDate().toLocalDate());
30936 tejbeer 4170
 
31697 amit.gupta 4171
                LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
30982 tejbeer 4172
 
31697 amit.gupta 4173
                if (noOfdaysBetween <= 4 && noOfdaysBetween >= 0) {
4174
                    List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
31886 tejbeer 4175
                    double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30936 tejbeer 4176
 
31697 amit.gupta 4177
                    String title = "Alert!";
4178
                    String url = "http://app.smartdukaan.com/pages/home/credit";
4179
                    String message = null;
4180
                    if (noOfdaysBetween == 0) {
30936 tejbeer 4181
 
31886 tejbeer 4182
                        message = "Your total pending Loan amount is Rs." + FormattingUtils.formatDecimal(Math.abs(amount)) + " is due for Today, Pay Now!!";
30982 tejbeer 4183
 
31697 amit.gupta 4184
                    } else {
30982 tejbeer 4185
 
31886 tejbeer 4186
                        message = "Your total pending Loan amount is Rs." + FormattingUtils.formatDecimal(Math.abs(amount)) + " is due by " + loan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy")) + " , Pay Now!!";
30982 tejbeer 4187
 
31697 amit.gupta 4188
                    }
31886 tejbeer 4189
                    notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title, message, url);
32841 amit.gupta 4190
                    //notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 4191
 
31697 amit.gupta 4192
                }
4193
            }
4194
        }
30984 tejbeer 4195
 
31697 amit.gupta 4196
    }
30982 tejbeer 4197
 
32307 amit.gupta 4198
    public void userMobileNumberOptIn() throws Exception {
30982 tejbeer 4199
 
31697 amit.gupta 4200
        List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
30982 tejbeer 4201
 
31886 tejbeer 4202
        List<com.spice.profitmandi.dao.entity.user.User> users = userUserRepository.selectByIds(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
30982 tejbeer 4203
 
31886 tejbeer 4204
        List<Address> addresses = addressRepository.selectByIds(users.stream().map(x -> x.getAddressId()).collect(Collectors.toList()));
30982 tejbeer 4205
 
31697 amit.gupta 4206
        LOGGER.info("addresses" + addresses);
30984 tejbeer 4207
 
31697 amit.gupta 4208
        for (Address address : addresses) {
32307 amit.gupta 4209
            notificationService.optIn(address.getPhoneNumber());
30982 tejbeer 4210
 
31697 amit.gupta 4211
        }
30982 tejbeer 4212
 
31697 amit.gupta 4213
    }
30982 tejbeer 4214
 
31697 amit.gupta 4215
    public void authUserMobileNumberOptIn() throws HttpHostConnectException, ProfitMandiBusinessException {
31206 tejbeer 4216
 
31697 amit.gupta 4217
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
4218
        LOGGER.info("authUsers" + authUsers);
31206 tejbeer 4219
 
31697 amit.gupta 4220
        for (AuthUser authUser : authUsers) {
4221
            Map<String, String> requestheaders = new HashMap<>();
4222
            requestheaders.put("Content-Type", "application/x-www-form-urlencoded");
4223
            Map<String, String> requestParams = new HashMap<>();
4224
            requestParams.put("userid", String.valueOf(2000215976));
4225
            requestParams.put("password", "MFRd!BBL");
4226
            requestParams.put("phone_number", authUser.getMobileNumber());
4227
            requestParams.put("auth_scheme", "plain");
4228
            requestParams.put("v", "1.1");
4229
            requestParams.put("format", "json");
31206 tejbeer 4230
 
31697 amit.gupta 4231
            requestParams.put("method", "OPT_IN");
31206 tejbeer 4232
 
31697 amit.gupta 4233
            requestParams.put("channel", "WHATSAPP");
31886 tejbeer 4234
            String response = restClient.get("https://media.smsgupshup.com/GatewayAPI/rest", requestParams, requestheaders);
31697 amit.gupta 4235
            LOGGER.info("response" + response);
4236
        }
31206 tejbeer 4237
 
31697 amit.gupta 4238
    }
31206 tejbeer 4239
 
31697 amit.gupta 4240
    @Autowired
4241
    private HygieneDataRepository hygieneDataRepository;
31209 tejbeer 4242
 
31697 amit.gupta 4243
    public void hygineAlertForPartner() throws ProfitMandiBusinessException, MessagingException, IOException {
31206 tejbeer 4244
 
31697 amit.gupta 4245
        List<String> remarks = new ArrayList<>();
4246
        remarks.add("Out of Service");
4247
        remarks.add("Duplicate number");
4248
        remarks.add("Partner number");
31886 tejbeer 4249
        List<HygieneData> hygieneData = hygieneDataRepository.selectAllByDisposedDateAndRemark(LocalDate.now(), remarks);
31206 tejbeer 4250
 
31697 amit.gupta 4251
        if (!hygieneData.isEmpty()) {
31206 tejbeer 4252
 
31886 tejbeer 4253
            Map<Integer, List<HygieneData>> partnerHygieneDataMap = hygieneData.stream().collect(groupingBy(x -> x.getFofoId()));
31206 tejbeer 4254
 
31697 amit.gupta 4255
            for (Entry<Integer, List<HygieneData>> partnerHygieneDataMapEntry : partnerHygieneDataMap.entrySet()) {
31206 tejbeer 4256
 
31697 amit.gupta 4257
                CustomRetailer customRetailer = retailerService.getFofoRetailer(partnerHygieneDataMapEntry.getKey());
31206 tejbeer 4258
 
31697 amit.gupta 4259
                StringBuilder sb = new StringBuilder();
31886 tejbeer 4260
                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 4261
 
31886 tejbeer 4262
                        + " </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 4263
 
31697 amit.gupta 4264
                        + "<br/><table style='border:1px solid black ;padding: 5px';>");
4265
                sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4266
                sb.append("<th style='border:1px solid black;padding: 5px'>Invoice Number</th>\n");
4267
                sb.append("<th style='border:1px solid black;padding: 5px'>Customer Name</th>\n");
4268
                sb.append("<th style='border:1px solid black;padding: 5px'>Customer Number</th>\n");
4269
                sb.append("</tr>\n");
31206 tejbeer 4270
 
31697 amit.gupta 4271
                List<HygieneData> hygienes = partnerHygieneDataMapEntry.getValue();
31206 tejbeer 4272
 
31697 amit.gupta 4273
                List<Integer> orderIds = hygienes.stream().map(x -> x.getOrderId()).collect(Collectors.toList());
31206 tejbeer 4274
 
31697 amit.gupta 4275
                List<FofoOrder> fofoOrders = fofoOrderRepository.selectAllByOrderIds(orderIds);
31206 tejbeer 4276
 
31697 amit.gupta 4277
                for (FofoOrder fofoOrder : fofoOrders) {
4278
                    Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
4279
                    sb.append("<tr>");
31886 tejbeer 4280
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoOrder.getInvoiceNumber() + "</td>\n");
4281
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customer.getFirstName() + "" + customer.getLastName() + "</td>\n");
4282
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customer.getMobileNumber() + "</td>\n");
31206 tejbeer 4283
 
31697 amit.gupta 4284
                    sb.append("</tr>\n");
4285
                }
31206 tejbeer 4286
 
31697 amit.gupta 4287
                sb.append("</tbody></table></body></html>");
4288
                String subject = "Customer Info - Hygiene Alert";
31206 tejbeer 4289
 
32350 amit.gupta 4290
                this.sendMailOfHtmlFormat(mailSender, new String[]{customRetailer.getEmail()}, sb.toString(), null, subject);
31206 tejbeer 4291
 
31697 amit.gupta 4292
            }
31206 tejbeer 4293
 
31697 amit.gupta 4294
        }
31206 tejbeer 4295
 
31697 amit.gupta 4296
    }
31206 tejbeer 4297
 
33046 amit.gupta 4298
    //
4299
    public void setInventoryItemIdToPriceDropImei() {
4300
        List<PriceDropIMEI> priceDropIMEIList = priceDropIMEIRepository.selectAllMissingInventoryItemIds();
4301
        LOGGER.info("Problems with - {} entries", priceDropIMEIList.size());
4302
        //priceDropIMEIList.stream().collect(C)
4303
        for (PriceDropIMEI priceDropIMEI : priceDropIMEIList) {
4304
            System.out.println(priceDropIMEI.getImei());
4305
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectAllBySerialNumberFofoId(priceDropIMEI.getImei(), priceDropIMEI.getPartnerId());
33051 amit.gupta 4306
            if (inventoryItems.size() == 0) {
33046 amit.gupta 4307
                LOGGER.info("Could not find Grn - FofoID {} , Imei {} ", priceDropIMEI);
33051 amit.gupta 4308
            } else if (inventoryItems.size() > 1) {
33046 amit.gupta 4309
                LOGGER.info("Found 2 such instance for - FofoID {} , Imei {} ", priceDropIMEI.getImei(), priceDropIMEI.getPartnerId());
4310
            } else {
4311
                priceDropIMEI.setInventoryItemId(inventoryItems.get(0).getId());
4312
            }
4313
 
4314
        }
4315
    }
4316
 
33051 amit.gupta 4317
    @Autowired
4318
    SaholicReservationSnapshotRepository saholicReservationSnapshotRepository;
4319
 
33256 amit.gupta 4320
    public void removePartialBillingForTransaction(int transactionId) throws ProfitMandiBusinessException {
33051 amit.gupta 4321
        List<Order> orderList = orderRepository.selectAllByTransactionId(transactionId);
4322
        Map<Integer, Order> orderMap = orderList.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
4323
        //Delete scanRecords
4324
        List<WarehouseScan> warehouseScans = warehouseScanRepository.selectAllByOrderIds(new ArrayList<>(orderMap.keySet()));
4325
        for (WarehouseScan warehouseScan : warehouseScans) {
4326
            warehouseScanRepository.delete(warehouseScan);
4327
            WarehouseInventoryItem warehouseInventoryItem = warehouseInventoryItemRepository.selectById(warehouseScan.getInventoryItemId());
4328
            warehouseInventoryItem.setLastScanType(in.shop2020.warehouse.ScanType.PURCHASE);
4329
            warehouseInventoryItem.setCurrentQuantity(warehouseInventoryItem.getCurrentQuantity() + warehouseScan.getQuantity());
4330
        }
4331
 
4332
        for (Order order : orderList) {
33078 ranu 4333
            if (order.getBillingTimestamp() != null) {
33056 amit.gupta 4334
                order.setStatus(OrderStatus.ACCEPTED);
4335
                order.setStatusDescription("Submitted for Processing");
4336
                order.setBillingTimestamp(null);
4337
                order.setBilledBy(null);
33057 amit.gupta 4338
                order.setSerialNumber(null);
33056 amit.gupta 4339
                order.setJacketNumber(null);
33060 amit.gupta 4340
                order.getLineItem().setSerialNumber(null);
33056 amit.gupta 4341
                List<LineItemImei> lineItemImeis = lineItemImeisRepository.selectByLineItemId(order.getLineItem().getId());
4342
                for (LineItemImei lineItemImei : lineItemImeis) {
4343
                    lineItemImeisRepository.delete(lineItemImei);
4344
                }
4345
                SaholicReservationSnapshot saholicReservationSnapshot = saholicReservationSnapshotRepository
4346
                        .selectByOrderId(order.getId());
4347
                if (saholicReservationSnapshot == null) {
4348
                    saholicInventoryService.addReservationCount(order.getLineItem().getItemId(),
4349
                            order.getFulfilmentWarehouseId(), order.getLineItem().getQuantity(), order.getId());
4350
                }
33055 amit.gupta 4351
            }
33051 amit.gupta 4352
        }
4353
    }
4354
 
31697 amit.gupta 4355
    public void hygineAlertForInternalTeam() throws ProfitMandiBusinessException, MessagingException, IOException {
31206 tejbeer 4356
 
31697 amit.gupta 4357
        List<String> remarks = new ArrayList<>();
4358
        remarks.add("Out of Service");
4359
        remarks.add("Duplicate number");
4360
        remarks.add("Partner number");
31886 tejbeer 4361
        List<HygieneData> hygieneDataLastThreeMonth = hygieneDataRepository.selectDisposedDateAndRemarks(
4362
                LocalDate.now().withDayOfMonth(1).minusMonths(3).atStartOfDay(), LocalDate.now().minusMonths(1).withDayOfMonth(LocalDate.now().minusMonths(1).lengthOfMonth()).atTime(LocalTime.MAX), remarks);
31206 tejbeer 4363
 
31886 tejbeer 4364
        List<HygieneData> hygieneDataRecentMonth = hygieneDataRepository.selectDisposedDateAndRemarks(LocalDate.now().withDayOfMonth(1), remarks);
31697 amit.gupta 4365
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
4366
        Map<Integer, List<HygieneData>> partnerHygieneLastThreeMonthMap = null;
31206 tejbeer 4367
 
31697 amit.gupta 4368
        Map<Integer, List<HygieneData>> partnerHygieneDataRecentMonth = null;
31206 tejbeer 4369
 
31697 amit.gupta 4370
        if (!hygieneDataLastThreeMonth.isEmpty()) {
31886 tejbeer 4371
            partnerHygieneLastThreeMonthMap = hygieneDataLastThreeMonth.stream().collect(groupingBy(x -> x.getFofoId()));
31206 tejbeer 4372
 
31697 amit.gupta 4373
        }
31206 tejbeer 4374
 
31697 amit.gupta 4375
        if (!hygieneDataRecentMonth.isEmpty()) {
31886 tejbeer 4376
            partnerHygieneDataRecentMonth = hygieneDataRecentMonth.stream().collect(groupingBy(x -> x.getFofoId()));
31697 amit.gupta 4377
        }
31206 tejbeer 4378
 
31697 amit.gupta 4379
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
31206 tejbeer 4380
 
31697 amit.gupta 4381
            String email = storeGuyEntry.getKey();
31206 tejbeer 4382
 
31697 amit.gupta 4383
            List<Integer> fofoIds = new ArrayList<>(storeGuyEntry.getValue());
31206 tejbeer 4384
 
31697 amit.gupta 4385
            Map<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthData = new HashMap<>();
4386
            Map<Integer, Map<LocalDate, List<HygieneData>>> partnerDateWiseData = new HashMap<>();
4387
            for (Integer fofoId : fofoIds) {
31206 tejbeer 4388
 
31697 amit.gupta 4389
                partnerYearMonthData.put(fofoId, null);
4390
                partnerDateWiseData.put(fofoId, null);
4391
                if (!partnerHygieneLastThreeMonthMap.isEmpty()) {
4392
                    List<HygieneData> hygienes = partnerHygieneLastThreeMonthMap.get(fofoId);
31206 tejbeer 4393
 
31697 amit.gupta 4394
                    if (hygienes != null) {
31886 tejbeer 4395
                        Map<YearMonth, List<HygieneData>> yearMonthData = hygienes.stream().collect(groupingBy(x -> YearMonth.from(x.getDisposedTimestamp())));
31206 tejbeer 4396
 
31697 amit.gupta 4397
                        partnerYearMonthData.put(fofoId, yearMonthData);
31206 tejbeer 4398
 
31697 amit.gupta 4399
                    }
4400
                    List<HygieneData> dateWiseHygienes = partnerHygieneDataRecentMonth.get(fofoId);
31206 tejbeer 4401
 
31697 amit.gupta 4402
                    if (dateWiseHygienes != null) {
31206 tejbeer 4403
 
31886 tejbeer 4404
                        Map<LocalDate, List<HygieneData>> dateWiseData = hygienes.stream().collect(groupingBy(x -> (x.getDisposedTimestamp()).toLocalDate()));
31206 tejbeer 4405
 
31697 amit.gupta 4406
                        partnerDateWiseData.put(fofoId, dateWiseData);
31206 tejbeer 4407
 
31697 amit.gupta 4408
                    }
31206 tejbeer 4409
 
31697 amit.gupta 4410
                }
31206 tejbeer 4411
 
31697 amit.gupta 4412
            }
31206 tejbeer 4413
 
31697 amit.gupta 4414
            String subject = "Customer Info - Hygiene Alert";
31206 tejbeer 4415
 
31697 amit.gupta 4416
            LOGGER.info("hygieneData {}", partnerDateWiseData.values());
31206 tejbeer 4417
 
31697 amit.gupta 4418
            boolean partnerDateWise = partnerDateWiseData.values().stream().allMatch(Objects::isNull);
31206 tejbeer 4419
 
31697 amit.gupta 4420
            boolean partnerYearMonth = partnerYearMonthData.values().stream().allMatch(Objects::isNull);
31206 tejbeer 4421
 
31697 amit.gupta 4422
            if (!partnerDateWise && !partnerYearMonth) {
4423
                String sb = this.getMessageHygieneAlertForPartner(partnerYearMonthData, partnerDateWiseData);
32350 amit.gupta 4424
                this.sendMailOfHtmlFormat(googleMailSender, new String[]{email}, sb, null, subject);
31697 amit.gupta 4425
            }
31206 tejbeer 4426
 
31697 amit.gupta 4427
        }
31206 tejbeer 4428
 
31697 amit.gupta 4429
    }
31206 tejbeer 4430
 
31697 amit.gupta 4431
    private String getMessageHygieneAlertForPartner(
33256 amit.gupta 4432
            Map<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthData, Map<Integer, Map<LocalDate, List<HygieneData>>> partnerDateWiseData)
4433
            throws ProfitMandiBusinessException {
31206 tejbeer 4434
 
31697 amit.gupta 4435
        Map<Integer, CustomRetailer> customeRetailerMap = retailerService.getAllFofoRetailers();
31206 tejbeer 4436
 
31697 amit.gupta 4437
        LocalDateTime startDate = LocalDate.now().withDayOfMonth(1).atStartOfDay();
4438
        LocalDateTime endDate = LocalDateTime.now();
31206 tejbeer 4439
 
31697 amit.gupta 4440
        LocalDateTime startYearMonth = LocalDate.now().withDayOfMonth(1).minusMonths(3).atStartOfDay();
31886 tejbeer 4441
        LocalDateTime endYearMonth = LocalDate.now().minusMonths(1).withDayOfMonth(LocalDate.now().minusMonths(1).lengthOfMonth()).atTime(LocalTime.MAX);
31206 tejbeer 4442
 
31697 amit.gupta 4443
        DateTimeFormatter dateYearMonthFormatter = DateTimeFormatter.ofPattern("MMM''uu");
31206 tejbeer 4444
 
31697 amit.gupta 4445
        List<YearMonth> yearMonthRange = new ArrayList<>();
4446
        yearMonthRange.add(YearMonth.from(startYearMonth));
31206 tejbeer 4447
 
31697 amit.gupta 4448
        yearMonthRange.add(YearMonth.from(startYearMonth.plusMonths(1)));
31206 tejbeer 4449
 
31697 amit.gupta 4450
        yearMonthRange.add(YearMonth.from(endYearMonth));
31206 tejbeer 4451
 
31697 amit.gupta 4452
        long noOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate.plusDays(1));
31206 tejbeer 4453
 
31886 tejbeer 4454
        List<LocalDate> dateRange = Stream.iterate(startDate.toLocalDate(), date -> date.plusDays(1)).limit(noOfDaysBetween).collect(Collectors.toList());
31206 tejbeer 4455
 
31697 amit.gupta 4456
        StringBuilder sb = new StringBuilder();
31886 tejbeer 4457
        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 4458
 
31697 amit.gupta 4459
                + "<table style='border:1px solid black ;padding: 5px';>");
4460
        sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4461
        sb.append("<th style='border:1px solid black;padding: 5px'>Partner Name</th>\n");
31206 tejbeer 4462
 
31697 amit.gupta 4463
        for (YearMonth yearMonth : yearMonthRange) {
31886 tejbeer 4464
            sb.append("<th style='border:1px solid black;padding: 5px'>" + yearMonth.format(dateYearMonthFormatter) + "</th>\n");
31697 amit.gupta 4465
        }
31206 tejbeer 4466
 
31697 amit.gupta 4467
        for (LocalDate localDate : dateRange) {
4468
            sb.append("<th style='border:1px solid black;padding: 5px'>" + localDate + "</th>\n");
4469
        }
31206 tejbeer 4470
 
31697 amit.gupta 4471
        sb.append("</tr>\n");
31206 tejbeer 4472
 
31886 tejbeer 4473
        for (Entry<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthEntry : partnerYearMonthData.entrySet()) {
31206 tejbeer 4474
 
31697 amit.gupta 4475
            int fofoId = partnerYearMonthEntry.getKey();
31206 tejbeer 4476
 
31697 amit.gupta 4477
            Map<YearMonth, List<HygieneData>> yearMonthData = partnerYearMonthEntry.getValue();
31206 tejbeer 4478
 
31697 amit.gupta 4479
            Map<LocalDate, List<HygieneData>> dateWiseData = partnerDateWiseData.get(fofoId);
31206 tejbeer 4480
 
31697 amit.gupta 4481
            if (yearMonthData == null && dateWiseData == null) {
4482
                continue;
4483
            }
31206 tejbeer 4484
 
31697 amit.gupta 4485
            sb.append("<tr>");
31886 tejbeer 4486
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customeRetailerMap.get(fofoId).getBusinessName() + "</td>\n");
31697 amit.gupta 4487
            for (YearMonth yearMonth : yearMonthRange) {
31206 tejbeer 4488
 
31697 amit.gupta 4489
                if (yearMonthData == null) {
4490
                    sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4491
 
31697 amit.gupta 4492
                } else {
4493
                    List<HygieneData> hygieneList = yearMonthData.get(yearMonth);
31206 tejbeer 4494
 
31697 amit.gupta 4495
                    if (hygieneList != null) {
4496
                        sb.append("<td style='border:1px solid black;padding: 5px'>" + hygieneList.size() + "</td>\n");
31206 tejbeer 4497
 
31697 amit.gupta 4498
                    } else {
4499
                        sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4500
 
31697 amit.gupta 4501
                    }
4502
                }
4503
            }
31206 tejbeer 4504
 
31697 amit.gupta 4505
            for (LocalDate localDate : dateRange) {
31206 tejbeer 4506
 
31697 amit.gupta 4507
                if (dateWiseData == null) {
4508
                    sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4509
 
31697 amit.gupta 4510
                } else {
4511
                    List<HygieneData> hygieneList = dateWiseData.get(localDate);
31206 tejbeer 4512
 
31697 amit.gupta 4513
                    if (hygieneList != null) {
4514
                        sb.append("<td style='border:1px solid black;padding: 5px'>" + hygieneList.size() + "</td>\n");
31218 tejbeer 4515
 
31697 amit.gupta 4516
                    } else {
4517
                        sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31218 tejbeer 4518
 
31697 amit.gupta 4519
                    }
4520
                }
4521
            }
4522
            sb.append("</tr>");
31218 tejbeer 4523
 
31697 amit.gupta 4524
        }
31218 tejbeer 4525
 
31697 amit.gupta 4526
        sb.append("</tbody></table></body></html>");
31218 tejbeer 4527
 
31697 amit.gupta 4528
        return sb.toString();
4529
    }
31218 tejbeer 4530
 
31697 amit.gupta 4531
    @Autowired
4532
    private MonthlyTargetRepository monthlyTargetRepository;
31218 tejbeer 4533
 
31697 amit.gupta 4534
    public void monthlyTargetForPartner() throws MessagingException, ProfitMandiBusinessException, IOException {
31218 tejbeer 4535
 
31697 amit.gupta 4536
        LocalDateTime curDate = LocalDateTime.now();
4537
        List<MonthlyTarget> monthlyTargets = monthlyTargetRepository.selectByDate(YearMonth.now());
31218 tejbeer 4538
 
31886 tejbeer 4539
        Map<Integer, MonthlyTarget> partnersMonthlyTarget = monthlyTargets.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31218 tejbeer 4540
 
31886 tejbeer 4541
        Map<Integer, Double> secondaryMtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
4542
        Map<Integer, Double> todaytertiary = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate, curDate.with(LocalTime.MAX), 0, false);
31218 tejbeer 4543
 
31697 amit.gupta 4544
        String subject = "Monthly Target Vs Achievement";
31218 tejbeer 4545
 
31697 amit.gupta 4546
        for (Entry<Integer, MonthlyTarget> partnerMonthlyTargetEntry : partnersMonthlyTarget.entrySet()) {
31249 tejbeer 4547
 
31697 amit.gupta 4548
            int fofoId = partnerMonthlyTargetEntry.getKey();
31249 tejbeer 4549
 
31697 amit.gupta 4550
            CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
31249 tejbeer 4551
 
31697 amit.gupta 4552
            Double purchaseTarget = partnerMonthlyTargetEntry.getValue().getPurchaseTarget();
31218 tejbeer 4553
 
31697 amit.gupta 4554
            Double saleTarget = partnerMonthlyTargetEntry.getValue().getSaleTarget();
31218 tejbeer 4555
 
31697 amit.gupta 4556
            if (purchaseTarget > 0) {
4557
                Double purchase = secondaryMtd.get(fofoId);
31249 tejbeer 4558
 
31697 amit.gupta 4559
                if (purchase == null) {
4560
                    purchase = 0.0;
4561
                }
31218 tejbeer 4562
 
31697 amit.gupta 4563
                Double balanceTarget = purchaseTarget - purchase;
31218 tejbeer 4564
 
31697 amit.gupta 4565
                if (balanceTarget <= 0) {
4566
                    balanceTarget = 0.0;
4567
                }
31651 tejbeer 4568
 
31697 amit.gupta 4569
                StringBuilder sb = new StringBuilder();
4570
                sb.append("<html><body><p>Dear Partner,\n");
31886 tejbeer 4571
                sb.append("<p>Pls note your agreed monthly target is Rs." + purchaseTarget + " and your achievement till date is Rs." + purchase + "</p>");
31697 amit.gupta 4572
                sb.append("<p>Pls note that your balance target is Rs." + balanceTarget + "</p>\n");
4573
                sb.append(
32350 amit.gupta 4574
                        "<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 4575
 
32350 amit.gupta 4576
                this.sendMailOfHtmlFormat(mailSender, new String[]{customRetailer.getEmail()}, sb.toString(), null, subject);
31697 amit.gupta 4577
            }
31218 tejbeer 4578
 
31697 amit.gupta 4579
        }
31218 tejbeer 4580
 
31697 amit.gupta 4581
    }
31218 tejbeer 4582
 
33444 ranu 4583
 
4584
    public void findAllLiveDemoBrandItemsByBillingDate() throws MessagingException, ProfitMandiBusinessException, IOException {
4585
        LocalDateTime endDate = LocalDate.now().atStartOfDay().minusDays(8);
4586
 
4587
        List<LiveDemoOrderLineItemModel> liveDemoOrderLineItemModels = orderRepository.findAllLiveDemoBrandItemsByBillingDate(endDate.minusDays(60), endDate);
4588
        LOGGER.info("liveDemoOrderLineItemModels {}", liveDemoOrderLineItemModels);
4589
        String subject = "Billed Live Demo Model";
4590
        StringBuilder sb = new StringBuilder();
4591
 
4592
        sb.append("<html><body><p>Hi,\n");
4593
        sb.append("<p>Please check live demo billed order :</p>\n" + " <table style='border:1px solid black ;padding: 5px; border-collapse: collapse;'>");
4594
 
4595
        sb.append("<th style='border:1px solid black;padding: 5px'>Item Id</th>\n");
4596
        sb.append("<th style='border:1px solid black;padding: 5px'>Invoice Number</th>\n");
4597
        sb.append("<th style='border:1px solid black;padding: 5px'>Brand</th>\n");
4598
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Number</th>\n");
4599
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Name</th>\n");
4600
        sb.append("<th style='border:1px solid black;padding: 5px'>Serial Number</th>\n");
4601
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer Name</th>\n");
4602
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer City</th>\n");
4603
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer Pincode</th>\n");
4604
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer State</th>\n");
4605
        sb.append("<th style='border:1px solid black;padding: 5px'>Billing Date</th>\n");
4606
        sb.append("</tr>\n");
4607
        for (LiveDemoOrderLineItemModel liveDemoModel : liveDemoOrderLineItemModels) {
4608
            sb.append("<tr>");
4609
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getItemId() + "</td>\n");
4610
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getInvoiceNumber() + "</td>\n");
4611
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getBrand() + "</td>\n");
4612
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getModelNumber() + "</td>\n");
4613
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getModelName() + "</td>\n");
4614
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getSerialNumber() + "</td>\n");
4615
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getRetailerName() + "</td>\n");
4616
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getRetailerCity() + "</td>\n");
4617
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getRetailerPincode() + "</td>\n");
4618
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getState() + "</td>\n");
4619
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getFormattedBillingDate() + "</td>\n");
4620
 
4621
            sb.append("</tr>\n");
4622
 
33506 amit.gupta 4623
        }
33444 ranu 4624
        List<String> sendTo = Arrays.asList("kamini.sharma@smartdukaan.com", "niranjan.kala@smartdukaan.com",
33506 amit.gupta 4625
                "mohit.gulati@smartdukaan.com", "vinay.p@smartdukaan.com", "shivam.gupta@smartdukaan.com");
33444 ranu 4626
 
4627
 
4628
        String[] email = sendTo.toArray(new String[sendTo.size()]);
4629
        this.sendMailOfHtmlFormat(mailSender, email, sb.toString(), null, subject);
4630
 
4631
    }
4632
 
33464 ranu 4633
    public void findTodayPocoBillingItems() throws MessagingException, ProfitMandiBusinessException, IOException {
4634
        LocalDateTime endDate = LocalDate.now().atStartOfDay().plusDays(1);
4635
        LocalDateTime startDate = LocalDate.now().atStartOfDay().minusDays(1);
33444 ranu 4636
 
33464 ranu 4637
        List<LiveDemoOrderLineItemModel> pocoBillingOrderLineItemModels = orderRepository.findTodayPocoBillingItems(startDate, endDate);
4638
        LOGGER.info("pocoBillingOrderLineItemModels {}", pocoBillingOrderLineItemModels);
4639
        String subject = "Poco Billing";
4640
        StringBuilder sb = new StringBuilder();
4641
 
4642
        sb.append("<html><body><p>Hi,\n");
4643
        sb.append("<p>Please check poco billed order :</p>\n" + " <table style='border:1px solid black ;padding: 5px; border-collapse: collapse;'>");
4644
 
4645
        sb.append("<th style='border:1px solid black;padding: 5px'>Brand</th>\n");
4646
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Number</th>\n");
4647
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Name</th>\n");
4648
        sb.append("<th style='border:1px solid black;padding: 5px'>Serial Number</th>\n");
4649
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer State</th>\n");
4650
        sb.append("<th style='border:1px solid black;padding: 5px'>Billing Date</th>\n");
4651
        sb.append("</tr>\n");
4652
        for (LiveDemoOrderLineItemModel pocoModel : pocoBillingOrderLineItemModels) {
4653
            sb.append("<tr>");
4654
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getBrand() + "</td>\n");
4655
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getModelNumber() + "</td>\n");
4656
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getModelName() + "</td>\n");
4657
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getSerialNumber() + "</td>\n");
4658
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getState() + "</td>\n");
4659
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getFormattedBillingDate() + "</td>\n");
4660
 
4661
            sb.append("</tr>\n");
4662
 
33506 amit.gupta 4663
        }
33664 amit.gupta 4664
        List<String> sendTo = Arrays.asList("uday.singh@smartdukaan.com", "kuldeep.kumar@smartdukaan.com", "nishant.ohri@smartdukaan.com", "ritesh.chauhan1@smartdukaan.com");
33464 ranu 4665
 
4666
        String[] email = sendTo.toArray(new String[sendTo.size()]);
4667
        this.sendMailOfHtmlFormat(mailSender, email, sb.toString(), null, subject);
4668
 
4669
    }
4670
 
4671
 
31697 amit.gupta 4672
    public void monthlyTargetForInternalTeam() throws MessagingException, ProfitMandiBusinessException, IOException {
31218 tejbeer 4673
 
31697 amit.gupta 4674
        LocalDateTime curDate = LocalDateTime.now();
31218 tejbeer 4675
 
31886 tejbeer 4676
        List<Integer> categoryIds = Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_CATEGORY, ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_MARKETING, ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS, ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT);
31218 tejbeer 4677
 
31697 amit.gupta 4678
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false);
31218 tejbeer 4679
 
31697 amit.gupta 4680
        List<MonthlyTarget> monthlyTargets = monthlyTargetRepository.selectByDate(YearMonth.now());
31218 tejbeer 4681
 
31697 amit.gupta 4682
        Map<Integer, CustomRetailer> customeRetailerMap = retailerService.getAllFofoRetailers();
31218 tejbeer 4683
 
31886 tejbeer 4684
        Map<Integer, MonthlyTarget> partnersMonthlyTarget = monthlyTargets.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31218 tejbeer 4685
 
31886 tejbeer 4686
        Map<Integer, Double> secondaryMtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
4687
        Map<Integer, Double> todaytertiary = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate, curDate.with(LocalTime.MAX), 0, false);
31218 tejbeer 4688
 
31697 amit.gupta 4689
        String subject = "Monthly Target Vs Achievement";
31218 tejbeer 4690
 
31697 amit.gupta 4691
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
31218 tejbeer 4692
 
31697 amit.gupta 4693
            String email = storeGuyEntry.getKey();
31218 tejbeer 4694
 
31697 amit.gupta 4695
            List<Integer> fofoIds = new ArrayList<>(storeGuyEntry.getValue());
4696
            Map<Integer, MonthlyTarget> monthlyTargetAchievement = new HashMap<>();
4697
            for (Integer fofoId : fofoIds) {
31218 tejbeer 4698
 
31697 amit.gupta 4699
                MonthlyTarget monthlyTarget = partnersMonthlyTarget.get(fofoId);
4700
                if (monthlyTarget != null) {
4701
                    Double purchaseTarget = monthlyTarget.getPurchaseTarget();
31218 tejbeer 4702
 
31697 amit.gupta 4703
                    Double saleTarget = monthlyTarget.getSaleTarget();
31218 tejbeer 4704
 
31697 amit.gupta 4705
                    if (purchaseTarget != null && purchaseTarget > 0) {
4706
                        Double purchase = secondaryMtd.get(fofoId);
4707
                        if (purchase == null) {
4708
                            purchase = 0.0;
4709
                        }
4710
                        monthlyTarget.setPurchaseAchievement(purchase);
4711
                        monthlyTargetAchievement.put(fofoId, monthlyTarget);
31218 tejbeer 4712
 
31697 amit.gupta 4713
                    }
4714
                }
4715
            }
31218 tejbeer 4716
 
31697 amit.gupta 4717
            if (!monthlyTargetAchievement.isEmpty()) {
31218 tejbeer 4718
 
31697 amit.gupta 4719
                StringBuilder sb = new StringBuilder();
31218 tejbeer 4720
 
31697 amit.gupta 4721
                sb.append("<html><body><p>Hi,\n");
31886 tejbeer 4722
                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 4723
                sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4724
                sb.append("<th style='border:1px solid black;padding: 5px'>Partner Name</th>\n");
31218 tejbeer 4725
 
31697 amit.gupta 4726
                sb.append("<th style='border:1px solid black;padding: 5px'>Purchase Target</th>\n");
31218 tejbeer 4727
 
31697 amit.gupta 4728
                sb.append("<th style='border:1px solid black;padding: 5px'>Purchase Achievement</th>\n");
4729
                sb.append("</tr>\n");
31218 tejbeer 4730
 
31886 tejbeer 4731
                for (Entry<Integer, MonthlyTarget> monthlyTargetAchievementEntry : monthlyTargetAchievement.entrySet()) {
31697 amit.gupta 4732
                    sb.append("<tr>");
4733
                    int fofoId = monthlyTargetAchievementEntry.getKey();
31218 tejbeer 4734
 
31697 amit.gupta 4735
                    MonthlyTarget monthlyTarget = monthlyTargetAchievementEntry.getValue();
31886 tejbeer 4736
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customeRetailerMap.get(fofoId).getBusinessName() + "</td>\n");
31218 tejbeer 4737
 
31886 tejbeer 4738
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + monthlyTarget.getPurchaseTarget() + "</td>\n");
31218 tejbeer 4739
 
31886 tejbeer 4740
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + monthlyTarget.getPurchaseAchievement() + "</td>\n");
31218 tejbeer 4741
 
31697 amit.gupta 4742
                    sb.append("</tr>\n");
31218 tejbeer 4743
 
31697 amit.gupta 4744
                }
31218 tejbeer 4745
 
32350 amit.gupta 4746
                this.sendMailOfHtmlFormat(googleMailSender, new String[]{email}, sb.toString(), null, subject);
31697 amit.gupta 4747
                // this.sendMailOfHtmlFormat("tejbeer.kaur@smartdukaan.com", sb.toString(),
4748
                // null, subject);
31218 tejbeer 4749
 
31697 amit.gupta 4750
            }
31604 tejbeer 4751
 
31697 amit.gupta 4752
        }
31604 tejbeer 4753
 
31697 amit.gupta 4754
    }
31604 tejbeer 4755
 
32061 amit.gupta 4756
    @Autowired
4757
    private PerformanceService performanceService;
4758
 
4759
 
4760
    public void sendFilteredRetailerPerformance() throws Exception {
4761
        RetailerFilterModel retailerFilterModel = performanceService.getRetailerFilterModel();
4762
 
4763
        Map<Integer, CustomRetailer> customRetailers = retailerService.getFofoRetailers(true);
4764
 
4765
 
4766
        List<RetailerPeformanceFilterModel> partnersPerformance = performanceService.getPerformance(retailerFilterModel, customRetailers);
4767
 
4768
        Map<Integer, RetailerPeformanceFilterModel> partnersPerformanceMap = new HashMap<>();
4769
 
4770
        if (!partnersPerformance.isEmpty()) {
4771
            partnersPerformanceMap = partnersPerformance.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
4772
            performanceService.sendPartnerPerformanceEmail(partnersPerformanceMap, retailerFilterModel, customRetailers);
4773
 
4774
        }
4775
 
4776
 
4777
    }
4778
 
32081 tejbeer 4779
    @Autowired
4780
    private VendorItemPricingRepository vendorItemPricingRepository;
32061 amit.gupta 4781
 
32081 tejbeer 4782
 
4783
    @Autowired
4784
    private VendorCatalogPricingService vendorCatalogPricingService;
4785
 
4786
 
33256 amit.gupta 4787
    public void migrateVendorItemPricing() throws ProfitMandiBusinessException {
32081 tejbeer 4788
 
4789
        List<VendorItemPricing> vendorItemPricings = vendorItemPricingRepository.selectAll();
32350 amit.gupta 4790
        LOGGER.info("At migrate VendorItemPricing");
32092 tejbeer 4791
        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 4792
        for (VendorItemPricing vendorItemPricing : vendorItemPricings) {
4793
            Item item = null;
32092 tejbeer 4794
            if (items.get(vendorItemPricing.getItemId()) != null) {
4795
                item = items.get(vendorItemPricing.getItemId());
4796
            } else {
32084 tejbeer 4797
                continue;
32081 tejbeer 4798
            }
32092 tejbeer 4799
 
32081 tejbeer 4800
            VendorCatalogPricingModel vendorCatalogPricingModel = new VendorCatalogPricingModel();
4801
            vendorCatalogPricingModel.setCatalogId(item.getCatalogItemId());
4802
            vendorCatalogPricingModel.setAuthId(13);
32088 tejbeer 4803
            vendorCatalogPricingModel.setDp(vendorItemPricing.getDp());
32081 tejbeer 4804
 
4805
            vendorCatalogPricingModel.setTp(vendorItemPricing.getTp());
4806
            vendorCatalogPricingModel.setMop(vendorItemPricing.getMop());
32384 amit.gupta 4807
            vendorCatalogPricingModel.setEffectedOn(LocalDate.of(2023, 8, 22));
32081 tejbeer 4808
            vendorCatalogPricingModel.setVendorId(vendorItemPricing.getVendorId());
4809
 
4810
 
4811
            try {
4812
                vendorCatalogPricingService.createVendorCatalogPricingLog(vendorCatalogPricingModel);
4813
            } catch (ProfitMandiBusinessException e) {
4814
                continue;
4815
            }
4816
 
4817
        }
4818
 
4819
    }
4820
 
4821
    public void approveVendorCatalogPricing() {
4822
        List<VendorCatalogPricingLog> vendorCatalogPricingLogs = vendorCatalogPricingLogRepository.selectByStatus(VendorCatalogPricingStatus.PENDING);
4823
 
32084 tejbeer 4824
 
32081 tejbeer 4825
        for (VendorCatalogPricingLog vendorCatalogPricingLog : vendorCatalogPricingLogs) {
32107 tejbeer 4826
            vendorCatalogPricingLog.setStatus(VendorCatalogPricingStatus.APPROVED);
4827
            vendorCatalogPricingLog.setUpdatedTimestamp(LocalDateTime.now());
4828
            vendorCatalogPricingLog.setApprovedBy(13);
4829
            vendorCatalogPricingLog.setApprovedTimestamp(LocalDateTime.now());
32114 tejbeer 4830
            vendorCatalogPricingService.createVendorCatalogPricing(vendorCatalogPricingLog);
4831
        }
32081 tejbeer 4832
 
32114 tejbeer 4833
    }
32108 tejbeer 4834
 
32822 ranu 4835
    public void sendMailWhatsAppAfterLoanDueDate() throws Exception {
4836
        sdCreditService.updateRisk();
4837
        List<Loan> defaultLoans = sdCreditService.getLoanALert();
4838
        if (!defaultLoans.isEmpty()) {
4839
            this.sendLoanAlert(defaultLoans);
4840
        }
32108 tejbeer 4841
 
32822 ranu 4842
 
4843
    }
4844
 
4845
    public void sendLoanAlert(List<Loan> defaultLoans) throws
4846
            Exception {
4847
 
4848
        List<Integer> categoryIds = Arrays.asList(
4849
                ProfitMandiConstants.TICKET_CATEGORY_CATEGORY,
4850
                ProfitMandiConstants.TICKET_CATEGORY_RBM,
4851
                ProfitMandiConstants.TICKET_CATEGORY_SALES,
4852
                ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS,
4853
                ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT);
4854
 
4855
        /*for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false).entrySet()) {
4856
            List<Loan> filteredRows = defaultLoans.stream()
4857
                    .filter(loan -> storeGuyEntry.getValue().contains(loan.getFofoId()))
4858
                    .collect(Collectors.toList());
4859
 
4860
            if (!filteredRows.isEmpty()) {
4861
                for (Loan defaultLoan : filteredRows) {
4862
                    List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
4863
                    double amount = loanStatements.stream().map(LoanStatement::getAmount).collect(Collectors.summingDouble(BigDecimal::doubleValue));
4864
                    String messageText = getMessageForDueDateExtend(defaultLoan,amount);
4865
                   // String[] email = new String[]{storeGuyEntry.getKey()};
33820 ranu 4866
 
32822 ranu 4867
                    sendMailOfHtmlFormat(mailSender, email, messageText, null, subject);
4868
 
4869
                }
4870
            }
4871
        }*/
32842 amit.gupta 4872
        //Send single whatsapp to tv
4873
        String title = "SD Credit Alert!";
32850 amit.gupta 4874
        boolean notYetSent = true;
32822 ranu 4875
        for (Loan defaultLoan : defaultLoans) {
4876
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
4877
 
4878
            double amount = loanStatements.stream().map(LoanStatement::getAmount).collect(Collectors.summingDouble(BigDecimal::doubleValue));
4879
 
4880
            com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(defaultLoan.getFofoId());
4881
 
4882
            Address address = addressRepository.selectById(user.getAddressId());
4883
 
32842 amit.gupta 4884
            //String url = "http://app.smartdukaan.com/pages/home/credit";
32822 ranu 4885
 
32842 amit.gupta 4886
            String message = getMessageForDueDateExtend(defaultLoan, amount);
4887
            String whatsAppMessage = getWhatsAppMessageForDueDateExtend(defaultLoan, amount);
32948 amit.gupta 4888
            if (whatsAppMessage != null) {
32850 amit.gupta 4889
                notificationService.sendWhatsappMessage(whatsAppMessage, title, address.getPhoneNumber());
32948 amit.gupta 4890
                if (notYetSent) {
32850 amit.gupta 4891
                    notificationService.sendWhatsappMessage(whatsAppMessage, title, "9911565032");
4892
                    notYetSent = false;
4893
                }
4894
            }
4895
 
32822 ranu 4896
            String[] email = {user.getEmailId()};
4897
            sendMailOfHtmlFormat(mailSender, email, message, null, "Loan Alert - SmartDukaan");
4898
        }
4899
    }
4900
 
4901
    private String getMessageForDueDateExtend(Loan defaultLoan, double amount) throws ProfitMandiBusinessException {
4902
 
4903
        double absoluteAmount = Math.abs(amount);
4904
        long roundedAmount = Math.round(absoluteAmount);
4905
        String formattedAmount = (amount < 0) ? "" + roundedAmount : "" + roundedAmount;
4906
 
4907
        LocalDate dueDate = defaultLoan.getDueDate().toLocalDate();
4908
        LocalDate defaultDate = defaultLoan.getDueDate().toLocalDate().plusDays(15);
4909
 
4910
        // Retrieve the name of the user associated with the loan
4911
        String name = userUserRepository.selectById(defaultLoan.getFofoId()).getName();
4912
 
4913
        // Initialize a StringBuilder to construct the HTML message
4914
        StringBuilder sb = new StringBuilder();
4915
 
32842 amit.gupta 4916
        if (LocalDate.now().isBefore(dueDate)) {
4917
            long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), defaultLoan.getDueDate().toLocalDate());
32822 ranu 4918
            String payDate = defaultLoan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
4919
            // 5 Days Before Due Date - daily
4920
            if (noOfdaysBetween <= 5) {
4921
                sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br><p>Dear " + name + "</p>");
4922
                sb.append("<p>This is a friendly reminder that your loan payment is due in " + noOfdaysBetween + "days, on " +
4923
                        payDate +
4924
                        ". Please ensure that the payment is made on time to avoid any late fees or penalties.</p>");
4925
                sb.append("<p>As per the terms of your loan agreement, the total amount due is Rs. " + formattedAmount + ". " +
4926
                        "You can make the payment by adding money to your wallet. If you have any questions or need assistance, " +
4927
                        "our customer service team is available to help you.</p>");
4928
                sb.append("<p>Thank you for your cooperation and prompt attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
4929
            }
32842 amit.gupta 4930
        } else if (LocalDate.now().isBefore(defaultDate)) {
32822 ranu 4931
            long noOfdaysBetween = ChronoUnit.DAYS.between(defaultDate, LocalDate.now());
4932
 
4933
            // After Due Date – Alternate days
4934
            if ((noOfdaysBetween % 2 == 0) && (noOfdaysBetween > 5)) {
4935
                sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br><p>Dear " + name + "</p>");
4936
                sb.append("<p>We would like to remind you that your payment for the outstanding balance on your account is now overdue. " +
4937
                        "As per our terms and conditions, a higher interest rate will be levied on the overdue amount Rs. " + formattedAmount + ".</p>");
4938
                sb.append("<p>To avoid further charges and any negative impact on your CIBIL score, we kindly request that you settle the " +
4939
                        "outstanding balance as soon as possible.</p>");
4940
                sb.append("<p>Thank you for your attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
4941
            }
4942
            // 5 Days before default - daily
32842 amit.gupta 4943
            if (noOfdaysBetween <= 5) {
32822 ranu 4944
                sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br>");
4945
                sb.append("<p>Attention: High Alert</p>");
4946
                sb.append("<p>Dear " + name + "</p>");
4947
                sb.append("<p>This is to inform you that the due date for your payment of Rs. " + formattedAmount + " has been crossed, " +
4948
                        "and you are approaching the default date on " + defaultDate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")) + ". " +
4949
                        "Please be aware that this will have a significant impact on your CIBIL score and may result in substantial penalties as well.</p>");
4950
                sb.append("<p>To rectify this situation, it is imperative that you take immediate action. " +
4951
                        "Please make the necessary payment immediately to avoid further consequences.</p>");
4952
                sb.append("<p>Thank you for your attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
4953
            }
32842 amit.gupta 4954
        } else {
32822 ranu 4955
            // Post Default - Daily
32842 amit.gupta 4956
            sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br><p>Dear " + name + "</p>");
4957
            sb.append("<p>We regret to inform you that you are currently in loan default. As a result, " +
4958
                    "higher penalties are being charged, which is also negatively impacting your CIBIL score. " +
4959
                    "It is imperative that you make an immediate payment to rectify this situation.</p>");
4960
            sb.append("<p>Please note that failing to make the payment promptly will result in further consequences, " +
4961
                    "including potential legal action and additional financial penalties. " +
4962
                    "We strongly urge you to take this matter seriously and settle the outstanding amount as soon as possible.</p>");
4963
            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>");
4964
            sb.append("<p>Thank you for your attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
32822 ranu 4965
 
4966
        }
4967
 
4968
        // Return the constructed HTML message
4969
        sb.append("</body></html>");
4970
        return sb.toString();
4971
    }
4972
 
4973
    private String getWhatsAppMessageForDueDateExtend(Loan defaultLoan, double amount) throws ProfitMandiBusinessException {
4974
 
4975
        double absoluteAmount = Math.abs(amount);
4976
        long roundedAmount = Math.round(absoluteAmount);
4977
        String formattedAmount = (amount < 0) ? "" + roundedAmount : "" + roundedAmount;
4978
 
4979
        LocalDate dueDate = defaultLoan.getDueDate().toLocalDate();
4980
        LocalDate defaultDate = defaultLoan.getDueDate().toLocalDate().plusDays(15);
4981
 
4982
        // Retrieve the name of the user associated with the loan
4983
        String name = userUserRepository.selectById(defaultLoan.getFofoId()).getName();
4984
 
4985
        // Initialize a StringBuilder to construct the HTML message
4986
        String message = null;
4987
 
32842 amit.gupta 4988
        if (LocalDate.now().isBefore(dueDate)) {
32822 ranu 4989
            long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), defaultLoan.getDueDate().toLocalDate());
4990
            String payDate = defaultLoan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
4991
            // 5 Days Before Due Date - daily
4992
            if (noOfdaysBetween <= 5) {
4993
 
4994
                message = "Dear %s, This is a friendly reminder that your loan payment is due in %d days, on %s.\n" +
4995
                        "\n" +
4996
                        "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" +
4997
                        "\n" +
4998
                        "If you have any questions or need assistance, our customer service team is available to help you.\n" +
4999
                        "Thank you for your cooperation and prompt attention to this matter.\n" +
5000
                        "\n" +
5001
                        "Team SmartDukaan";
32842 amit.gupta 5002
                message = String.format(message, name, noOfdaysBetween, payDate, formattedAmount);
5003
            }
5004
        } else if (LocalDate.now().isBefore(defaultDate)) {
32822 ranu 5005
            long noOfdaysBetween = ChronoUnit.DAYS.between(defaultDate, LocalDate.now());
5006
            // After Due Date – Alternate days
5007
            if ((noOfdaysBetween % 2 == 0) && (noOfdaysBetween > 5)) {
5008
                message = "Dear %s, We would like to remind you that your payment for the outstanding balance on your account is now overdue. \n" +
5009
                        "As per our terms and conditions, a higher interest rate will be levied on the overdue amount Rs.%s.\n" +
5010
                        "To avoid further charges and any negative impact on your CIBIL score, we kindly request that you settle the outstanding balance as soon as possible.\n" +
5011
                        "Thank you for your attention to this matter. \n" +
5012
                        "\n" +
5013
                        "Team SmartDukaan";
5014
                message = String.format(message, name, formattedAmount);
5015
            }
5016
            // 5 Days before default - daily
32842 amit.gupta 5017
            if (noOfdaysBetween <= 5) {
32822 ranu 5018
                String defaultPayDate = defaultDate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
5019
                message = "Attention: High Alert!! Dear %s, \n" +
5020
                        "\n" +
5021
                        "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" +
5022
                        "Please be aware that this will have a significant impact on your CIBIL score and may result in substantial penalties as well. To rectify this situation, it is imperative that you take immediate action.\n" +
5023
                        "\n" +
5024
                        "Please make the necessary payment immediately to avoid further consequences. Thank you for your attention to this matter.\n" +
5025
                        "\n" +
5026
                        "Team SmartDukaan";
5027
                message = String.format(message, name, formattedAmount, defaultPayDate);
5028
            }
32842 amit.gupta 5029
        } else {
32822 ranu 5030
            // Post Default - Daily
5031
            message = "Dear %s, We regret to inform you that you are currently in loan default. As a result, higher penalties are being charged, which is also negatively impacting your CIBIL score. \n" +
5032
                    "\n" +
5033
                    "It is imperative that you make an immediate payment to rectify this situation. \n" +
5034
                    "\n" +
5035
                    "Please note that failing to make the payment promptly will result in further consequences, including potential legal action and additional financial penalties. \n" +
5036
                    "\n" +
5037
                    "We strongly urge you to take this matter seriously and settle the outstanding amount as soon as possible. \n" +
5038
                    "\n" +
5039
                    "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" +
5040
                    "\n" +
5041
                    "Team SmartDukaan";
5042
            message = String.format(message, name, formattedAmount);
5043
 
5044
        }
5045
        // Return the constructed HTML message
5046
        return message;
5047
    }
5048
 
32210 jai.hind 5049
}
33664 amit.gupta 5050
// 2284"