Subversion Repositories SmartDukaan

Rev

Rev 31328 | Rev 31388 | 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;
6
import com.smartdukaan.cron.itelImeiActivation.ItelImeiActivationService;
7
import com.smartdukaan.cron.itelImeiActivation.TecnoImeiActivation;
25721 tejbeer 8
import com.spice.profitmandi.common.enumuration.MessageType;
23724 amit.gupta 9
import com.spice.profitmandi.common.enumuration.RechargeStatus;
24681 amit.gupta 10
import com.spice.profitmandi.common.enumuration.ReporticoProject;
24121 govind 11
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
31123 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;
25590 amit.gupta 24
import com.spice.profitmandi.dao.entity.auth.AuthUser;
30421 tejbeer 25
import com.spice.profitmandi.dao.entity.auth.PartnerCollectionRemark;
25800 tejbeer 26
import com.spice.profitmandi.dao.entity.catalog.FocusedModel;
25609 amit.gupta 27
import com.spice.profitmandi.dao.entity.catalog.Item;
24590 amit.gupta 28
import com.spice.profitmandi.dao.entity.catalog.Scheme;
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;
31123 amit.gupta 32
import com.spice.profitmandi.dao.entity.dtr.*;
33
import com.spice.profitmandi.dao.entity.fofo.*;
30390 amit.gupta 34
import com.spice.profitmandi.dao.entity.inventory.ReporticoCacheTable;
27208 tejbeer 35
import com.spice.profitmandi.dao.entity.inventory.SaholicCIS;
36
import com.spice.profitmandi.dao.entity.inventory.SaholicPOItem;
31123 amit.gupta 37
import com.spice.profitmandi.dao.entity.transaction.*;
38
import com.spice.profitmandi.dao.entity.user.*;
30421 tejbeer 39
import com.spice.profitmandi.dao.enumuration.auth.CollectionRemark;
24250 amit.gupta 40
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
25598 amit.gupta 41
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
26790 tejbeer 42
import com.spice.profitmandi.dao.enumuration.dtr.RefferalStatus;
29814 tejbeer 43
import com.spice.profitmandi.dao.enumuration.fofo.Gateway;
31332 amit.gupta 44
import com.spice.profitmandi.dao.enumuration.fofo.PaymentStatus;
24242 amit.gupta 45
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
30913 tejbeer 46
import com.spice.profitmandi.dao.enumuration.transaction.CreditRisk;
30859 tejbeer 47
import com.spice.profitmandi.dao.enumuration.transaction.LoanReferenceType;
25609 amit.gupta 48
import com.spice.profitmandi.dao.enumuration.transaction.PriceDropImeiStatus;
30390 amit.gupta 49
import com.spice.profitmandi.dao.model.PartnerDetailModel;
25300 tejbeer 50
import com.spice.profitmandi.dao.model.SimpleCampaign;
51
import com.spice.profitmandi.dao.model.SimpleCampaignParams;
25590 amit.gupta 52
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
30421 tejbeer 53
import com.spice.profitmandi.dao.repository.auth.PartnerCollectionRemarkRepository;
31123 amit.gupta 54
import com.spice.profitmandi.dao.repository.catalog.*;
55
import com.spice.profitmandi.dao.repository.cs.*;
56
import com.spice.profitmandi.dao.repository.dtr.*;
57
import com.spice.profitmandi.dao.repository.fofo.*;
30390 amit.gupta 58
import com.spice.profitmandi.dao.repository.inventory.ReporticoCacheTableRepository;
28990 amit.gupta 59
import com.spice.profitmandi.dao.repository.inventory.StateRepository;
28775 amit.gupta 60
import com.spice.profitmandi.dao.repository.inventory.WarehouseRepository;
31123 amit.gupta 61
import com.spice.profitmandi.dao.repository.transaction.*;
24542 amit.gupta 62
import com.spice.profitmandi.dao.repository.user.AddressRepository;
25721 tejbeer 63
import com.spice.profitmandi.dao.repository.user.UserRepository;
25854 amit.gupta 64
import com.spice.profitmandi.service.NotificationService;
24337 amit.gupta 65
import com.spice.profitmandi.service.PartnerInvestmentService;
30390 amit.gupta 66
import com.spice.profitmandi.service.PartnerStatsService;
31332 amit.gupta 67
import com.spice.profitmandi.service.integrations.CCAvenuePaymentService;
28368 tejbeer 68
import com.spice.profitmandi.service.integrations.RazorpayPaymentService;
30858 amit.gupta 69
import com.spice.profitmandi.service.integrations.bharti.model.BAGInsuranceModel;
25694 amit.gupta 70
import com.spice.profitmandi.service.integrations.toffee.ToffeeService;
23929 amit.gupta 71
import com.spice.profitmandi.service.inventory.InventoryService;
27208 tejbeer 72
import com.spice.profitmandi.service.inventory.SaholicInventoryService;
25335 amit.gupta 73
import com.spice.profitmandi.service.order.OrderService;
24431 amit.gupta 74
import com.spice.profitmandi.service.pricing.PriceDropService;
23724 amit.gupta 75
import com.spice.profitmandi.service.recharge.provider.OxigenRechargeProviderService;
76
import com.spice.profitmandi.service.recharge.provider.ThinkWalnutDigitalRechargeProviderService;
77
import com.spice.profitmandi.service.scheme.SchemeService;
29668 tejbeer 78
import com.spice.profitmandi.service.serviceConfig.ServiceConfigService;
31008 amit.gupta 79
import com.spice.profitmandi.service.transaction.CreditNoteService;
30859 tejbeer 80
import com.spice.profitmandi.service.transaction.SDCreditService;
23929 amit.gupta 81
import com.spice.profitmandi.service.transaction.TransactionService;
82
import com.spice.profitmandi.service.user.RetailerService;
23739 amit.gupta 83
import com.spice.profitmandi.service.wallet.WalletService;
25721 tejbeer 84
import in.shop2020.model.v1.order.OrderStatus;
29308 tejbeer 85
import in.shop2020.model.v1.order.WalletReferenceType;
86
import okhttp3.OkHttpClient;
87
import okhttp3.Request;
30119 amit.gupta 88
import okhttp3.Response;
31123 amit.gupta 89
import org.apache.commons.io.output.ByteArrayOutputStream;
90
import org.apache.commons.lang.StringUtils;
91
import org.apache.http.client.methods.CloseableHttpResponse;
92
import org.apache.http.client.methods.HttpPost;
93
import org.apache.http.conn.HttpHostConnectException;
94
import org.apache.http.entity.StringEntity;
95
import org.apache.http.impl.client.CloseableHttpClient;
96
import org.apache.http.impl.client.HttpClients;
97
import org.apache.logging.log4j.LogManager;
98
import org.apache.logging.log4j.Logger;
99
import org.json.JSONArray;
100
import org.json.JSONObject;
101
import org.json.XML;
102
import org.springframework.beans.factory.annotation.Autowired;
103
import org.springframework.beans.factory.annotation.Qualifier;
104
import org.springframework.beans.factory.annotation.Value;
105
import org.springframework.core.io.ByteArrayResource;
106
import org.springframework.core.io.InputStreamSource;
107
import org.springframework.mail.javamail.JavaMailSender;
108
import org.springframework.mail.javamail.MimeMessageHelper;
109
import org.springframework.stereotype.Component;
110
import org.springframework.transaction.annotation.Transactional;
23739 amit.gupta 111
 
31123 amit.gupta 112
import javax.mail.MessagingException;
113
import javax.mail.internet.InternetAddress;
114
import javax.mail.internet.MimeMessage;
115
import java.io.*;
116
import java.math.BigDecimal;
117
import java.math.RoundingMode;
118
import java.nio.file.Files;
119
import java.nio.file.Paths;
120
import java.sql.Timestamp;
121
import java.text.DecimalFormat;
122
import java.time.*;
123
import java.time.format.DateTimeFormatter;
124
import java.time.temporal.ChronoField;
125
import java.time.temporal.ChronoUnit;
126
import java.util.*;
127
import java.util.Map.Entry;
128
import java.util.stream.Collectors;
31207 tejbeer 129
import java.util.stream.Stream;
31123 amit.gupta 130
 
23723 amit.gupta 131
@Component
23724 amit.gupta 132
@Transactional(rollbackFor = Throwable.class)
23723 amit.gupta 133
public class ScheduledTasks {
134
 
23724 amit.gupta 135
	@Value("${oxigen.recharge.transaction.url}")
136
	private String oxigenRechargeTransactionUrl;
23723 amit.gupta 137
 
23724 amit.gupta 138
	@Value("${oxigen.recharge.enquiry.url}")
139
	private String oxigenRechargeEnquiryUrl;
24533 govind 140
 
24431 amit.gupta 141
	@Autowired
27088 tejbeer 142
	private RegionRepository regionRepository;
29668 tejbeer 143
 
29488 manish 144
	@Autowired
29801 manish 145
	private ServiceConfigService serviceConfigService;
146
 
147
	@Autowired
29488 manish 148
	private TecnoImeiActivation tecnoImeiActivation;
28205 tejbeer 149
 
27795 amit.gupta 150
	private static final DateTimeFormatter leadTimeFormatter = DateTimeFormatter.ofPattern("d LLL, hh:mm a");
27088 tejbeer 151
 
152
	@Autowired
153
	private PartnerRegionRepository partnerRegionRepository;
28790 amit.gupta 154
 
28769 amit.gupta 155
	@Autowired
156
	private EmployeeAttendanceRepository employeeAttendanceRepository;
27088 tejbeer 157
 
158
	@Autowired
29451 manish 159
	VivoImeiActivationService vivoImeiActivationService;
29488 manish 160
 
29451 manish 161
	@Autowired
29488 manish 162
	ItelImeiActivationService itelImeiActivationService;
163
 
164
	@Autowired
25503 amit.gupta 165
	private PartnerTypeChangeService partnerTypeChangeService;
25598 amit.gupta 166
 
25590 amit.gupta 167
	@Autowired
26408 amit.gupta 168
	private ActivatedImeiRepository activatedImeiRepository;
169
 
170
	@Autowired
29451 manish 171
	private LineItemRepository lineItemRepository;
172
 
173
	@Autowired
25910 amit.gupta 174
	private LeadRepository leadRepository;
25927 amit.gupta 175
 
25910 amit.gupta 176
	@Autowired
25590 amit.gupta 177
	private AuthRepository authRepository;
25503 amit.gupta 178
 
179
	@Autowired
24431 amit.gupta 180
	private PriceDropService priceDropService;
26283 tejbeer 181
 
25590 amit.gupta 182
	@Autowired
25927 amit.gupta 183
	private FranchiseeVisitRepository franchiseeVisitRepository;
26790 tejbeer 184
 
25927 amit.gupta 185
	@Autowired
186
	private FranchiseeActivityRepository franchiseeActivityRepository;
26790 tejbeer 187
 
25927 amit.gupta 188
	@Autowired
25982 amit.gupta 189
	private HdfcPaymentRepository hdfcPaymentRepository;
26790 tejbeer 190
 
25982 amit.gupta 191
	@Autowired
25590 amit.gupta 192
	private CsService csService;
25846 amit.gupta 193
 
25837 amit.gupta 194
	@Autowired
27208 tejbeer 195
	private SaholicInventoryService saholicInventoryService;
196
 
197
	@Autowired
25837 amit.gupta 198
	private InsurancePolicyRepository insurancePolicyRepository;
23723 amit.gupta 199
 
25694 amit.gupta 200
	@Autowired
201
	private ToffeeService toffeeService;
202
 
23724 amit.gupta 203
	@Value("${oxigen.recharge.auth.key}")
204
	private String oxigenRechargeAuthKey;
205
 
206
	@Value("${oxigen.recharge.validation.url}")
207
	private String oxigenRechargeValidationUrl;
208
 
209
	@Value("${oxigen.recharge.validation.auth.key}")
210
	private String oxigenRechargeValidationAuthKey;
211
 
212
	@Value("${think.walnut.digital.recharge.transaction.mobile.url}")
213
	private String thinkWalnutDigitalRechargeTransactionMobileUrl;
214
 
215
	@Value("${think.walnut.digital.recharge.transaction.dth.url}")
216
	private String thinkWalnutDigitalRechargeTransactionDthUrl;
217
 
218
	@Value("${think.walnut.digital.recharge.enquiry.url}")
219
	private String thinkWalnutDigitalRechargeEnquiryUrl;
220
 
221
	@Value("${think.walnut.digital.recharge.balance.url}")
222
	private String thinkWalnutDigitalRechargeBalanceUrl;
223
 
224
	@Value("${think.walnut.digital.recharge.username}")
225
	private String thinkWalnutDigitalRechargeUserName;
226
 
227
	@Value("${think.walnut.digital.recharge.password}")
228
	private String thinkWalnutDigitalRechargePassword;
229
 
230
	@Value("${think.walnut.digital.recharge.auth.key}")
231
	private String thinkWalnutDigitalRechargeAuthKey;
232
 
23723 amit.gupta 233
	@Autowired
23724 amit.gupta 234
	private PurchaseRepository purchaseRepository;
235
 
236
	@Autowired
25609 amit.gupta 237
	private PriceDropIMEIRepository priceDropIMEIRepository;
238
 
239
	@Autowired
240
	PriceDropRepository priceDropRepository;
241
 
242
	@Autowired
27086 tejbeer 243
	private PartnerTypeChangeRepository partnerTypeChangeRepository;
28368 tejbeer 244
 
27086 tejbeer 245
	@Autowired
23724 amit.gupta 246
	private SchemeService schemeService;
24683 amit.gupta 247
 
29668 tejbeer 248
	@Autowired
249
	private ServiceConfigRepository serviceConfigRepository;
250
 
29308 tejbeer 251
	@Value("${delhivery.tracking.token}")
252
	private String token;
253
 
30752 tejbeer 254
	private static final String[] STOCK_AGEING_MAIL_LIST = new String[] { "uday.singh@smartudkaan.com",
29160 amit.gupta 255
			"mohinder.mutreja@smartdukaan.com", "ankit.bhatia@smartdukaan.com", "tarun.verma@smartdukaan.com",
30752 tejbeer 256
			"kuldeep.kumar@smartdukaan.com", "manish.gupta@smartdukaan.com" };
25609 amit.gupta 257
 
30752 tejbeer 258
	private static final String[] ITEMWISE_PENDING_INDENT_MAIL_LIST = new String[] { "kamini.sharma@smartdukaan.com",
28205 tejbeer 259
			"tarun.verma@smartdukaan.com", "uday.singh@smartdukaan.com", "kuldeep.kumar@smartdukaan.com",
30752 tejbeer 260
			"niranjan.kala@smartdukaan.com" };
25609 amit.gupta 261
 
30752 tejbeer 262
	private static final String[] INDENT_TERTIARY_MAIL_LIST = new String[] { "uday.singh@smartdukaan.com",
263
			"kuldeep.kumar@smartdukaan.com" };
28709 amit.gupta 264
 
30752 tejbeer 265
	private static final String[] EMPLOYEE_ATTENDANCE_MAIL_LIST = new String[] { "sm@smartdukaan.com",
266
			"sm@smartdukaan.com" };
28790 amit.gupta 267
 
25721 tejbeer 268
	private List<OrderStatus> orderStatusList = Arrays.asList(OrderStatus.SUBMITTED_FOR_PROCESSING);
269
 
24681 amit.gupta 270
	@Autowired
271
	private ReporticoService reporticoService;
23724 amit.gupta 272
 
273
	@Autowired
24337 amit.gupta 274
	private PartnerInvestmentService partnerInvestmentService;
25598 amit.gupta 275
 
25590 amit.gupta 276
	@Autowired
277
	private PositionRepository positionRepository;
24337 amit.gupta 278
 
279
	@Autowired
24542 amit.gupta 280
	private FofoOrderItemRepository fofoOrderItemRepository;
25865 amit.gupta 281
 
25854 amit.gupta 282
	@Autowired
283
	private NotificationService notificationService;
24542 amit.gupta 284
 
285
	@Autowired
24277 amit.gupta 286
	private PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
287
 
288
	@Autowired
24241 amit.gupta 289
	private SchemeInOutRepository schemeInOutRepository;
290
 
291
	@Autowired
23724 amit.gupta 292
	private RechargeTransactionRepository rechargeTransactionRepository;
293
 
294
	@Autowired
24542 amit.gupta 295
	private CustomerAddressRepository customerAddressRepository;
296
 
297
	@Autowired
23724 amit.gupta 298
	private RechargeProviderCreditWalletHistoryRepository rechargeProviderCreditWalletHistoryRepository;
299
 
300
	@Autowired
24590 amit.gupta 301
	private FofoLineItemRepository fofoLineItemRepository;
302
 
303
	@Autowired
23724 amit.gupta 304
	private FofoOrderRepository fofoOrderRepository;
24587 amit.gupta 305
 
24580 amit.gupta 306
	@Autowired
307
	private UserWalletHistoryRepository userWalletHistoryRepository;
24250 amit.gupta 308
 
24249 amit.gupta 309
	@Autowired
24587 amit.gupta 310
	private UserWalletRepository userWalletRepository;
311
 
312
	@Autowired
24249 amit.gupta 313
	private InventoryItemRepository inventoryItemRepository;
23929 amit.gupta 314
 
23739 amit.gupta 315
	@Autowired
316
	private WalletService walletService;
23724 amit.gupta 317
 
318
	@Autowired
319
	private ThinkWalnutDigitalRechargeProviderService thinkWalnutDigitalRechargeProviderService;
320
 
321
	@Autowired
322
	private OxigenRechargeProviderService oxigenRechargeProviderService;
323
 
324
	@Autowired
325
	private RechargeProviderRepository rechargeProviderRepository;
326
 
327
	@Autowired
24242 amit.gupta 328
	private ScanRecordRepository scanRecordRepository;
329
 
330
	@Autowired
23724 amit.gupta 331
	private DailyRechargeRepository dailyRechargeRepository;
332
 
23929 amit.gupta 333
	@Autowired
334
	private FofoStoreRepository fofoStoreRepository;
24177 govind 335
 
23724 amit.gupta 336
	@Value("${prod}")
337
	private boolean prod;
26945 amit.gupta 338
 
26929 amit.gupta 339
	@Autowired
340
	private StateGstRateRepository stateGstRateRepository;
23724 amit.gupta 341
 
23929 amit.gupta 342
	@Autowired
343
	private RetailerService retailerService;
344
 
345
	@Autowired
346
	private TransactionService transactionService;
24250 amit.gupta 347
 
24249 amit.gupta 348
	@Autowired
349
	private ItemRepository itemRepository;
23929 amit.gupta 350
 
351
	@Autowired
352
	private OrderRepository orderRepository;
25351 tejbeer 353
 
25335 amit.gupta 354
	@Autowired
355
	private OrderService orderService;
23929 amit.gupta 356
 
357
	@Autowired
24241 amit.gupta 358
	private SchemeRepository schemeRepository;
359
 
360
	@Autowired
23929 amit.gupta 361
	private JavaMailSender mailSender;
24177 govind 362
 
24174 govind 363
	@Autowired
364
	private PartnerTargetRepository partnerTargetRepository;
24002 amit.gupta 365
 
366
	@Autowired
367
	@Qualifier(value = "googleMailSender")
23932 amit.gupta 368
	private JavaMailSender googleMailSender;
23929 amit.gupta 369
 
370
	@Autowired
371
	private InventoryService inventoryService;
372
 
24533 govind 373
	@Autowired
24542 amit.gupta 374
	private AddressRepository addressRepository;
375
 
376
	@Autowired
377
	private RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
378
 
24653 govind 379
	@Autowired
380
	private Mongo mongoClient;
24683 amit.gupta 381
 
24669 govind 382
	@Autowired
25300 tejbeer 383
	private DeviceRepository deviceRepository;
384
 
385
	@Autowired
386
	private PushNotificationRepository pushNotificationRepository;
387
 
388
	@Autowired
389
	private NotificationCampaignRepository notificationCampaignRepository;
390
 
391
	@Autowired
25721 tejbeer 392
	private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
393
 
394
	@Autowired
395
	private FocusedModelRepository focusedModelRepository;
396
 
397
	@Autowired
24669 govind 398
	private UserAccountRepository userAccountRepository;
24653 govind 399
 
25721 tejbeer 400
	@Autowired
25927 amit.gupta 401
	private UserRepository userUserRepository;
25721 tejbeer 402
 
403
	@Autowired
25927 amit.gupta 404
	private com.spice.profitmandi.dao.repository.dtr.UserRepository dtrUserRepository;
405
 
406
	@Autowired
25721 tejbeer 407
	private UserCampaignRepository userCampaignRepository;
408
 
409
	@Autowired
410
	private Gson gson;
411
 
26283 tejbeer 412
	@Autowired
413
	private TicketRepository ticketRepository;
414
 
26790 tejbeer 415
	@Autowired
416
	private RefferalRepository refferalRepository;
417
 
28205 tejbeer 418
	@Autowired
419
	private PartnerProblemRepository partnerProblemRepository;
420
 
28368 tejbeer 421
	@Autowired
422
	private PendingOrderRepository pendingOrderRepository;
423
 
424
	@Autowired
425
	private PendingOrderItemRepository pendingOrderItemRepository;
426
 
427
	@Value("${razorpay.account.keyId}")
428
	private String keyId;
429
 
430
	@Value("${razorpay.account.keySecret}")
431
	private String keySecret;
432
 
28369 tejbeer 433
	@Autowired
434
	private RazorpayPaymentService razorPaymentService;
435
 
436
	@Autowired
437
	private RazorPayRepository razorPayRepository;
438
 
28377 tejbeer 439
	@Autowired
440
	private PendingOrderService pendingOrderService;
441
 
442
	@Autowired
443
	private CustomerRepository customerRepository;
444
 
29308 tejbeer 445
	@Autowired
446
	private RestClient restClient;
447
 
29814 tejbeer 448
	@Autowired
449
	private MandiiService mandiiService;
450
 
451
	@Autowired
452
	CreditAccountRepository creditAccountRepository;
23755 amit.gupta 453
	private static final Logger LOGGER = LogManager.getLogger(ScheduledTasks.class);
23724 amit.gupta 454
 
25300 tejbeer 455
	private String FCM_URL = "https://fcm.googleapis.com/fcm/send";
456
	private String FCM_API_KEY = "AAAASAjNcn4:APA91bG6fWRIgYJI0L9gCjP5ynaXz2hJHYKtD9dfH7Depdv31Nd9APJwhx-OPkAJ1WSz4BGNYG8lHThLFSjDGFxIwUZv241YcAJEGDLgt86mxq9FXJe-yBRu-S0_ZwHqmX-QaVKl5F_A";
457
 
23724 amit.gupta 458
	public void generateDailyRecharge() {
459
		List<RechargeProviderCreditWalletHistory> allCreditHistory = rechargeProviderCreditWalletHistoryRepository
460
				.selectAll(0, 2000);
461
		List<RechargeProvider> rechargeProviders = rechargeProviderRepository.selectAll();
462
		rechargeProviders.stream().forEach(x -> x.setAmount(0));
463
 
464
		rechargeProviders.stream().forEach(x -> {
465
			Map<LocalDate, List<RechargeProviderCreditWalletHistory>> dateWiseProviderCreditsMap = allCreditHistory
466
					.stream().filter(z -> z.getProviderId() == x.getId())
467
					.collect(Collectors.groupingBy(x1 -> x1.getReceiveTimestamp().toLocalDate()));
468
 
29252 amit.gupta 469
			LOGGER.info("dateWiseProviderCreditsMap -{}", dateWiseProviderCreditsMap);
23724 amit.gupta 470
			LocalDate endDate = LocalDate.now().plusDays(1);
471
			float previousDayClosing = 0;
472
			LocalDate date = LocalDate.of(2018, 4, 6);
473
			while (date.isBefore(endDate)) {
474
				List<RechargeTransaction> dateWiseRechargeTransactions = rechargeTransactionRepository
475
						.selectAllBetweenTimestamp(Arrays.asList(RechargeStatus.values()), date.atStartOfDay(),
476
								date.plusDays(1).atStartOfDay());
477
 
478
				List<RechargeTransaction> successfulTransactions = dateWiseRechargeTransactions.stream()
479
						.filter(y -> y.getStatus().equals(RechargeStatus.SUCCESS)).collect(Collectors.toList());
480
 
481
				float dailyAmount = 0;
482
				float totalCommission = 0;
483
				for (RechargeTransaction rechargeTransaction : successfulTransactions) {
484
					if (rechargeTransaction.getProviderId() == x.getId()) {
485
						dailyAmount += rechargeTransaction.getAmount();
486
						totalCommission += rechargeTransaction.getCommission();
487
					}
488
				}
489
 
490
				List<RechargeProviderCreditWalletHistory> rechargeHistoryList = dateWiseProviderCreditsMap.get(date);
491
				float dailyWalletRecharge = 0;
492
				if (rechargeHistoryList != null) {
493
					for (RechargeProviderCreditWalletHistory rechargeProviderCreditWalletHistory : rechargeHistoryList) {
494
						if (rechargeProviderCreditWalletHistory.getProviderId() == x.getId()) {
495
							dailyWalletRecharge += rechargeProviderCreditWalletHistory.getAmount();
496
						}
497
					}
498
				}
499
				if (dailyAmount > 0 || dailyWalletRecharge > 0) {
500
					DailyRecharge dailyRecharge = null;
501
					try {
502
						dailyRecharge = dailyRechargeRepository.selectByProviderIdAndCreateDate(x.getId(), date);
503
					} catch (Exception e) {
504
						LOGGER.info("Could not find Recharge entry");
505
					}
506
					if (dailyRecharge == null) {
507
						dailyRecharge = new DailyRecharge();
508
						dailyRecharge.setCreateDate(date);
509
					}
510
					dailyRecharge.setOpeningBalance(previousDayClosing);
511
					dailyRecharge.setProviderId(x.getId());
512
					dailyRecharge.setWalletRechargeAmount(dailyWalletRecharge);
513
					dailyRecharge.setTotalAmount(dailyAmount);
514
					dailyRecharge.setTotalCommission(totalCommission);
515
					float closingBalance = dailyRecharge.getOpeningBalance() + dailyWalletRecharge - dailyAmount;
516
					dailyRecharge.setClosingBalance(closingBalance);
517
					dailyRechargeRepository.persist(dailyRecharge);
518
					x.setAmount(x.getAmount() + dailyRecharge.getClosingBalance() - dailyRecharge.getOpeningBalance());
519
					previousDayClosing = dailyRecharge.getClosingBalance();
520
				}
521
				date = date.plusDays(1);
522
			}
523
			rechargeProviderRepository.persist(x);
524
		});
23761 amit.gupta 525
		LOGGER.info("finished generating daily recharge");
23724 amit.gupta 526
	}
527
 
23738 amit.gupta 528
	public void reconcileRecharge() throws Exception {
23724 amit.gupta 529
		LocalDateTime fromDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).minusDays(30);
530
		LocalDateTime toDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS);
531
		List<RechargeStatus> nonSuccessRechargeStatuses = new ArrayList<>(Arrays.asList(RechargeStatus.values()));
532
		LOGGER.info("nonSuccessRechargeStatuses {} ", nonSuccessRechargeStatuses);
533
		nonSuccessRechargeStatuses.remove(RechargeStatus.SUCCESS);
534
		nonSuccessRechargeStatuses.remove(RechargeStatus.FAILED);
535
		RechargeCredential thinkWalnutDigitalRechargeEnquiryCredential = new RechargeCredential();
536
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUrl(thinkWalnutDigitalRechargeEnquiryUrl);
537
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUserName(thinkWalnutDigitalRechargeUserName);
538
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargePassword(thinkWalnutDigitalRechargePassword);
539
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargeAuthKey(thinkWalnutDigitalRechargeAuthKey);
540
		Map<String, RechargeStatus> requestRechargeStatusChanged = new HashMap<>();
541
		List<RechargeTransaction> rechargeTransactions = rechargeTransactionRepository
542
				.selectAllBetweenTimestamp(nonSuccessRechargeStatuses, fromDate, toDate);
543
		for (RechargeTransaction rechargeTransaction : rechargeTransactions) {
544
			try {
545
				int providerId = rechargeTransaction.getProviderId();
546
				if (providerId == 1) {
547
					oxigenRechargeProviderService.doCheckStatusRequest(oxigenRechargeEnquiryUrl, oxigenRechargeAuthKey,
548
							rechargeTransaction);
549
				} else if (providerId == 2) {
550
					thinkWalnutDigitalRechargeProviderService
551
							.doCheckStatusRequest(thinkWalnutDigitalRechargeEnquiryCredential, rechargeTransaction);
552
				}
553
				if (rechargeTransaction.getStatus().equals(RechargeStatus.SUCCESS)
554
						|| rechargeTransaction.getStatus().equals(RechargeStatus.FAILED)) {
555
					requestRechargeStatusChanged.put(rechargeTransaction.getRequestId(),
556
							rechargeTransaction.getStatus());
557
				}
558
			} catch (Exception e) {
559
				LOGGER.info("Could not check status for Request {}", rechargeTransaction.getRequestId());
560
			}
561
		}
23738 amit.gupta 562
		LOGGER.info("Reconcile recharge ran successfully");
23724 amit.gupta 563
	}
28205 tejbeer 564
 
27438 amit.gupta 565
	public void processActivation() throws Exception {
566
		schemeService.processActivation();
567
	}
24240 amit.gupta 568
 
569
	// TemporaryMethod
24237 amit.gupta 570
	public void migrateInvoice() {
571
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectFromSaleDate(LocalDateTime.now().minusDays(3));
572
		Map<Integer, List<FofoOrder>> partnerOrdersMap = new HashMap<>();
24241 amit.gupta 573
		partnerOrdersMap = fofoOrders.stream()
574
				.collect(Collectors.groupingBy(FofoOrder::getFofoId, Collectors.toList()));
24237 amit.gupta 575
		for (List<FofoOrder> orderList : partnerOrdersMap.values()) {
24240 amit.gupta 576
			int sequence = 0;
577
			String prefix = "";
24241 amit.gupta 578
			List<FofoOrder> sortedList = orderList.stream().sorted((x1, x2) -> x1.getId() - x2.getId())
579
					.collect(Collectors.toList());
580
			for (FofoOrder order : sortedList) {
581
 
24240 amit.gupta 582
				LOGGER.info("Order Id is {}, partner Id is {}", order.getId(), order.getFofoId());
24241 amit.gupta 583
				if (!order.getInvoiceNumber().contains("SEC")) {
24240 amit.gupta 584
					sequence = Integer.parseInt(order.getInvoiceNumber().split("/")[1]);
585
					prefix = order.getInvoiceNumber().split("/")[0];
586
				} else {
587
					sequence += 1;
24241 amit.gupta 588
					String invoiceNumber = prefix + "/" + sequence;
24240 amit.gupta 589
					order.setInvoiceNumber(invoiceNumber);
590
					fofoOrderRepository.persist(order);
591
				}
592
			}
24241 amit.gupta 593
 
24237 amit.gupta 594
		}
595
	}
23724 amit.gupta 596
 
30393 amit.gupta 597
	@Autowired
598
	private ReporticoCacheTableRepository reporticoCacheTableRepository;
24252 amit.gupta 599
 
25584 amit.gupta 600
	public void processScheme(int offset, boolean dryRun) throws Exception {
24462 amit.gupta 601
		LocalDateTime startDate = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT).minusDays(offset);
24259 amit.gupta 602
		LocalDateTime endDate = startDate.plusDays(30);
25584 amit.gupta 603
		processScheme(startDate, endDate, dryRun);
24256 amit.gupta 604
	}
28205 tejbeer 605
 
27892 amit.gupta 606
	public void processSchemeOut(List<String> invoiceNumbers) throws Exception {
28205 tejbeer 607
		for (String invoiceNumber : invoiceNumbers) {
608
			System.out.println("Invoice Number - " + invoiceNumber);
27892 amit.gupta 609
			FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
30972 amit.gupta 610
			orderService.reverseScheme(fofoOrder);
27892 amit.gupta 611
			schemeService.processSchemeOut(fofoOrder.getId(), fofoOrder.getFofoId());
612
		}
613
	}
28205 tejbeer 614
 
27987 amit.gupta 615
	public void processSchemeIn(List<String> invoiceNumbers) throws Exception {
28205 tejbeer 616
		for (String invoiceNumber : invoiceNumbers) {
617
			System.out.println("Invoice Number - " + invoiceNumber);
27987 amit.gupta 618
			Purchase purchase = purchaseRepository.selectByPurchaseReference(invoiceNumber);
619
			schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
620
		}
621
	}
24533 govind 622
 
25584 amit.gupta 623
	public void processScheme(int offset, int durationDays, boolean dryRun) throws Exception {
24462 amit.gupta 624
		LocalDateTime startDate = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT).minusDays(offset);
24461 amit.gupta 625
		LocalDateTime endDate = startDate.plusDays(durationDays);
25584 amit.gupta 626
		processScheme(startDate, endDate, dryRun);
24461 amit.gupta 627
	}
24271 amit.gupta 628
 
25584 amit.gupta 629
	public void processScheme(boolean dryRun) throws Exception {
24256 amit.gupta 630
		LocalDateTime fromDate = LocalDateTime.now().minusDays(30);
25584 amit.gupta 631
		processScheme(fromDate, LocalDateTime.now(), dryRun);
24256 amit.gupta 632
	}
24271 amit.gupta 633
 
25584 amit.gupta 634
	public void processScheme(LocalDateTime startDate, LocalDateTime endDate, boolean dryRun) throws Exception {
23724 amit.gupta 635
		LOGGER.info("Started execution at {}", LocalDateTime.now());
25312 amit.gupta 636
		System.out.println(
637
				"InventoryId\tSerialNumber\tItem Id\tScheme Id\tScheme Name\tScheme Type\tAmount Type\tDP\tTaxable\tScheme Amount\tAmount Paid");
24561 amit.gupta 638
		try {
24587 amit.gupta 639
			List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
640
			for (Purchase purchase : purchases) {
641
				schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
642
			}
24271 amit.gupta 643
 
24587 amit.gupta 644
			List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
645
			for (FofoOrder fofoOrder : fofoOrders) {
646
				schemeService.processSchemeOut(fofoOrder.getId(), fofoOrder.getFofoId());
647
			}
648
		} catch (Exception e) {
24561 amit.gupta 649
			e.printStackTrace();
24565 amit.gupta 650
			throw e;
24561 amit.gupta 651
		}
28205 tejbeer 652
		List<UserWalletHistory> uwhs = userWalletHistoryRepository.selectAllByDateType(LocalDate.now().atStartOfDay(),
653
				endDate, Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
25043 amit.gupta 654
		System.out.println("Amount\tReference\tReferenceType\tTimestamp\tDescription");
25312 amit.gupta 655
		for (UserWalletHistory uwh : uwhs) {
656
			System.out.println(String.format("%d\t%d\t%s\t%s\t%s", uwh.getAmount(), uwh.getReference(),
657
					uwh.getReferenceType(), uwh.getTimestamp().toString(), uwh.getDescription()));
25043 amit.gupta 658
		}
30644 amit.gupta 659
		LOGGER.info("Schemes processed successfully.");
25598 amit.gupta 660
		if (dryRun) {
25584 amit.gupta 661
			throw new Exception();
662
		}
23724 amit.gupta 663
	}
23929 amit.gupta 664
 
23739 amit.gupta 665
	public void processRechargeCashback() throws Throwable {
23761 amit.gupta 666
		LocalDateTime cashbackTime = LocalDateTime.now();
23929 amit.gupta 667
		int referenceId = (int) Timestamp.valueOf(cashbackTime).getTime() / 1000;
668
		List<RechargeTransaction> pendingTransactions = rechargeTransactionRepository
669
				.getPendingCashBackRehargeTransactions();
670
		Map<Object, Double> totalRetailerCashbacks = pendingTransactions.stream().collect(
671
				Collectors.groupingBy(x -> x.getRetailerId(), Collectors.summingDouble(x -> x.getCommission())));
672
		for (Map.Entry<Object, Double> totalRetailerCashback : totalRetailerCashbacks.entrySet()) {
673
			int retailerId = (Integer) totalRetailerCashback.getKey();
23739 amit.gupta 674
			float amount = totalRetailerCashback.getValue().floatValue();
23929 amit.gupta 675
			if (Math.round(amount) > 0) {
676
				walletService.addAmountToWallet(retailerId, referenceId, WalletReferenceType.CASHBACK,
26565 amit.gupta 677
						"Recharge Cashback", Math.round(amount), LocalDateTime.now());
23762 amit.gupta 678
			}
23739 amit.gupta 679
		}
23929 amit.gupta 680
		for (RechargeTransaction rt : pendingTransactions) {
23761 amit.gupta 681
			rt.setCashbackTimestamp(cashbackTime);
682
			rt.setCashbackReference(referenceId);
683
			rechargeTransactionRepository.persist(rt);
684
		}
23739 amit.gupta 685
		LOGGER.info("Cashbacks for Recharge processed Successfully");
686
	}
29160 amit.gupta 687
 
688
	public void rollOutUpgardedMarginsNextMonth() throws Exception {
29107 amit.gupta 689
		LocalDate startOfPreviousMonth = LocalDate.now().with(ChronoField.DAY_OF_MONTH, 1).minusMonths(1);
29160 amit.gupta 690
 
28971 amit.gupta 691
		List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
29160 amit.gupta 692
		for (FofoStore store : stores) {
693
			int fofoId = store.getId();
694
 
30752 tejbeer 695
			PartnerType startOfPreviousMonthPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId,
696
					startOfPreviousMonth);
29160 amit.gupta 697
			PartnerType todayPartnerType = partnerTypeChangeService.getTypeOnMonth(fofoId,
698
					YearMonth.from(startOfPreviousMonth.atStartOfDay()));
30119 amit.gupta 699
			if (!startOfPreviousMonthPartnerType.nextPartnerTypes().contains(todayPartnerType)) {
29160 amit.gupta 700
				continue;
701
			}
30119 amit.gupta 702
			if (!startOfPreviousMonthPartnerType.equals(todayPartnerType)) {
29160 amit.gupta 703
				LOGGER.info("Partner Type has been changed for code {} from {} to {}", store.getCode(),
30119 amit.gupta 704
						startOfPreviousMonthPartnerType, todayPartnerType);
29160 amit.gupta 705
				List<FofoOrder> fofoOrders = fofoOrderRepository.selectByFofoId(fofoId,
706
						startOfPreviousMonth.atStartOfDay(), startOfPreviousMonth.plusMonths(1).atStartOfDay(), 0, 0);
707
				for (FofoOrder fofoOrder : fofoOrders) {
708
					schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
28974 amit.gupta 709
				}
29160 amit.gupta 710
 
711
			}
28971 amit.gupta 712
		}
713
	}
29252 amit.gupta 714
 
29160 amit.gupta 715
	public void rollOutUpgardedMargins() throws Exception {
716
		LocalDate today = LocalDate.now();
717
		LocalDate yesterday = today.minusDays(1);
718
		int upgradedCount = 0;
719
		List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
720
		StringBuilder sb = new StringBuilder();
721
		for (FofoStore store : stores) {
722
			int fofoId = store.getId();
29252 amit.gupta 723
 
30215 amit.gupta 724
			PartnerType yesterdayPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, yesterday);
725
			PartnerType todayPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, today);
29160 amit.gupta 726
			if (!yesterdayPartnerType.nextPartnerTypes().contains(todayPartnerType)) {
727
				continue;
728
			}
729
			if (!yesterdayPartnerType.equals(todayPartnerType)) {
730
				upgradedCount++;
29252 amit.gupta 731
				sb.append(String.format("Partner Type has been changed for code %s from %s to %s", store.getCode(),
732
						yesterdayPartnerType.toString(), todayPartnerType.toString()));
29160 amit.gupta 733
				sb.append("<br>");
734
				LOGGER.info("Partner Type has been changed for code {} from {} to {}", store.getCode(),
735
						yesterdayPartnerType, todayPartnerType);
736
				List<FofoOrder> fofoOrders = fofoOrderRepository.selectByFofoId(fofoId,
737
						yesterday.withDayOfMonth(1).atStartOfDay(), yesterday.atStartOfDay(), 0, 0);
738
				for (FofoOrder fofoOrder : fofoOrders) {
739
					schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
740
				}
29252 amit.gupta 741
 
29160 amit.gupta 742
			}
743
		}
29252 amit.gupta 744
		if (upgradedCount > 0) {
745
			sendMailHtmlFormat(
30752 tejbeer 746
					new String[] { "amit.gupta@smartdukaan.com", "tarun.verma@smartdukaan.com",
747
							"neeraj.gupta@smartdukaan.com" },
29252 amit.gupta 748
					sb.toString(), null, "Few Partners Category have been Upgraded");
29160 amit.gupta 749
		} else {
29252 amit.gupta 750
			sendMailHtmlFormat(
30752 tejbeer 751
					new String[] { "amit.gupta@smartdukaan.com", "tarun.verma@smartdukaan.com",
752
							"neeraj.gupta@smartdukaan.com" },
29252 amit.gupta 753
					sb.toString(), null, "No partners Category have been upgraded today");
29160 amit.gupta 754
		}
755
	}
23724 amit.gupta 756
 
30390 amit.gupta 757
	@Autowired
758
	private PartnerStatsService partnerStatsService;
759
 
30393 amit.gupta 760
	// Temporary Method
761
	public void evaluateExcessSchemeOut() throws Exception {
762
		Map<Integer, String> userNameMap = retailerService.getAllFofoRetailerIdNameMap();
763
		Map<Integer, Float> userAmountMap = new HashMap<>();
764
 
765
		List<List<?>> rows = new ArrayList<>();
766
		List<String> headers = Arrays.asList("Scheme", "Item", "Partner", "Amount", "Credited On", "Invoice Number",
767
				"Sale On", "Scheme Start", "Scheme End", "Active On", "Expired On");
768
		schemeRepository.selectAll().stream().forEach(x -> {
769
			if (x.getType().equals(SchemeType.OUT)) {
770
				List<SchemeInOut> sioList = schemeInOutRepository
771
						.selectBySchemeIds(new HashSet<>(Arrays.asList(x.getId())));
772
				if (x.getActiveTimestamp() != null) {
773
					LocalDateTime endDateTime = x.getEndDateTime();
774
					if (x.getExpireTimestamp() != null && x.getExpireTimestamp().isBefore(x.getEndDateTime())) {
775
						endDateTime = x.getExpireTimestamp();
776
					}
777
					for (SchemeInOut sio : sioList) {
778
						InventoryItem inventoryItem = null;
779
						inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
780
						FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndSerialNumber(
781
								inventoryItem.getFofoId(), inventoryItem.getSerialNumber(), null, null, 0, 1).get(0);
782
						Optional<ScanRecord> record = scanRecordRepository
783
								.selectByInventoryItemId(sio.getInventoryItemId()).stream()
784
								.filter(y -> y.getType().equals(ScanType.SALE)).findFirst();
785
						if (record.isPresent()) {
786
							int fofoId = record.get().getFofoId();
787
							if (record.get().getCreateTimestamp().isAfter(endDateTime)
788
									|| record.get().getCreateTimestamp().isBefore(x.getStartDateTime())) {
789
								if (!userAmountMap.containsKey(fofoId)) {
790
									userAmountMap.put(fofoId, 0f);
791
								}
792
								userAmountMap.put(fofoId, sio.getAmount() + userAmountMap.get(fofoId));
793
								try {
794
									rows.add(Arrays.asList(x.getDescription(),
795
											itemRepository.selectById(inventoryItem.getItemId()).getItemDescription(),
796
											userNameMap.get(fofoId), sio.getAmount(),
797
											FormattingUtils.formatDate(sio.getCreateTimestamp()),
798
											fofoOrder.getInvoiceNumber(),
799
											FormattingUtils.formatDate(record.get().getCreateTimestamp()),
800
											FormattingUtils.formatDate(x.getStartDateTime()),
801
											FormattingUtils.formatDate(x.getEndDateTime()),
802
											FormattingUtils.formatDate(x.getActiveTimestamp()),
803
											FormattingUtils.formatDate(x.getExpireTimestamp())));
804
								} catch (Exception e) {
805
									e.printStackTrace();
806
								}
807
							}
808
						}
809
					}
810
				}
811
			}
812
		});
813
		userAmountMap.entrySet().stream()
814
				.forEach(x -> LOGGER.info("{} to be deducted from {}({}) for wrongly disbursed due to technical error.",
815
						x.getValue(), userNameMap.get(x.getKey())));
816
 
817
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
818
		Utils.sendMailWithAttachment(googleMailSender,
30752 tejbeer 819
				new String[] { "amit.gupta@shop2020.in", "adeel.yazdani@smartdukaan.com" }, null,
30393 amit.gupta 820
				"Partner Excess Amount", "PFA", "ListofSchemes.csv", new ByteArrayResource(baos.toByteArray()));
821
 
822
	}
823
 
30390 amit.gupta 824
	public void fetchParnterStats() throws Exception {
825
		Map<Integer, PartnerDetailModel> partnerStats = partnerStatsService.getAllPartnerStats();
826
		ObjectOutputStream oos = null;
827
		FileOutputStream fout = null;
828
		try {
829
			fout = new FileOutputStream("/tmp/partnerStat.tmp", false);
830
			oos = new ObjectOutputStream(fout);
831
			oos.writeObject(partnerStats);
832
 
833
		} catch (Exception ex) {
834
			ex.printStackTrace();
835
		} finally {
836
			if (oos != null) {
837
				oos.close();
838
			}
839
		}
840
		ReporticoCacheTable rct = reporticoCacheTableRepository.selectByTableName("partnerStat");
841
		if (rct == null) {
842
			rct = new ReporticoCacheTable();
843
			rct.setTableName("partnerStat");
30393 amit.gupta 844
			rct.setLastCreatedTimestamp(LocalDateTime.now());
845
			reporticoCacheTableRepository.persist(rct);
846
		} else {
847
			rct.setLastCreatedTimestamp(LocalDateTime.now());
30390 amit.gupta 848
		}
849
	}
850
 
30637 amit.gupta 851
	public void processPriceDrop() throws Exception {
30752 tejbeer 852
		List<PriceDrop> priceDrops = priceDropRepository.selectAllByDatesBetween(LocalDateTime.now(),
853
				LocalDateTime.now().minusYears(1));
30637 amit.gupta 854
		for (PriceDrop priceDrop : priceDrops) {
855
			if (priceDrop.getDropAmount() > 0) {
856
				priceDropService.processPriceDrop(priceDrop.getId(), true);
857
			}
858
		}
859
	}
860
 
31008 amit.gupta 861
	@Autowired
862
	CreditNoteService creditNoteService;
863
 
864
	public void sendCreditNote(YearMonth yearMonth) throws Exception {
865
		creditNoteService.issueMonthlyMarginsCN(yearMonth);
866
	}
867
 
25598 amit.gupta 868
	private class SaleRoles {
869
 
870
		private List<String> l1;
871
		private List<String> l2;
872
 
873
		public SaleRoles() {
874
			l1 = new ArrayList<>();
875
			l2 = new ArrayList<>();
876
		}
877
 
878
		public List<String> getL1() {
879
			return l1;
880
		}
881
 
882
		public List<String> getL2() {
883
			return l2;
884
		}
885
 
886
	}
887
 
26945 amit.gupta 888
	private class FofoReportingModel {
889
		private String code;
890
		private int fofoId;
891
		private String businessName;
892
		private String territoryManager;
893
		private String regionalManager;
894
 
895
		@Override
896
		public String toString() {
897
			return "FofoReportingModel [code=" + code + ", fofoId=" + fofoId + ", businessName=" + businessName
898
					+ ", territoryManager=" + territoryManager + ", regionalManager=" + regionalManager + "]";
899
		}
900
 
901
		public String getCode() {
902
			return code;
903
		}
904
 
905
		public void setCode(String code) {
906
			this.code = code;
907
		}
908
 
909
		public String getBusinessName() {
910
			return businessName;
911
		}
912
 
913
		public void setBusinessName(String businessName) {
914
			this.businessName = businessName;
915
		}
916
 
917
		public String getTerritoryManager() {
918
			return territoryManager;
919
		}
920
 
921
		public void setTerritoryManager(String territoryManager) {
922
			this.territoryManager = territoryManager;
923
		}
924
 
925
		public String getRegionalManager() {
926
			return regionalManager;
927
		}
928
 
929
		public void setRegionalManager(String regionalManager) {
930
			this.regionalManager = regionalManager;
931
		}
932
 
933
		private ScheduledTasks getOuterType() {
934
			return ScheduledTasks.this;
935
		}
936
 
937
		@Override
938
		public int hashCode() {
939
			final int prime = 31;
940
			int result = 1;
941
			result = prime * result + getOuterType().hashCode();
942
			result = prime * result + ((businessName == null) ? 0 : businessName.hashCode());
943
			result = prime * result + ((code == null) ? 0 : code.hashCode());
944
			result = prime * result + fofoId;
945
			result = prime * result + ((regionalManager == null) ? 0 : regionalManager.hashCode());
946
			result = prime * result + ((territoryManager == null) ? 0 : territoryManager.hashCode());
947
			return result;
948
		}
949
 
950
		@Override
951
		public boolean equals(Object obj) {
952
			if (this == obj)
953
				return true;
954
			if (obj == null)
955
				return false;
956
			if (getClass() != obj.getClass())
957
				return false;
958
			FofoReportingModel other = (FofoReportingModel) obj;
959
			if (!getOuterType().equals(other.getOuterType()))
960
				return false;
961
			if (businessName == null) {
962
				if (other.businessName != null)
963
					return false;
964
			} else if (!businessName.equals(other.businessName))
965
				return false;
966
			if (code == null) {
967
				if (other.code != null)
968
					return false;
969
			} else if (!code.equals(other.code))
970
				return false;
971
			if (fofoId != other.fofoId)
972
				return false;
973
			if (regionalManager == null) {
974
				if (other.regionalManager != null)
975
					return false;
976
			} else if (!regionalManager.equals(other.regionalManager))
977
				return false;
978
			if (territoryManager == null) {
979
				if (other.territoryManager != null)
980
					return false;
981
			} else if (!territoryManager.equals(other.territoryManager))
982
				return false;
983
			return true;
984
		}
985
 
986
		public int getFofoId() {
987
			return fofoId;
988
		}
989
 
990
		public void setFofoId(int fofoId) {
991
			this.fofoId = fofoId;
992
		}
993
 
994
	}
995
 
24271 amit.gupta 996
	public void sendPartnerInvestmentDetails(List<String> sendTo) throws Exception {
24277 amit.gupta 997
		LocalDate yesterDay = LocalDate.now().minusDays(1);
25267 amit.gupta 998
		List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
23929 amit.gupta 999
		Map<Integer, CustomRetailer> customRetailerMap = retailerService
1000
				.getFofoRetailers(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
25351 tejbeer 1001
 
26957 amit.gupta 1002
		List<String> headers = Arrays.asList("Code", "Outlet name", "State Manager", "Teritory/Team Lead",
26945 amit.gupta 1003
				"Wallet Amount", "In Stock Amount", "Activated Stock", "Return In Transit Stock", "Unbilled Amount",
1004
				"Grn Pending Amount", "Min Investment", "Investment Amount", "Investment Short", "Unbilled Qty",
1005
				"Short Days");
25837 amit.gupta 1006
		List<List<?>> rows = new ArrayList<>();
25895 amit.gupta 1007
		Map<Integer, List<?>> partnerRowsMap = new HashMap<>();
25598 amit.gupta 1008
 
26945 amit.gupta 1009
		Map<Integer, FofoReportingModel> partnerIdSalesHeaderMap = this.getPartnerIdSalesHeaders();
25598 amit.gupta 1010
 
26945 amit.gupta 1011
		Map<Integer, Integer> shortDaysMap = partnerDailyInvestmentRepository
1012
				.selectAll(LocalDate.now().withDayOfMonth(1), LocalDate.now()).stream().collect(Collectors.groupingBy(
1013
						x -> x.getFofoId(), Collectors.summingInt(x -> x.getShortPercentage() > 10 ? 1 : 0)));
1014
 
24002 amit.gupta 1015
		for (FofoStore fofoStore : fofoStores) {
27750 amit.gupta 1016
			LOGGER.info("Fofo Store {},  {}", fofoStore.getId(), fofoStore.getCode());
26376 amit.gupta 1017
			int fofoId = fofoStore.getId();
26945 amit.gupta 1018
			PartnerDailyInvestment partnerDailyInvestment = partnerInvestmentService.getInvestment(fofoId, 1);
25598 amit.gupta 1019
			partnerDailyInvestment.setDate(yesterDay);
26945 amit.gupta 1020
 
25598 amit.gupta 1021
			try {
1022
				partnerDailyInvestmentRepository.persist(partnerDailyInvestment);
26945 amit.gupta 1023
				shortDaysMap.put(fofoId,
1024
						shortDaysMap.get(fofoId) + (partnerDailyInvestment.getShortPercentage() > 10 ? 1 : 0));
25598 amit.gupta 1025
			} catch (Exception e) {
1026
				// ignore the exceptions during persist
1027
			}
1028
 
24002 amit.gupta 1029
			CustomRetailer retailer = customRetailerMap.get(fofoStore.getId());
25837 amit.gupta 1030
			if (retailer == null || partnerIdSalesHeaderMap.get(fofoStore.getId()) == null) {
24002 amit.gupta 1031
				LOGGER.info("Could not find retailer with retailer Id {}", fofoStore.getId());
1032
				continue;
1033
			}
26945 amit.gupta 1034
			FofoReportingModel reportingModel = partnerIdSalesHeaderMap.get(fofoStore.getId());
1035
			List<Serializable> row = new ArrayList<>();
1036
			row.addAll(Arrays.asList(reportingModel.getCode(), reportingModel.getBusinessName(),
1037
					reportingModel.getRegionalManager(), reportingModel.getTerritoryManager()));
25927 amit.gupta 1038
			row.addAll(
1039
					Arrays.asList(partnerDailyInvestment.getWalletAmount(), partnerDailyInvestment.getInStockAmount(),
26945 amit.gupta 1040
							partnerDailyInvestment.getActivatedStockAmount() == 0 ? "-"
1041
									: "(" + partnerDailyInvestment.getActivatedStockAmount() + ")",
25927 amit.gupta 1042
							0, partnerDailyInvestment.getUnbilledAmount(), partnerDailyInvestment.getGrnPendingAmount(),
1043
							partnerDailyInvestment.getMinInvestment(), partnerDailyInvestment.getTotalInvestment(),
26945 amit.gupta 1044
							partnerDailyInvestment.getShortInvestment(), partnerDailyInvestment.getUnbilledQty(),
1045
							shortDaysMap.get(fofoId)));
25837 amit.gupta 1046
			partnerRowsMap.put(fofoStore.getId(), row);
24002 amit.gupta 1047
			rows.add(row);
1048
 
23929 amit.gupta 1049
		}
25312 amit.gupta 1050
 
24271 amit.gupta 1051
		String fileName = "InvestmentSummary-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
25598 amit.gupta 1052
 
25927 amit.gupta 1053
		if (sendTo == null) {
30215 amit.gupta 1054
			for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMapping().entrySet()) {
25895 amit.gupta 1055
				List<List<?>> filteredRows = storeGuyEntry.getValue().stream().map(x -> partnerRowsMap.get(x))
1056
						.filter(x -> x != null).collect(Collectors.toList());
1057
				ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, filteredRows);
30752 tejbeer 1058
				String[] sendToArray = new String[] { storeGuyEntry.getKey() };
25895 amit.gupta 1059
				Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA",
1060
						fileName, new ByteArrayResource(baos.toByteArray()));
1061
			}
27210 tejbeer 1062
			sendTo = Arrays.asList("tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com",
28467 tejbeer 1063
					"neeraj.gupta@smartdukaan.com", "amit.gupta@shop2020.in", "manish.gupta@smartdukaan.com",
1064
					"niranjan.kala@smartdukaan.com");
25341 amit.gupta 1065
		}
25312 amit.gupta 1066
 
25604 amit.gupta 1067
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
1068
		String[] sendToArray = sendTo.toArray(new String[sendTo.size()]);
25609 amit.gupta 1069
		Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA",
1070
				fileName, new ByteArrayResource(baos.toByteArray()));
24271 amit.gupta 1071
 
23929 amit.gupta 1072
	}
24177 govind 1073
 
26945 amit.gupta 1074
	private Map<Integer, FofoReportingModel> getPartnerIdSalesHeaders() {
25598 amit.gupta 1075
		Map<String, SaleRoles> partnerEmailSalesMap = new HashMap<>();
1076
 
1077
		List<Position> positions = positionRepository
1078
				.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_SALES);
1079
		Map<Integer, AuthUser> authUsersMap = authRepository.selectAllActiveUser().stream()
1080
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
1081
		Map<Integer, List<CustomRetailer>> positionIdRetailerMap = csService.getPositionCustomRetailerMap(positions);
1082
		for (Position position : positions) {
1083
			List<CustomRetailer> crList = positionIdRetailerMap.get(position.getId());
25609 amit.gupta 1084
			if (crList == null)
1085
				continue;
25598 amit.gupta 1086
			for (CustomRetailer cr : crList) {
1087
				if (!partnerEmailSalesMap.containsKey(cr.getEmail())) {
1088
					partnerEmailSalesMap.put(cr.getEmail(), new SaleRoles());
1089
				}
1090
				SaleRoles saleRoles = partnerEmailSalesMap.get(cr.getEmail());
1091
				AuthUser authUser = authUsersMap.get(position.getAuthUserId());
26945 amit.gupta 1092
				if (authUser == null) {
26059 amit.gupta 1093
					continue;
1094
				}
25598 amit.gupta 1095
				String name = authUser.getFirstName() + " " + authUser.getLastName();
1096
				if (position.getEscalationType().equals(EscalationType.L1)) {
1097
					saleRoles.getL1().add(name);
1098
				} else if (position.getEscalationType().equals(EscalationType.L2)) {
1099
					saleRoles.getL2().add(name);
1100
				}
1101
			}
1102
		}
25837 amit.gupta 1103
 
1104
		Set<CustomRetailer> allCrList = new HashSet<>();
1105
		for (List<CustomRetailer> cr : positionIdRetailerMap.values()) {
1106
			allCrList.addAll(cr);
1107
		}
1108
 
1109
		Map<Integer, FofoStore> fofoStoresMap = fofoStoreRepository.selectActiveStores().stream()
1110
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
1111
 
26945 amit.gupta 1112
		Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = new HashMap<>();
25837 amit.gupta 1113
 
1114
		for (CustomRetailer cr : allCrList) {
1115
			FofoStore fofoStore = fofoStoresMap.get(cr.getPartnerId());
25927 amit.gupta 1116
			if (fofoStore == null) {
25870 amit.gupta 1117
				LOGGER.info("Could not find Store {} in active Store", cr.getBusinessName());
1118
				continue;
1119
			}
26945 amit.gupta 1120
			String code = fofoStore.getCode();
1121
			// String storeName = "SmartDukaan-" +
1122
			// fofoStore.getCode().replaceAll("[a-zA-Z]", "");
25837 amit.gupta 1123
			String businessName = cr.getBusinessName();
1124
			try {
1125
				String stateManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL2(), ", ");
1126
				String territoryManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL1(), ", ");
26945 amit.gupta 1127
				FofoReportingModel reportingModel = new FofoReportingModel();
1128
				reportingModel.setBusinessName(businessName);
1129
				reportingModel.setCode(code);
1130
				reportingModel.setFofoId(fofoStore.getId());
1131
				reportingModel.setRegionalManager(stateManager);
1132
				reportingModel.setTerritoryManager(territoryManager);
1133
				partnerIdSalesHeadersMap.put(fofoStore.getId(), reportingModel);
25837 amit.gupta 1134
			} catch (Exception e) {
1135
				LOGGER.warn("Could not find partner with email - {}", cr.getEmail());
1136
			}
1137
		}
1138
		return partnerIdSalesHeadersMap;
1139
 
25598 amit.gupta 1140
	}
1141
 
24271 amit.gupta 1142
	public void sendPartnerInvestmentDetails() throws Exception {
25565 amit.gupta 1143
		this.sendPartnerInvestmentDetails(null);
24271 amit.gupta 1144
	}
1145
 
24697 amit.gupta 1146
	public void sendAgeingReport(String... sendTo) throws Exception {
24692 amit.gupta 1147
 
1148
		InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.WAREHOUSENEW,
1149
				"itemstockageing.xml");
24708 amit.gupta 1150
		InputStreamSource isr1 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO,
24754 amit.gupta 1151
				"ItemwiseOverallPendingIndent.xml");
24683 amit.gupta 1152
		Attachment attachment = new Attachment(
25445 amit.gupta 1153
				"ageing-report-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr);
24707 amit.gupta 1154
		Attachment attachment1 = new Attachment(
25445 amit.gupta 1155
				"pending-indent-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr1);
25418 amit.gupta 1156
 
25609 amit.gupta 1157
		Utils.sendMailWithAttachments(googleMailSender, STOCK_AGEING_MAIL_LIST, null, "Stock Ageing Report", "PFA",
1158
				attachment);
1159
		Utils.sendMailWithAttachments(googleMailSender, ITEMWISE_PENDING_INDENT_MAIL_LIST, null,
1160
				"Itemwise Pending indent", "PFA", attachment1);
1161
 
25598 amit.gupta 1162
		// Reports to be sent to mapped partners
25597 amit.gupta 1163
		Map<String, Set<String>> storeGuysMap = csService.getAuthUserPartnerEmailMapping();
25503 amit.gupta 1164
 
1165
		for (Map.Entry<String, Set<String>> storeGuyEntry : storeGuysMap.entrySet()) {
25418 amit.gupta 1166
			Map<String, String> params = new HashMap<>();
25503 amit.gupta 1167
			if (storeGuyEntry.getValue().size() == 0)
1168
				continue;
25418 amit.gupta 1169
			params.put("MANUAL_email", String.join(",", storeGuyEntry.getValue()));
1170
			InputStreamSource isr3 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO,
1171
					"focostockreport.xml", params);
1172
			Attachment attache = new Attachment(
25609 amit.gupta 1173
					"Franchise-stock-report" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr3);
25584 amit.gupta 1174
			System.out.println(storeGuyEntry.getValue());
30752 tejbeer 1175
			Utils.sendMailWithAttachments(googleMailSender, new String[] { storeGuyEntry.getKey() }, null,
25609 amit.gupta 1176
					"Franchise Stock Report", "PFA", attache);
25418 amit.gupta 1177
		}
25503 amit.gupta 1178
 
24681 amit.gupta 1179
	}
24533 govind 1180
 
28632 amit.gupta 1181
	public void sendIndentTertiary() throws Exception {
28709 amit.gupta 1182
 
28632 amit.gupta 1183
		InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO,
1184
				"indentandtertiary.xml");
1185
		Attachment attachment = new Attachment(
28839 tejbeer 1186
				"indentandtertiary-report-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr);
28709 amit.gupta 1187
		Utils.sendMailWithAttachments(googleMailSender, INDENT_TERTIARY_MAIL_LIST, null, "Indent Tertiary Report",
1188
				"PFA", attachment);
1189
 
28632 amit.gupta 1190
	}
28790 amit.gupta 1191
 
28769 amit.gupta 1192
	public void sendAttendanceMorningAlert() throws Exception {
28793 amit.gupta 1193
		LocalDateTime moriningTime = LocalDate.now().atTime(10, 31);
28775 amit.gupta 1194
		List<AuthUser> authUsers = authRepository.selectAllActiveUser();
28790 amit.gupta 1195
		Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive())
1196
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
1197
 
28769 amit.gupta 1198
		List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
28790 amit.gupta 1199
		Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
1200
 
1201
		List<EmployeeAttendance> employeeAttendances = employeeAttendanceRepository
1202
				.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now());
1203
 
1204
		Map<Integer, Optional<EmployeeAttendance>> employeeMorningAttendance = employeeAttendances.stream()
1205
				.collect(Collectors.groupingBy(EmployeeAttendance::getUserId,
1206
						Collectors.minBy(Comparator.comparing(EmployeeAttendance::getCreateTimestamp))));
1207
		for (AuthUser authUser : authUsers) {
28769 amit.gupta 1208
			User user = userMap.get(authUser.getEmailId());
1209
			Optional<EmployeeAttendance> employeeAttendanceOptional = employeeMorningAttendance.get(user.getId());
28817 amit.gupta 1210
			LOGGER.info("AuthUser - {}, employeeAttendanceOptional {}", authUser.getName(), employeeAttendanceOptional);
28839 tejbeer 1211
			if (employeeAttendanceOptional != null) {
28818 amit.gupta 1212
				LOGGER.info("employeeAttendanceOptional.orElse {}", employeeAttendanceOptional.orElse(null));
28839 tejbeer 1213
				if (employeeAttendanceOptional.orElse(null) != null) {
1214
					LOGGER.info("employeeAttendanceOptional.get().getCreateTimestamp() {}",
1215
							employeeAttendanceOptional.get().getCreateTimestamp());
28818 amit.gupta 1216
				}
1217
			}
28790 amit.gupta 1218
			if (employeeAttendanceOptional == null || employeeAttendanceOptional.orElse(null) == null
28769 amit.gupta 1219
					|| employeeAttendanceOptional.get().getCreateTimestamp().isAfter(moriningTime)) {
28819 amit.gupta 1220
				LOGGER.info("Will Send Email to {}", authUser.getFullName());
28790 amit.gupta 1221
				String body = String.format(
28806 amit.gupta 1222
						"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",
28839 tejbeer 1223
						authUser.getFullName(),
1224
						(employeeAttendanceOptional == null || employeeAttendanceOptional.orElse(null) == null) ? ""
1225
								: "(Punched at "
30752 tejbeer 1226
										+ FormattingUtils.format(employeeAttendanceOptional.get().getCreateTimestamp())
1227
										+ ")");
28839 tejbeer 1228
 
30752 tejbeer 1229
				Utils.sendMailWithAttachments(googleMailSender, new String[] { authUser.getEmailId() },
31120 tejbeer 1230
						new String[] { "kangan.monga@smartdukaan.com" }, "Attendance Alert", body);
28839 tejbeer 1231
 
28769 amit.gupta 1232
			}
1233
		}
28790 amit.gupta 1234
 
28769 amit.gupta 1235
	}
28790 amit.gupta 1236
 
28775 amit.gupta 1237
	public void sendAttendanceEveningAlert() throws Exception {
1238
		List<AuthUser> authUsers = authRepository.selectAllActiveUser();
28790 amit.gupta 1239
		Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive())
1240
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
1241
 
28775 amit.gupta 1242
		List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
28790 amit.gupta 1243
		Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28775 amit.gupta 1244
 
28790 amit.gupta 1245
		Map<Integer, List<EmployeeAttendance>> employeeAttendancesMap = employeeAttendanceRepository
1246
				.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now()).stream()
1247
				.collect(Collectors.groupingBy(x -> x.getUserId()));
1248
 
1249
		for (AuthUser authUser : authUsers) {
28775 amit.gupta 1250
			User user = userMap.get(authUser.getEmailId());
28784 amit.gupta 1251
			String body = null;
1252
			List<EmployeeAttendance> employeeAttendances = employeeAttendancesMap.get(user.getId());
28790 amit.gupta 1253
			if (employeeAttendances == null) {
1254
				body = String.format(
28806 amit.gupta 1255
						"Dear %s,\n No attendance has been registered by you today. You have been marked absent for the day.\n\nRegards\nHR Team",
28790 amit.gupta 1256
						authUser.getFullName());
28784 amit.gupta 1257
			} else {
28790 amit.gupta 1258
				List<LocalDateTime> punchTimes = employeeAttendances.stream()
1259
						.sorted(Comparator.comparing(EmployeeAttendance::getCreateTimestamp))
1260
						.map(x -> x.getCreateTimestamp()).collect(Collectors.toList());
1261
				if (punchTimes.size() == 1) {
1262
					// body = String.format("Dear %s,\n Pls note that you haven't punched out yet.
1263
					// You have been marked absent for half the day. You may contact your manager
1264
					// and get it regularise.\n\nRegards\nHR Team", authUser.getFullName());
28784 amit.gupta 1265
				} else {
1266
					LocalDateTime firstPunch = punchTimes.get(0);
28790 amit.gupta 1267
					LocalDateTime lastPunch = punchTimes.get(punchTimes.size() - 1);
28805 amit.gupta 1268
					Duration duration = Duration.between(firstPunch, lastPunch);
28784 amit.gupta 1269
					boolean hoursCompleted = lastPunch.isAfter(firstPunch.plusHours(8).plusMinutes(30));
28790 amit.gupta 1270
					if (!hoursCompleted) {
1271
						body = String.format(
28806 amit.gupta 1272
								"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",
28839 tejbeer 1273
								authUser.getFullName(), duration.toHours(),
1274
								duration.toMinutes() - duration.toHours() * 60);
28784 amit.gupta 1275
					}
1276
				}
1277
 
1278
			}
28790 amit.gupta 1279
			if (body != null) {
30752 tejbeer 1280
				Utils.sendMailWithAttachments(googleMailSender, new String[] { authUser.getEmailId() },
31120 tejbeer 1281
						new String[] { "kangan.monga@smartdukaan.com" }, "Attendance Alert", body);
28775 amit.gupta 1282
			}
1283
		}
28790 amit.gupta 1284
 
1285
		this.sendMailToHR();
1286
 
28775 amit.gupta 1287
	}
28790 amit.gupta 1288
 
1289
	private void sendMailToHR() throws Exception {
1290
		Map<String, String> map = new HashMap<>();
1291
		String reporticoDate = FormattingUtils.formatReporitcoDate(LocalDateTime.now());
1292
		map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
1293
		map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
1294
		InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO,
1295
				"employeeattendance.xml");
1296
		Attachment attachment = new Attachment("attendance-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv",
1297
				isr);
1298
		Utils.sendMailWithAttachments(googleMailSender, EMPLOYEE_ATTENDANCE_MAIL_LIST, null,
1299
				"Attendance - " + FormattingUtils.formatDate(LocalDateTime.now()), "PFA Attendance", attachment);
1300
	}
1301
 
28709 amit.gupta 1302
	public void checkPartnerActiveStore() throws Exception {
1303
 
1304
		List<FofoStore> fofoStores = fofoStoreRepository.selectByStatus(true);
1305
 
1306
		LocalDateTime currentDate = LocalDate.now().atStartOfDay();
28712 amit.gupta 1307
		if (!fofoStores.isEmpty()) {
1308
			for (FofoStore fofoStore : fofoStores) {
28709 amit.gupta 1309
 
28712 amit.gupta 1310
				if (currentDate.isBefore(fofoStore.getActiveTimeStamp())) {
28709 amit.gupta 1311
 
28712 amit.gupta 1312
					fofoStore.setActive(true);
1313
					fofoStoreRepository.persist(fofoStore);
1314
					LOGGER.info("inserted into InActiveFofoStore successfully");
28709 amit.gupta 1315
 
30393 amit.gupta 1316
				} else {
28712 amit.gupta 1317
					fofoStore.setActive(false);
1318
					fofoStore.setActiveTimeStamp(null);
1319
					fofoStoreRepository.persist(fofoStore);
1320
					LOGGER.info("inserted into InActiveFofoStore successfully");
1321
				}
28709 amit.gupta 1322
 
1323
			}
1324
		}
1325
 
1326
	}
1327
 
24697 amit.gupta 1328
	public void sendAgeingReport() throws Exception {
30593 amit.gupta 1329
		sendAgeingReport("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com",
28467 tejbeer 1330
				"niranjan.kala@smartdukaan.com", "manish.gupta@smartdukaan.com", "kuldeep.kumar@smartdukaan.com");
24697 amit.gupta 1331
	}
1332
 
24533 govind 1333
	public void moveImeisToPriceDropImeis() throws Exception {
24431 amit.gupta 1334
		List<PriceDrop> priceDrops = priceDropRepository.selectAll();
24533 govind 1335
		for (PriceDrop priceDrop : priceDrops) {
24431 amit.gupta 1336
			priceDropService.priceDropStatus(priceDrop.getId());
1337
		}
1338
	}
23929 amit.gupta 1339
 
24542 amit.gupta 1340
	public void walletmismatch() throws Exception {
1341
		LocalDate curDate = LocalDate.now();
24553 amit.gupta 1342
		List<PartnerDailyInvestment> pdis = partnerDailyInvestmentRepository.selectAll(curDate.minusDays(2));
24552 amit.gupta 1343
		System.out.println(pdis.size());
24542 amit.gupta 1344
		for (PartnerDailyInvestment pdi : pdis) {
24549 amit.gupta 1345
			int fofoId = pdi.getFofoId();
24542 amit.gupta 1346
			for (PartnerDailyInvestment investment : Lists
1347
					.reverse(partnerDailyInvestmentRepository.selectAll(fofoId, null, null))) {
24552 amit.gupta 1348
				float statementAmount = walletService.getOpeningTill(fofoId,
24555 amit.gupta 1349
						investment.getDate().plusDays(1).atTime(LocalTime.of(4, 0)));
24552 amit.gupta 1350
				CustomRetailer retailer = retailerService.getFofoRetailer(fofoId);
24841 govind 1351
				LOGGER.info("{}\t{}\t{}\t{}\t{}", fofoId, retailer.getBusinessName(), retailer.getMobileNumber(),
1352
						investment.getDate().toString(), investment.getWalletAmount(), statementAmount);
24551 amit.gupta 1353
 
24542 amit.gupta 1354
			}
24549 amit.gupta 1355
		}
24542 amit.gupta 1356
 
1357
	}
29160 amit.gupta 1358
 
28990 amit.gupta 1359
	@Autowired
1360
	StateRepository stateRepository;
24542 amit.gupta 1361
 
1362
	public void gst() throws Exception {
28995 amit.gupta 1363
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.of(2021, 8, 16).atStartOfDay(),
28990 amit.gupta 1364
				LocalDateTime.now());
24548 amit.gupta 1365
		for (FofoOrder fofoOrder : fofoOrders) {
1366
			int retailerAddressId = retailerRegisteredAddressRepository
1367
					.selectAddressIdByRetailerId(fofoOrder.getFofoId());
24542 amit.gupta 1368
 
1369
			Address retailerAddress = addressRepository.selectById(retailerAddressId);
1370
			CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
1371
			Integer stateId = null;
1372
			if (customerAddress.getState().equals(retailerAddress.getState())) {
1373
				try {
28990 amit.gupta 1374
					stateId = stateRepository.selectByName(customerAddress.getState()).getId();
24542 amit.gupta 1375
				} catch (Exception e) {
28990 amit.gupta 1376
					LOGGER.error("Cannot found state named {}", customerAddress.getState());
1377
					continue;
24542 amit.gupta 1378
				}
1379
			}
1380
			Map<Integer, GstRate> itemIdStateTaxRateMap = null;
1381
			Map<Integer, Float> itemIdIgstTaxRateMap = null;
24548 amit.gupta 1382
 
1383
			List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
26929 amit.gupta 1384
			List<Integer> itemIds = fofoOrderItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
24542 amit.gupta 1385
			if (stateId != null) {
26929 amit.gupta 1386
				itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(itemIds, stateId);
24542 amit.gupta 1387
			} else {
26929 amit.gupta 1388
				itemIdIgstTaxRateMap = stateGstRateRepository.getIgstTaxRate(itemIds);
24542 amit.gupta 1389
			}
1390
 
24548 amit.gupta 1391
			for (FofoOrderItem foi : fofoOrderItems) {
28990 amit.gupta 1392
				float sgstRate = foi.getSgstRate();
1393
				float cgstRate = foi.getCgstRate();
1394
				float igstRate = foi.getIgstRate();
29160 amit.gupta 1395
				if (stateId == null && igstRate == 0) {
1396
 
1397
					foi.setSgstRate(0);
1398
					foi.setCgstRate(0);
1399
					foi.setIgstRate(itemIdIgstTaxRateMap.get(foi.getItemId()));
1400
 
28993 amit.gupta 1401
					LOGGER.info("Invoice {}, Date {}", fofoOrder.getInvoiceNumber(), fofoOrder.getCreateTimestamp());
29160 amit.gupta 1402
					LOGGER.info("customerAddress.getState() {}, retailerAddress.getState() {}",
1403
							customerAddress.getState(), retailerAddress.getState());
28990 amit.gupta 1404
					LOGGER.info("Rates getIgstRate() {}", itemIdIgstTaxRateMap.get(foi.getItemId()));
29160 amit.gupta 1405
 
1406
				} else if (stateId != null && sgstRate == 0 && cgstRate == 0) {
1407
 
1408
					foi.setIgstRate(0);
1409
					foi.setCgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate());
1410
					foi.setSgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
1411
 
28993 amit.gupta 1412
					LOGGER.info("Invoice {}, Date {}", fofoOrder.getInvoiceNumber(), fofoOrder.getCreateTimestamp());
29160 amit.gupta 1413
					LOGGER.info("customerAddress.getState() {}, retailerAddress.getState() {}",
1414
							customerAddress.getState(), retailerAddress.getState());
1415
					LOGGER.info("Rates getCgstRate() {}, getSgstRate() {}",
1416
							itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate(),
1417
							itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
24542 amit.gupta 1418
				}
1419
			}
1420
		}
24548 amit.gupta 1421
 
24542 amit.gupta 1422
	}
1423
 
24580 amit.gupta 1424
	public void schemewalletmismatch() {
1425
		LocalDate dateToReconcile = LocalDate.of(2018, 4, 1);
24587 amit.gupta 1426
		while (dateToReconcile.isBefore(LocalDate.now())) {
24580 amit.gupta 1427
			reconcileSchemes(dateToReconcile);
24587 amit.gupta 1428
			// reconcileOrders(dateTime);
1429
			// reconcileRecharges(dateTime);
24580 amit.gupta 1430
			dateToReconcile = dateToReconcile.plusDays(1);
1431
		}
1432
	}
1433
 
1434
	private void reconcileSchemes(LocalDate date) {
1435
		LocalDateTime startDate = date.atStartOfDay();
1436
		LocalDateTime endDate = startDate.plusDays(1);
1437
		List<SchemeInOut> siosCreated = schemeInOutRepository.selectAllByCreateDate(startDate, endDate);
1438
		List<SchemeInOut> siosRefunded = schemeInOutRepository.selectAllByRefundDate(startDate, endDate);
24587 amit.gupta 1439
		double totalSchemeDisbursed = siosCreated.stream().mapToDouble(x -> x.getAmount()).sum();
1440
		double totalSchemeRolledback = siosRefunded.stream().mapToDouble(x -> x.getAmount()).sum();
24580 amit.gupta 1441
		double netSchemeDisbursed = totalSchemeDisbursed - totalSchemeRolledback;
24587 amit.gupta 1442
		List<WalletReferenceType> walletReferenceTypes = Arrays.asList(WalletReferenceType.SCHEME_IN,
1443
				WalletReferenceType.SCHEME_OUT);
1444
		List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByDateType(startDate, endDate,
1445
				walletReferenceTypes);
1446
		double schemeAmountWalletTotal = history.stream().mapToDouble(x -> x.getAmount()).sum();
1447
		if (Math.abs(netSchemeDisbursed - schemeAmountWalletTotal) > 10d) {
24580 amit.gupta 1448
			LOGGER.info("Scheme Amount mismatched for Date {}", date);
24587 amit.gupta 1449
 
1450
			Map<Integer, Double> inventoryItemSchemeIO = siosCreated.stream().collect(Collectors
1451
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
1452
 
1453
			Map<Integer, Double> userSchemeMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIO.keySet())
1454
					.stream().collect(Collectors.groupingBy(x -> x.getFofoId(),
1455
							Collectors.summingDouble(x -> inventoryItemSchemeIO.get(x.getId()))));
1456
 
1457
			Map<Integer, Double> inventoryItemSchemeIORefunded = siosRefunded.stream().collect(Collectors
1458
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
1459
 
1460
			Map<Integer, Double> userSchemeRefundedMap = inventoryItemRepository
1461
					.selectByIds(inventoryItemSchemeIORefunded.keySet()).stream()
1462
					.collect(Collectors.groupingBy(x -> x.getFofoId(),
1463
							Collectors.summingDouble(x -> inventoryItemSchemeIORefunded.get(x.getId()))));
1464
 
1465
			Map<Integer, Double> finalUserSchemeAmountMap = new HashMap<>();
26092 amit.gupta 1466
 
24587 amit.gupta 1467
			for (Map.Entry<Integer, Double> schemeAmount : userSchemeRefundedMap.entrySet()) {
1468
				if (!finalUserSchemeAmountMap.containsKey(schemeAmount.getKey())) {
1469
					finalUserSchemeAmountMap.put(schemeAmount.getKey(), schemeAmount.getValue());
1470
				} else {
1471
					finalUserSchemeAmountMap.put(schemeAmount.getKey(),
1472
							finalUserSchemeAmountMap.get(schemeAmount.getKey()) + schemeAmount.getValue());
1473
				}
1474
			}
24590 amit.gupta 1475
			Map<Integer, Integer> userWalletMap = userWalletRepository
1476
					.selectByRetailerIds(finalUserSchemeAmountMap.keySet()).stream()
1477
					.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1478
 
24587 amit.gupta 1479
			Map<Integer, Double> walletAmountMap = history.stream().collect(Collectors.groupingBy(
1480
					UserWalletHistory::getWalletId, Collectors.summingDouble((UserWalletHistory::getAmount))));
1481
			for (Map.Entry<Integer, Double> userAmount : walletAmountMap.entrySet()) {
1482
				double diff = Math.abs(finalUserSchemeAmountMap.get(userAmount.getKey()) - userAmount.getValue());
1483
				if (diff > 5) {
1484
					LOGGER.info("Partner scheme mismatched for Userid {}", userWalletMap.get(userAmount.getKey()));
1485
				}
1486
			}
24580 amit.gupta 1487
		}
24587 amit.gupta 1488
 
24580 amit.gupta 1489
	}
24590 amit.gupta 1490
 
24592 amit.gupta 1491
	public void dryRunSchemeReco() throws Exception {
24635 amit.gupta 1492
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1493
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1494
 
24592 amit.gupta 1495
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1496
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24635 amit.gupta 1497
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1498
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
1499
		Set<String> serialNumbersConsidered = new HashSet<>();
1500
 
25096 amit.gupta 1501
		LocalDateTime startDate = LocalDate.of(2018, 3, 1).atStartOfDay();
24635 amit.gupta 1502
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
1503
		List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
1504
 
24683 amit.gupta 1505
		Map<Integer, String> storeNameMap = fofoStoreRepository.getStoresMap();
24635 amit.gupta 1506
		purchases.stream().forEach(purchase -> {
1507
			float amountToRollback = 0;
1508
			String description = "Adjustment of Duplicate Scheme for Purchase Invoice "
1509
					+ purchase.getPurchaseReference();
1510
			Map<Integer, String> inventorySerialNumberMap = inventoryItemRepository.selectByPurchaseId(purchase.getId())
1511
					.stream().filter(ii -> ii.getSerialNumber() != null)
1512
					.collect(Collectors.toMap(InventoryItem::getId, InventoryItem::getSerialNumber));
1513
			if (inventorySerialNumberMap.size() > 0) {
1514
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1515
					String serialNumber = inventorySerialNumberEntry.getValue();
1516
					int inventoryItemId = inventorySerialNumberEntry.getKey();
1517
					if (serialNumbersConsidered.contains(serialNumber)) {
1518
						// This will rollback scheme for differenct orders for same serial
1519
						List<SchemeInOut> sios = schemeInOutRepository
1520
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
1521
								.filter(x -> x.getRolledBackTimestamp() == null
1522
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
1523
								.collect(Collectors.toList());
1524
						Collections.reverse(sios);
1525
						for (SchemeInOut sio : sios) {
1526
							sio.setRolledBackTimestamp(LocalDateTime.now());
1527
							amountToRollback += sio.getAmount();
1528
							// sio.setSchemeType(SchemeType.OUT);
1529
							sio.setSerialNumber(serialNumber);
1530
							rolledbackSios.add(sio);
1531
						}
1532
						description = description.concat(" " + serialNumber + " ");
1533
					} else {
1534
						serialNumbersConsidered.add(serialNumber);
1535
						List<Integer> schemesConsidered = new ArrayList<>();
1536
						List<SchemeInOut> sios = schemeInOutRepository
1537
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
1538
								.filter(x -> x.getRolledBackTimestamp() == null
1539
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
1540
								.collect(Collectors.toList());
1541
						Collections.reverse(sios);
1542
						for (SchemeInOut sio : sios) {
1543
							if (!schemesConsidered.contains(sio.getSchemeId())) {
1544
								schemesConsidered.add(sio.getSchemeId());
1545
								continue;
1546
							}
1547
							sio.setRolledBackTimestamp(LocalDateTime.now());
1548
							amountToRollback += sio.getAmount();
1549
							// sio.setSchemeType(SchemeType.OUT);
1550
							sio.setSerialNumber(serialNumber);
24681 amit.gupta 1551
							sio.setStoreCode(storeNameMap.get(purchase.getFofoId()));
1552
							sio.setReference(purchase.getId());
24635 amit.gupta 1553
							rolledbackSios.add(sio);
1554
						}
1555
					}
1556
 
1557
				}
1558
			}
1559
			if (amountToRollback > 0) {
24683 amit.gupta 1560
				// Address address =
1561
				// addressRepository.selectAllByRetailerId(purchase.getFofoId(), 0, 10).get(0);
24635 amit.gupta 1562
				UserWalletHistory uwh = new UserWalletHistory();
1563
				uwh.setAmount(Math.round(amountToRollback));
1564
				uwh.setDescription(description);
1565
				uwh.setTimestamp(LocalDateTime.now());
24681 amit.gupta 1566
				uwh.setReferenceType(WalletReferenceType.SCHEME_IN);
24635 amit.gupta 1567
				uwh.setReference(purchase.getId());
1568
				uwh.setWalletId(userWalletMap.get(purchase.getFofoId()));
1569
				uwh.setFofoId(purchase.getFofoId());
24681 amit.gupta 1570
				uwh.setStoreCode(storeNameMap.get(purchase.getFofoId()));
24635 amit.gupta 1571
				userWalletHistory.add(uwh);
1572
			}
1573
		});
1574
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1575
				Arrays.asList("User Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
1576
						"Timestamp"),
1577
				userWalletHistory.stream()
1578
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
1579
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
1580
						.collect(Collectors.toList()));
1581
 
1582
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
24683 amit.gupta 1583
				Arrays.asList("Scheme ID", "SchemeType", "Reference", "Store Code", "Serial Number", "Amount",
1584
						"Created", "Rolledback"),
24635 amit.gupta 1585
				rolledbackSios.stream()
24681 amit.gupta 1586
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getReference(), x.getStoreCode(),
24635 amit.gupta 1587
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1588
						.collect(Collectors.toList()));
1589
 
30752 tejbeer 1590
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24636 amit.gupta 1591
				"Partner Excess Amount Scheme In", "PFA",
30752 tejbeer 1592
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1593
						new Attachment("SchemeInRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24635 amit.gupta 1594
 
25096 amit.gupta 1595
		throw new Exception();
24635 amit.gupta 1596
 
1597
	}
1598
 
1599
	public void dryRunOutSchemeReco() throws Exception {
1600
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1601
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24606 amit.gupta 1602
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1603
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24590 amit.gupta 1604
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1605
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
25028 amit.gupta 1606
		LocalDateTime startDate = LocalDate.of(2019, 5, 1).atStartOfDay();
24632 amit.gupta 1607
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
24631 amit.gupta 1608
		List<FofoOrder> allOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
1609
		// Collections.reverse(allOrders);
1610
		// List<FofoOrder> allOrders =
24653 govind 1611
		// List<FofoOrder> allOrders =
24631 amit.gupta 1612
		// Arrays.asList(fofoOrderRepository.selectByInvoiceNumber("UPGZ019/25"));
24625 amit.gupta 1613
		Set<String> serialNumbersConsidered = new HashSet<>();
24590 amit.gupta 1614
		allOrders.stream().forEach(fofoOrder -> {
24592 amit.gupta 1615
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
24598 amit.gupta 1616
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
24592 amit.gupta 1617
			float amountToRollback = 0;
24590 amit.gupta 1618
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1619
			orderItems.forEach(x -> {
24606 amit.gupta 1620
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
24598 amit.gupta 1621
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
24590 amit.gupta 1622
			});
24606 amit.gupta 1623
			if (inventorySerialNumberMap.size() > 0) {
24631 amit.gupta 1624
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1625
					String serialNumber = inventorySerialNumberEntry.getValue();
1626
					int inventoryItemId = inventorySerialNumberEntry.getKey();
1627
					if (serialNumbersConsidered.contains(serialNumber)) {
1628
						// This will rollback scheme for differenct orders for same serial
1629
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1630
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1631
								.filter(x -> x.getRolledBackTimestamp() == null
1632
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1633
								.collect(Collectors.toList());
1634
						Collections.reverse(sios);
1635
						for (SchemeInOut sio : sios) {
1636
							sio.setRolledBackTimestamp(LocalDateTime.now());
1637
							amountToRollback += sio.getAmount();
1638
							// sio.setSchemeType(SchemeType.OUT);
1639
							sio.setSerialNumber(serialNumber);
1640
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
24681 amit.gupta 1641
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1642
							rolledbackSios.add(sio);
24623 amit.gupta 1643
						}
24635 amit.gupta 1644
						description = description.concat(" " + serialNumber + " ");
24631 amit.gupta 1645
					} else {
1646
						serialNumbersConsidered.add(serialNumber);
1647
						List<Integer> schemesConsidered = new ArrayList<>();
1648
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1649
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1650
								.filter(x -> x.getRolledBackTimestamp() == null
1651
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1652
								.collect(Collectors.toList());
1653
						Collections.reverse(sios);
1654
						for (SchemeInOut sio : sios) {
1655
							if (!schemesConsidered.contains(sio.getSchemeId())) {
1656
								schemesConsidered.add(sio.getSchemeId());
1657
								continue;
1658
							}
1659
							sio.setRolledBackTimestamp(LocalDateTime.now());
1660
							amountToRollback += sio.getAmount();
1661
							// sio.setSchemeType(SchemeType.OUT);
24681 amit.gupta 1662
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1663
							sio.setSerialNumber(serialNumber);
1664
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1665
							rolledbackSios.add(sio);
1666
						}
24615 amit.gupta 1667
					}
24631 amit.gupta 1668
 
24604 amit.gupta 1669
				}
24590 amit.gupta 1670
			}
24631 amit.gupta 1671
			if (amountToRollback > 0) {
1672
				UserWalletHistory uwh = new UserWalletHistory();
1673
				uwh.setAmount(Math.round(amountToRollback));
1674
				uwh.setDescription(description);
1675
				uwh.setTimestamp(LocalDateTime.now());
1676
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1677
				uwh.setReference(fofoOrder.getId());
1678
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1679
				uwh.setFofoId(fofoOrder.getFofoId());
1680
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1681
				userWalletHistory.add(uwh);
1682
			}
24590 amit.gupta 1683
		});
24598 amit.gupta 1684
 
24592 amit.gupta 1685
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
24681 amit.gupta 1686
				Arrays.asList("Wallet Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
24615 amit.gupta 1687
						"Timestamp"),
1688
				userWalletHistory.stream()
1689
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
1690
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24592 amit.gupta 1691
						.collect(Collectors.toList()));
1692
 
1693
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1694
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1695
						"Rolledback"),
1696
				rolledbackSios.stream()
1697
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1698
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1699
						.collect(Collectors.toList()));
1700
 
30752 tejbeer 1701
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24681 amit.gupta 1702
				"Partner Excess Amount Scheme Out", "PFA",
30752 tejbeer 1703
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1704
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1705
 
25267 amit.gupta 1706
		throw new Exception();
24590 amit.gupta 1707
	}
24615 amit.gupta 1708
 
24611 amit.gupta 1709
	public void dryRunSchemeOutReco1() throws Exception {
24615 amit.gupta 1710
		List<Integer> references = Arrays.asList(6744, 7347, 8320, 8891, 9124, 9217, 9263, 9379);
24611 amit.gupta 1711
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1712
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
1713
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1714
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1715
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1716
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
1717
		references.stream().forEach(reference -> {
1718
			FofoOrder fofoOrder = null;
1719
			try {
1720
				fofoOrder = fofoOrderRepository.selectByOrderId(reference);
24615 amit.gupta 1721
			} catch (Exception e) {
1722
 
24611 amit.gupta 1723
			}
1724
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
1725
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
1726
			float amountToRollback = 0;
1727
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1728
			orderItems.forEach(x -> {
1729
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
1730
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
1731
			});
1732
			if (inventorySerialNumberMap.size() > 0) {
24615 amit.gupta 1733
				List<SchemeInOut> sios = schemeInOutRepository
1734
						.selectByInventoryItemIds(inventorySerialNumberMap.keySet()).stream()
1735
						.filter(x -> schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24611 amit.gupta 1736
						.collect(Collectors.toList());
1737
				LOGGER.info("Found {} duplicate schemeouts for Orderid {}", sios.size(), fofoOrder.getId());
1738
				UserWalletHistory uwh = new UserWalletHistory();
24615 amit.gupta 1739
				Map<Integer, List<SchemeInOut>> inventoryIdSouts = sios.stream()
1740
						.collect(Collectors.groupingBy(SchemeInOut::getInventoryItemId, Collectors.toList()));
24611 amit.gupta 1741
				for (Map.Entry<Integer, List<SchemeInOut>> inventorySioEntry : inventoryIdSouts.entrySet()) {
1742
					List<SchemeInOut> outList = inventorySioEntry.getValue();
24615 amit.gupta 1743
					if (outList.size() > 1) {
1744
 
24611 amit.gupta 1745
					}
1746
				}
1747
				uwh.setAmount(Math.round(amountToRollback));
1748
				uwh.setDescription(description);
1749
				uwh.setTimestamp(LocalDateTime.now());
1750
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1751
				uwh.setReference(fofoOrder.getId());
1752
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1753
				uwh.setFofoId(fofoOrder.getFofoId());
1754
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1755
				userWalletHistory.add(uwh);
1756
			}
1757
		});
24615 amit.gupta 1758
 
24611 amit.gupta 1759
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1760
				Arrays.asList("User Id", "Reference Type", "Reference", "Amount", "Description", "Timestamp"),
1761
				userWalletHistory.stream().map(x -> Arrays.asList(x.getWalletId(), x.getReferenceType(),
30752 tejbeer 1762
						x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24615 amit.gupta 1763
						.collect(Collectors.toList()));
1764
 
24611 amit.gupta 1765
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1766
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1767
						"Rolledback"),
1768
				rolledbackSios.stream()
24615 amit.gupta 1769
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1770
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1771
						.collect(Collectors.toList()));
1772
 
24623 amit.gupta 1773
		Utils.sendMailWithAttachments(googleMailSender,
30752 tejbeer 1774
				new String[] { "amit.gupta@shop2020.in", "neeraj.gupta@smartdukaan.com" }, null,
24611 amit.gupta 1775
				"Partner Excess Amount", "PFA",
30752 tejbeer 1776
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1777
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1778
 
24628 amit.gupta 1779
		throw new Exception();
24615 amit.gupta 1780
 
24611 amit.gupta 1781
	}
24615 amit.gupta 1782
 
26945 amit.gupta 1783
	public void sendDailySalesNotificationToPartner(Integer fofoIdInt) throws Exception {
25927 amit.gupta 1784
 
24653 govind 1785
		LocalDateTime now = LocalDateTime.now();
25837 amit.gupta 1786
		LocalDateTime from = now.with(LocalTime.MIN);
25925 amit.gupta 1787
		String timeString = "Today %s";
25927 amit.gupta 1788
		// Send yesterday's report
27007 amit.gupta 1789
		/*
1790
		 * if (now.getHour() < 13) { timeString = "Yesterday %s"; from =
1791
		 * now.minusDays(1).; now = from.with(LocalTime.MAX);
30393 amit.gupta 1792
		 *
27007 amit.gupta 1793
		 * }
1794
		 */
24855 amit.gupta 1795
		List<Integer> fofoIds = null;
25043 amit.gupta 1796
		if (fofoIdInt == null) {
1797
			fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId())
1798
					.collect(Collectors.toList());
24856 amit.gupta 1799
		} else {
24855 amit.gupta 1800
			fofoIds = Arrays.asList(fofoIdInt);
1801
		}
25912 amit.gupta 1802
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
24683 amit.gupta 1803
 
25865 amit.gupta 1804
		Map<Integer, Float> partnerPolicyAmountMap = insurancePolicyRepository.selectAmountSumGroupByRetailerId(now,
1805
				null);
1806
		Map<Integer, Long> partnerPolicyQtyMap = insurancePolicyRepository.selectQtyGroupByRetailerId(now, null);
26945 amit.gupta 1807
 
1808
		Map<Integer, Double> spPartnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0,
1809
				true);
1810
 
1811
		Map<Integer, Double> spPartner3DaysOrderValMap = fofoOrderItemRepository
1812
				.selectSumAmountGroupByRetailer(from.minusDays(3), now, 0, true);
26941 amit.gupta 1813
		Map<Integer, Long> spPartnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, true);
1814
 
26945 amit.gupta 1815
		Map<Integer, Double> partnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0,
1816
				false);
26941 amit.gupta 1817
		Map<Integer, Long> partnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, false);
26945 amit.gupta 1818
 
25865 amit.gupta 1819
		Map<Integer, SaleTargetReportModel> saleTargetReportModelMap = new HashMap<>();
1820
		for (int fofoId : fofoIds) {
1821
			SaleTargetReportModel model = new SaleTargetReportModel();
25927 amit.gupta 1822
			model.setInsuranceSale(
1823
					partnerPolicyAmountMap.containsKey(fofoId) ? partnerPolicyAmountMap.get(fofoId).doubleValue() : 0);
25865 amit.gupta 1824
			model.setInsruanceQty(partnerPolicyQtyMap.containsKey(fofoId) ? partnerPolicyQtyMap.get(fofoId) : 0);
26941 amit.gupta 1825
			model.setSmartphoneSale(spPartnerOrderValMap.containsKey(fofoId) ? spPartnerOrderValMap.get(fofoId) : 0);
1826
			model.setSmartphoneQty(spPartnerOrderQtyMap.containsKey(fofoId) ? spPartnerOrderQtyMap.get(fofoId) : 0);
1827
			model.setTotalSale(partnerOrderValMap.containsKey(fofoId) ? partnerOrderValMap.get(fofoId) : 0);
1828
			model.setTotalQty(partnerOrderQtyMap.containsKey(fofoId) ? partnerOrderQtyMap.get(fofoId) : 0);
26945 amit.gupta 1829
			model.setPast3daysSale(
1830
					spPartner3DaysOrderValMap.containsKey(fofoId) ? spPartner3DaysOrderValMap.get(fofoId) : 0);
25880 amit.gupta 1831
			model.setFofoId(fofoId);
25865 amit.gupta 1832
			saleTargetReportModelMap.put(fofoId, model);
1833
		}
25880 amit.gupta 1834
 
26945 amit.gupta 1835
		Map<Integer, FofoReportingModel> partnerSalesHeadersMap = this.getPartnerIdSalesHeaders();
24653 govind 1836
		for (Integer fofoId : fofoIds) {
25865 amit.gupta 1837
			SaleTargetReportModel model = saleTargetReportModelMap.get(fofoId);
30982 tejbeer 1838
 
31169 tejbeer 1839
			// com.spice.profitmandi.dao.entity.user.User user =
1840
			// userUserRepository.selectById(fofoId);
30982 tejbeer 1841
 
31169 tejbeer 1842
			// Address address = addressRepository.selectById(user.getAddressId());
30982 tejbeer 1843
 
1844
			String title = "Sale Update";
1845
			String messageTemplate = String.format("Smartphones Rs.%.0f, Insurance Rs.%.0f, Total Rs.%.0f till %s.",
1846
					model.getSmartphoneSale(), model.getInsuranceSale(), model.getTotalSale(),
1847
					String.format(timeString, now.format(timeFormatter)));
25821 amit.gupta 1848
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
1849
			sendNotificationModel.setCampaignName("Sales update alert");
30982 tejbeer 1850
			sendNotificationModel.setTitle(title);
1851
			sendNotificationModel.setMessage(messageTemplate);
25821 amit.gupta 1852
			sendNotificationModel.setType("url");
27206 tejbeer 1853
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25821 amit.gupta 1854
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
1855
			sendNotificationModel.setMessageType(MessageType.notification);
25872 tejbeer 1856
			int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
1857
			sendNotificationModel.setUserIds(Arrays.asList(userId));
25854 amit.gupta 1858
			notificationService.sendNotification(sendNotificationModel);
30999 tejbeer 1859
			String whatsappMessageTemplate = String.format(
1860
					"Dear Partner, Your sale update is Smartphones Rs.%.0f, Insurance Rs.%.0f, Total Rs.%.0f till %s.",
1861
					model.getSmartphoneSale(), model.getInsuranceSale(), model.getTotalSale(),
1862
					String.format(timeString, now.format(timeFormatter)));
31169 tejbeer 1863
			// notificationService.sendWhatsappMessage(whatsappMessageTemplate, title,
1864
			// address.getPhoneNumber());
30982 tejbeer 1865
 
24653 govind 1866
		}
26945 amit.gupta 1867
		// String saleReport = this.getDailySalesReportHtml(partnerSalesHeadersMap,
1868
		// saleTargetReportModelMap);
31169 tejbeer 1869
		this.getStateWiseSales(saleTargetReportModelMap, partnerSalesHeadersMap);
1870
		/*
1871
		 * String cc[] = { "tarun.verma@smartdukaan.com",
1872
		 * "kamini.sharma@smartdukaan.com", "niranjan.kala@smartdukaan.com",
1873
		 * "sm@smartdukaan.com" };
1874
		 *
1875
		 * String subject = String.format("Sale till %s", String.format(timeString,
1876
		 * now.format(timeFormatter))); //
1877
		 * this.sendMailOfHtmlFomat("amit.gupta@smartukaan.com", saleReport, cc, //
1878
		 * subject); this.sendMailOfHtmlFormat("amit.gupta@smartdukaan.com",
1879
		 * statewiseSaleReport, cc, "Statewise" + subject);
1880
		 */
24653 govind 1881
	}
1882
 
31332 amit.gupta 1883
 
1884
 
28377 tejbeer 1885
	public void checkRazorPayPaymentStatus() throws Exception {
28368 tejbeer 1886
		List<PendingOrder> pendingOrder = pendingOrderRepository
1887
				.selectAllByStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PENDING);
1888
 
1889
		for (PendingOrder po : pendingOrder) {
1890
			RazorPay razorPay = razorPayRepository.selectByOrdeId(po.getId());
28377 tejbeer 1891
			List<PendingOrderItem> poItems = pendingOrderItemRepository.selectByOrderId(po.getId());
28368 tejbeer 1892
 
28369 tejbeer 1893
			LOGGER.info("razorPay" + razorPay);
1894
			if (razorPay != null) {
1895
				List<Payment> payments = razorPaymentService.fetchOrderForPayment(razorPay.getRazorOrderId());
28377 tejbeer 1896
 
28369 tejbeer 1897
				if (!payments.isEmpty()) {
28377 tejbeer 1898
					List<String> statusList = new ArrayList<>();
28369 tejbeer 1899
					for (Payment payment : payments) {
28368 tejbeer 1900
 
28377 tejbeer 1901
						JSONObject jsonObj = new JSONObject(payment.toString());
1902
 
1903
						String status = jsonObj.getString("status");
1904
 
1905
						statusList.add(status);
1906
 
28369 tejbeer 1907
					}
28377 tejbeer 1908
					LOGGER.info("statusList" + statusList);
28368 tejbeer 1909
 
28377 tejbeer 1910
					if (statusList.contains("authorized") || statusList.contains("captured")) {
1911
						po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
1912
						po.setPaidAmount(po.getTotalAmount());
1913
						for (PendingOrderItem poi : poItems) {
1914
							poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
1915
						}
1916
						Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(po);
1917
 
1918
						CustomRetailer customRetailer = retailerService.getFofoRetailer(po.getFofoId());
1919
						Customer customer = customerRepository.selectById(po.getCustomerId());
1920
						String[] customerEmail = null;
1921
						if (customer.getEmailId() != null) {
30752 tejbeer 1922
							customerEmail = new String[] { customer.getEmailId() };
28377 tejbeer 1923
						}
1924
						List<String> bccTo = Arrays.asList("kamini.sharma@smartdukaan.com",
28467 tejbeer 1925
								"tarun.verma@smartdukaan.com", "niranjan.kala@smartdukaan.com", "sm@smartdukaan.com",
1926
								"tejbeer.kaur@shop2020.in", customRetailer.getEmail());
28377 tejbeer 1927
						List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
1928
						if (authUserEmails != null) {
1929
							authUserEmails = new ArrayList<>();
1930
						}
1931
						authUserEmails.addAll(bccTo);
1932
 
28382 tejbeer 1933
						// emailService.sendMailWithAttachments("Order Created with SmartDukaan",
1934
						// "order-confirm.vm",
1935
						// emailModel, customerEmail, null, authUserEmails.toArray(new String[0]));
28377 tejbeer 1936
 
1937
					} else if (statusList.contains("refunded") || statusList.contains("failed")) {
1938
						for (PendingOrderItem poi : poItems) {
1939
							poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
1940
						}
1941
 
1942
						po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
1943
					}
1944
 
28369 tejbeer 1945
				}
28377 tejbeer 1946
				// LOGGER.info("payment" + payments);
28369 tejbeer 1947
 
1948
			}
28368 tejbeer 1949
		}
1950
	}
1951
 
25865 amit.gupta 1952
	public static class SaleTargetReportModel {
1953
		private double totalSale;
26941 amit.gupta 1954
		private long totalQty;
26945 amit.gupta 1955
		private double past3daysSale;
25880 amit.gupta 1956
		private int fofoId;
1957
 
1958
		public int getFofoId() {
1959
			return fofoId;
1960
		}
1961
 
1962
		public void setFofoId(int fofoId) {
1963
			this.fofoId = fofoId;
1964
		}
1965
 
25865 amit.gupta 1966
		private double smartphoneSale;
1967
		private long smartphoneQty;
1968
		private double insuranceSale;
1969
		private long insruanceQty;
1970
 
26941 amit.gupta 1971
		public long getTotalQty() {
1972
			return totalQty;
1973
		}
1974
 
1975
		public void setTotalQty(long totalQty) {
1976
			this.totalQty = totalQty;
1977
		}
1978
 
26945 amit.gupta 1979
		public double getPast3daysSale() {
1980
			return past3daysSale;
1981
		}
1982
 
1983
		public void setPast3daysSale(double past3daysSale) {
1984
			this.past3daysSale = past3daysSale;
1985
		}
1986
 
25865 amit.gupta 1987
		@Override
1988
		public int hashCode() {
1989
			final int prime = 31;
1990
			int result = 1;
25880 amit.gupta 1991
			result = prime * result + fofoId;
25865 amit.gupta 1992
			result = prime * result + (int) (insruanceQty ^ (insruanceQty >>> 32));
1993
			long temp;
1994
			temp = Double.doubleToLongBits(insuranceSale);
1995
			result = prime * result + (int) (temp ^ (temp >>> 32));
1996
			result = prime * result + (int) (smartphoneQty ^ (smartphoneQty >>> 32));
1997
			temp = Double.doubleToLongBits(smartphoneSale);
1998
			result = prime * result + (int) (temp ^ (temp >>> 32));
26941 amit.gupta 1999
			result = prime * result + (int) (totalQty ^ (totalQty >>> 32));
25865 amit.gupta 2000
			temp = Double.doubleToLongBits(totalSale);
2001
			result = prime * result + (int) (temp ^ (temp >>> 32));
2002
			return result;
2003
		}
2004
 
2005
		@Override
2006
		public boolean equals(Object obj) {
2007
			if (this == obj)
2008
				return true;
2009
			if (obj == null)
2010
				return false;
2011
			if (getClass() != obj.getClass())
2012
				return false;
2013
			SaleTargetReportModel other = (SaleTargetReportModel) obj;
25880 amit.gupta 2014
			if (fofoId != other.fofoId)
2015
				return false;
25865 amit.gupta 2016
			if (insruanceQty != other.insruanceQty)
2017
				return false;
2018
			if (Double.doubleToLongBits(insuranceSale) != Double.doubleToLongBits(other.insuranceSale))
2019
				return false;
2020
			if (smartphoneQty != other.smartphoneQty)
2021
				return false;
2022
			if (Double.doubleToLongBits(smartphoneSale) != Double.doubleToLongBits(other.smartphoneSale))
2023
				return false;
26941 amit.gupta 2024
			if (totalQty != other.totalQty)
2025
				return false;
25865 amit.gupta 2026
			if (Double.doubleToLongBits(totalSale) != Double.doubleToLongBits(other.totalSale))
2027
				return false;
2028
			return true;
2029
		}
2030
 
2031
		public double getTotalSale() {
2032
			return totalSale;
2033
		}
2034
 
2035
		public void setTotalSale(double totalSale) {
2036
			this.totalSale = totalSale;
2037
		}
2038
 
2039
		public double getSmartphoneSale() {
2040
			return smartphoneSale;
2041
		}
2042
 
2043
		public void setSmartphoneSale(double smartphoneSale) {
2044
			this.smartphoneSale = smartphoneSale;
2045
		}
2046
 
2047
		public long getSmartphoneQty() {
2048
			return smartphoneQty;
2049
		}
2050
 
2051
		public void setSmartphoneQty(long smartphoneQty) {
2052
			this.smartphoneQty = smartphoneQty;
2053
		}
2054
 
2055
		public double getInsuranceSale() {
2056
			return insuranceSale;
2057
		}
2058
 
2059
		public void setInsuranceSale(double insuranceSale) {
2060
			this.insuranceSale = insuranceSale;
2061
		}
2062
 
2063
		public long getInsruanceQty() {
2064
			return insruanceQty;
2065
		}
2066
 
2067
		public void setInsruanceQty(long insruanceQty) {
2068
			this.insruanceQty = insruanceQty;
2069
		}
2070
 
2071
		@Override
2072
		public String toString() {
26945 amit.gupta 2073
			return "SaleTargetReportModel [totalSale=" + totalSale + ", totalQty=" + totalQty + ", past3daysSale="
2074
					+ past3daysSale + ", fofoId=" + fofoId + ", smartphoneSale=" + smartphoneSale + ", smartphoneQty="
2075
					+ smartphoneQty + ", insuranceSale=" + insuranceSale + ", insruanceQty=" + insruanceQty + "]";
25865 amit.gupta 2076
		}
2077
 
2078
	}
2079
 
31169 tejbeer 2080
	private void getStateWiseSales(Map<Integer, SaleTargetReportModel> saleTargetReportModelMap,
30752 tejbeer 2081
			Map<Integer, FofoReportingModel> partnerSalesHeadersMap) throws Exception {
31169 tejbeer 2082
		String timeString = "Today %s";
2083
		LocalDateTime now = LocalDateTime.now();
25872 tejbeer 2084
 
31169 tejbeer 2085
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
2086
		List<Integer> categoryIds = Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_LOGISTICS,
2087
				ProfitMandiConstants.TICKET_CATEGORY_FINANCIAL_SERVICES, ProfitMandiConstants.TICKET_CATEGORY_CATEGORY,
2088
				ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_SALES,
2089
				ProfitMandiConstants.TICKET_CATEGORY_MARKETING, ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS,
2090
				ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT,
2091
				ProfitMandiConstants.TICKET_CATEGORY_TECHNOLOGY);
26945 amit.gupta 2092
 
31169 tejbeer 2093
		Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds);
30765 tejbeer 2094
 
31169 tejbeer 2095
		for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
2096
			String email = storeGuyEntry.getKey();
2097
			Set<Integer> fofoIds = storeGuyEntry.getValue();
2098
			LOGGER.info("fofoIds {}", fofoIds);
24683 amit.gupta 2099
 
31169 tejbeer 2100
			if (!fofoIds.isEmpty()) {
2101
				List<FofoStore> stores = fofoStoreRepository
2102
						.selectActivePartnersByRetailerIds(new ArrayList<>(fofoIds));
26945 amit.gupta 2103
 
31169 tejbeer 2104
				Map<String, List<Integer>> stateMap = stores.stream().collect(Collectors.groupingBy(
2105
						x -> x.getCode().substring(0, 2), Collectors.mapping(x -> x.getId(), Collectors.toList())));
2106
				List<List<Serializable>> stateWiseSales = new ArrayList<>();
2107
				for (Map.Entry<String, List<Integer>> stateMapEntry : stateMap.entrySet()) {
2108
					long totalQty = stateMapEntry.getValue().stream()
2109
							.collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getTotalQty()));
2110
					double totalSale = stateMapEntry.getValue().stream()
2111
							.collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getTotalSale()));
2112
					long smartPhoneQty = stateMapEntry.getValue().stream()
2113
							.collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getSmartphoneQty()));
2114
					double smartPhoneSale = stateMapEntry.getValue().stream().collect(
2115
							Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getSmartphoneSale()));
2116
					stateWiseSales.add(
2117
							Arrays.asList(stateMapEntry.getKey(), smartPhoneQty, smartPhoneSale, totalQty, totalSale));
2118
				}
2119
				StringBuilder sb = new StringBuilder();
2120
				sb.append("<html><body>");
2121
				sb.append("<p>Statewise Sale Report:</p><br/><table style='border:1px solid black';cellspacing=0>");
2122
				sb.append("<tbody>\n" + "	    <tr>"
2123
						+ "	    					<th style='border:1px solid black;padding: 5px'>State</th>"
2124
						+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Qty</th>"
2125
						+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Value</th>"
2126
						+ "	    					<th style='border:1px solid black;padding: 5px'>Total Qty</th>"
2127
						+ "	    					<th style='border:1px solid black;padding: 5px'>Total Value</th>"
2128
						+ "	    				</tr>");
2129
				for (List<Serializable> stateSale : stateWiseSales) {
2130
					sb.append("<tr>");
2131
					sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(0) + "</td>");
2132
					sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(1) + "</td>");
2133
					sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(2) + "</td>");
2134
					sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(3) + "</td>");
2135
					sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(4) + "</td>");
2136
					sb.append("</tr>");
2137
				}
2138
				sb.append("</tbody></table><br><br>");
26945 amit.gupta 2139
 
31169 tejbeer 2140
				sb.append("<p>Sale Report:</p><br/><table style='border:1px solid black';cellspacing=0>");
2141
				sb.append("<tbody>\n" + "	    				<tr>\n"
2142
						+ "	    					<th style='border:1px solid black;padding: 5px'>Code</th>"
2143
						+ "	    					<th style='border:1px solid black;padding: 5px'>Business Name</th>"
2144
						+ "	    					<th style='border:1px solid black;padding: 5px'>Regional Manager</th>"
2145
						+ "	    					<th style='border:1px solid black;padding: 5px'>Territory Manager</th>"
2146
						+ "	    					<th style='border:1px solid black;padding: 5px'>Sale</th>"
2147
						+ "	    					<th style='border:1px solid black;padding: 5px'>Smartphone Sale</th>"
2148
						+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Qty</th>"
2149
						+ "	    				</tr>");
2150
 
2151
				/*
2152
				 * List<Integer> sortedPartnerSalesHeaders =
2153
				 * partnerSalesHeadersMap.values().stream()
2154
				 * .sorted(Comparator.comparing(FofoReportingModel::getCode)
2155
				 * .thenComparing(FofoReportingModel::getRegionalManager)
2156
				 * .thenComparing(FofoReportingModel::getTerritoryManager))
2157
				 * .map(FofoReportingModel::getFofoId).collect(Collectors.toList());
2158
				 */
2159
 
2160
				List<Integer> sortedSaleTargetReport = saleTargetReportModelMap.values().stream()
2161
						.filter(x -> fofoIds.contains(x.getFofoId()))
2162
						.sorted(Comparator.comparing(SaleTargetReportModel::getTotalSale))
2163
						.map(SaleTargetReportModel::getFofoId).collect(Collectors.toList());
2164
				for (Integer fofoId : sortedSaleTargetReport) {
2165
					if (saleTargetReportModelMap.get(fofoId).getPast3daysSale() == 0) {
2166
						sb.append("<tr style='background-color:red'>");
2167
					} else {
2168
						sb.append("<tr>");
2169
					}
2170
					sb.append("<td style='border:1px solid black;padding: 5px'>"
2171
							+ partnerSalesHeadersMap.get(fofoId).getCode() + "</td>");
2172
					sb.append("<td style='border:1px solid black;padding: 5px'>"
2173
							+ partnerSalesHeadersMap.get(fofoId).getBusinessName() + "</td>");
2174
					sb.append("<td style='border:1px solid black;padding: 5px'>"
2175
							+ partnerSalesHeadersMap.get(fofoId).getRegionalManager() + "</td>");
2176
					sb.append("<td style='border:1px solid black;padding: 5px'>"
2177
							+ partnerSalesHeadersMap.get(fofoId).getTerritoryManager() + "</td>");
2178
					sb.append("<td style='border:1px solid black;padding: 5px'>"
2179
							+ saleTargetReportModelMap.get(fofoId).getTotalSale() + "</td>");
2180
					sb.append("<td style='border:1px solid black;padding: 5px'>"
2181
							+ saleTargetReportModelMap.get(fofoId).getSmartphoneSale() + "</td>");
2182
					sb.append("<td style='border:1px solid black;padding: 5px'>"
2183
							+ saleTargetReportModelMap.get(fofoId).getSmartphoneQty() + "</td>");
2184
					sb.append("</tr>");
2185
				}
2186
 
2187
				sb.append("</tr>");
2188
 
2189
				sb.append("</body></html>");
2190
 
2191
				String statewiseSaleReport = sb.toString();
2192
 
2193
				String subject = String.format("Sale till %s", String.format(timeString, now.format(timeFormatter)));
2194
				// this.sendMailOfHtmlFomat("amit.gupta@smartukaan.com", saleReport, cc,
2195
				// subject);
2196
				this.sendMailOfHtmlFormat(email, statewiseSaleReport, null, "Statewise" + subject);
2197
			}
2198
		}
24653 govind 2199
	}
24841 govind 2200
 
26945 amit.gupta 2201
	private void sendMailOfHtmlFormat(String email, String body, String cc[], String subject)
24841 govind 2202
			throws MessagingException, ProfitMandiBusinessException, IOException {
2203
		MimeMessage message = mailSender.createMimeMessage();
2204
		MimeMessageHelper helper = new MimeMessageHelper(message);
2205
		helper.setSubject(subject);
2206
		helper.setText(body, true);
2207
		helper.setTo(email);
2208
		if (cc != null) {
2209
			helper.setCc(cc);
2210
		}
2211
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
2212
		helper.setFrom(senderAddress);
2213
		mailSender.send(message);
2214
	}
25300 tejbeer 2215
 
25351 tejbeer 2216
	public void sendNotification() throws Exception {
25300 tejbeer 2217
		List<PushNotifications> pushNotifications = pushNotificationRepository.selectAllByTimestamp();
2218
		if (!pushNotifications.isEmpty()) {
2219
			for (PushNotifications pushNotification : pushNotifications) {
25351 tejbeer 2220
				Device device = deviceRepository.selectById(pushNotification.getDeviceId());
25300 tejbeer 2221
				NotificationCampaign notificationCampaign = notificationCampaignRepository
2222
						.selectById(pushNotification.getNotificationCampaignid());
2223
				SimpleCampaignParams scp = gson.fromJson(notificationCampaign.getImplementationParams(),
2224
						SimpleCampaignParams.class);
2225
				Campaign campaign = new SimpleCampaign(scp);
25351 tejbeer 2226
				String result_url = campaign.getUrl() + "&user_id=" + device.getUser_id();
25300 tejbeer 2227
				JSONObject json = new JSONObject();
25351 tejbeer 2228
				json.put("to", device.getFcmId());
25300 tejbeer 2229
				JSONObject jsonObj = new JSONObject();
2230
				jsonObj.put("message", campaign.getMessage());
2231
				jsonObj.put("title", campaign.getTitle());
2232
				jsonObj.put("type", campaign.getType());
2233
				jsonObj.put("url", result_url);
2234
				jsonObj.put("time_to_live", campaign.getExpireTimestamp());
2235
				jsonObj.put("image", campaign.getImageUrl());
2236
				jsonObj.put("largeIcon", "large_icon");
2237
				jsonObj.put("smallIcon", "small_icon");
2238
				jsonObj.put("vibrate", 1);
2239
				jsonObj.put("pid", pushNotification.getId());
2240
				jsonObj.put("sound", 1);
2241
				jsonObj.put("priority", "high");
2242
				json.put("data", jsonObj);
25351 tejbeer 2243
				try {
2244
					CloseableHttpClient client = HttpClients.createDefault();
2245
					HttpPost httpPost = new HttpPost(FCM_URL);
25300 tejbeer 2246
 
25351 tejbeer 2247
					httpPost.setHeader("Content-Type", "application/json; utf-8");
2248
					httpPost.setHeader("authorization", "key=" + FCM_API_KEY);
2249
					StringEntity entity = new StringEntity(json.toString());
2250
					httpPost.setEntity(entity);
2251
					CloseableHttpResponse response = client.execute(httpPost);
25300 tejbeer 2252
 
25351 tejbeer 2253
					if (response.getStatusLine().getStatusCode() == 200) {
2254
						pushNotification.setSentTimestamp(LocalDateTime.now());
2255
					} else {
25356 tejbeer 2256
						pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
25778 amit.gupta 2257
						LOGGER.info("message" + "not sent");
26945 amit.gupta 2258
						response.toString();
25351 tejbeer 2259
					}
25300 tejbeer 2260
 
25351 tejbeer 2261
				} catch (Exception e) {
2262
					e.printStackTrace();
26443 amit.gupta 2263
					pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
26436 amit.gupta 2264
					LOGGER.info("message " + "not sent " + e.getMessage());
25300 tejbeer 2265
				}
2266
			}
2267
		}
2268
	}
2269
 
25553 amit.gupta 2270
	public void grouping() throws Exception {
25609 amit.gupta 2271
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yyyy hh:mm");
2272
		List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByStatus(PriceDropImeiStatus.APPROVED);
2273
		System.out.println(String.join("\t",
2274
				Arrays.asList("IMEI", "ItemId", "Brand", "Model Name", "Model Number", "Franchise Id", "Franchise Name",
25694 amit.gupta 2275
						"Grn On", "Price Dropped On", "Approved On", "Returned On", "Price Drop Paid", "Is Doa")));
26963 amit.gupta 2276
		Map<Integer, CustomRetailer> retailersMap = retailerService.getFofoRetailers(false);
25609 amit.gupta 2277
		for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
25694 amit.gupta 2278
			if (priceDropIMEI.getPartnerId() == 0)
2279
				continue;
25609 amit.gupta 2280
			HashSet<String> imeis = new HashSet<>();
2281
			PriceDrop priceDrop = priceDropRepository.selectById(priceDropIMEI.getPriceDropId());
2282
			imeis.add(priceDropIMEI.getImei());
2283
			List<InventoryItem> inventoryItems = inventoryItemRepository
2284
					.selectByFofoIdSerialNumbers(priceDropIMEI.getPartnerId(), imeis, false);
25694 amit.gupta 2285
			if (inventoryItems.size() == 0) {
2286
				LOGGER.info("Need to investigate partnerId - {} imeis - {}", priceDropIMEI.getPartnerId(), imeis);
25613 amit.gupta 2287
				continue;
25612 amit.gupta 2288
			}
25609 amit.gupta 2289
			InventoryItem inventoryItem = inventoryItems.get(0);
2290
			CustomRetailer customRetailer = retailersMap.get(inventoryItem.getFofoId());
2291
			if (inventoryItem.getLastScanType().equals(ScanType.DOA_OUT)
2292
					|| inventoryItem.getLastScanType().equals(ScanType.PURCHASE_RET)) {
2293
				// check if pricedrop has been rolled out
2294
				List<UserWalletHistory> uwh = walletService.getAllByReference(inventoryItem.getFofoId(),
2295
						priceDropIMEI.getPriceDropId(), WalletReferenceType.PRICE_DROP);
2296
				if (uwh.size() > 0) {
25615 amit.gupta 2297
					Item item = itemRepository.selectById(inventoryItem.getItemId());
30965 tejbeer 2298
					System.out.println(String.join("\t",
2299
							Arrays.asList(priceDropIMEI.getImei(), inventoryItem.getItemId() + "", item.getBrand(),
2300
									item.getModelName(), item.getModelNumber(), inventoryItem.getFofoId() + "",
2301
									customRetailer.getBusinessName(), inventoryItem.getCreateTimestamp().format(dtf),
2302
									priceDrop.getAffectedOn().format(dtf),
2303
									priceDropIMEI.getUpdateTimestamp().format(dtf),
2304
									inventoryItem.getUpdateTimestamp().format(dtf),
2305
									priceDrop.getAutoPartnerPayout(inventoryItem.getUpdateTimestamp()) + "",
2306
									inventoryItem.getLastScanType().equals(ScanType.DOA_OUT) + "")));
25609 amit.gupta 2307
				}
2308
			}
2309
		}
25503 amit.gupta 2310
	}
29668 tejbeer 2311
 
29566 amit.gupta 2312
	public void toffeeRollback() throws Exception {
2313
		toffeeService.cancelPolicyCopy("110143521986");
2314
		toffeeService.getOrderId("110143521986");
2315
	}
25694 amit.gupta 2316
 
27686 amit.gupta 2317
	public void attachToffeeInvoices() throws Exception {
28205 tejbeer 2318
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(3,
2319
				Optional.of(false));
2320
		for (InsurancePolicy insurancePolicy : insurancePolicies) {
27678 amit.gupta 2321
			String invoiceNumber = insurancePolicy.getInvoiceNumber();
2322
			FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
30321 amit.gupta 2323
			InvoicePdfModel pdfModel = orderService.getInvoicePdfModel(fofoOrder.getId());
27678 amit.gupta 2324
			java.io.ByteArrayOutputStream byteArrayOutputStream = new java.io.ByteArrayOutputStream();
2325
			PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
28205 tejbeer 2326
			String pdfInvoiceString = "data:application/pdf;base64,"
2327
					+ Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());
2328
			boolean attached = toffeeService.attachInvoice(insurancePolicy.getPolicyNumber().split("#")[1],
2329
					pdfInvoiceString);
2330
			if (attached) {
27678 amit.gupta 2331
				insurancePolicy.setPosted(true);
2332
			}
2333
		}
25694 amit.gupta 2334
	}
2335
 
30858 amit.gupta 2336
	public void sendBAGPendingPolicies() throws Exception {
2337
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(4,
2338
				Optional.of(false));
2339
		for (InsurancePolicy insurancePolicy : insurancePolicies) {
2340
			String invoiceNumber = insurancePolicy.getInvoiceNumber();
2341
			FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2342
			FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId()).get(0);
2343
			CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
2344
			Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
2345
			BAGInsuranceModel bagInsuranceModel = new BAGInsuranceModel();
30913 tejbeer 2346
			// bagInsuranceModel.setModelId();
30858 amit.gupta 2347
			bagInsuranceModel.setAddressLine1(customerAddress.getLine1());
2348
			bagInsuranceModel.setAddressLine2(customerAddress.getLine2());
2349
			bagInsuranceModel.setCity(customerAddress.getCity());
2350
			bagInsuranceModel.setBrandWarranty("1 Year");
2351
			Item item = itemRepository.selectById(fofoOrderItem.getId());
2352
			bagInsuranceModel.setModelName(item.getItemDescription());
2353
			bagInsuranceModel.setDateOfPurchase(fofoOrder.getFormattedDate());
2354
			bagInsuranceModel.setEmail(customer.getEmailId());
2355
			bagInsuranceModel.setImei1(insurancePolicy.getSerialNumber());
2356
			bagInsuranceModel.setFirstName(customer.getFirstName());
2357
			bagInsuranceModel.setLastName(customer.getLastName());
2358
			bagInsuranceModel.setMobileNumber(customer.getMobileNumber());
2359
			bagInsuranceModel.setPlanId("");
2360
			insurancePolicy.setPosted(true);
2361
		}
2362
	}
2363
 
25694 amit.gupta 2364
	public void schemeRollback(List<String> schemeIds) throws Exception {
2365
		List<Integer> schemeIdsInt = schemeIds.stream().map(x -> Integer.parseInt(x)).collect(Collectors.toList());
25708 amit.gupta 2366
		Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIdsInt, 0, schemeIds.size()).stream()
25694 amit.gupta 2367
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
2368
		List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectBySchemeIds(new HashSet<>(schemeIdsInt));
2369
		for (SchemeInOut sio : schemeInOuts) {
2370
			Scheme scheme = schemesMap.get(sio.getSchemeId());
2371
			if (scheme.getType().equals(SchemeType.IN)) {
2372
 
2373
			} else if (scheme.getType().equals(SchemeType.OUT)) {
2374
				InventoryItem inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
2375
				List<ScanRecord> sr = scanRecordRepository.selectByInventoryItemId(sio.getInventoryItemId());
2376
				ScanRecord scanRecord = sr.stream().filter(x -> x.getType().equals(ScanType.SALE))
2377
						.max((x1, x2) -> x1.getCreateTimestamp().compareTo(x2.getCreateTimestamp())).get();
2378
				if (scanRecord.getCreateTimestamp().isAfter(scheme.getEndDateTime())
2379
						|| scanRecord.getCreateTimestamp().isBefore(scheme.getStartDateTime())) {
2380
					sio.setRolledBackTimestamp(LocalDateTime.now());
2381
					FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(scanRecord.getOrderId());
25709 amit.gupta 2382
					String rollbackReason = "Scheme reversed for "
2383
							+ itemRepository.selectById(inventoryItem.getItemId()).getItemDescription() + "/Inv - "
25694 amit.gupta 2384
							+ fofoOrder.getInvoiceNumber();
2385
					walletService.rollbackAmountFromWallet(scanRecord.getFofoId(), sio.getAmount(),
26945 amit.gupta 2386
							scanRecord.getOrderId(), WalletReferenceType.SCHEME_OUT, rollbackReason,
2387
							LocalDateTime.now());
25694 amit.gupta 2388
					System.out.printf("Amount %f,SchemeId %d,Reason %s\n", sio.getAmount(), sio.getSchemeId(),
2389
							rollbackReason);
2390
				}
2391
			}
2392
		}
25721 tejbeer 2393
		// throw new Exception();
25694 amit.gupta 2394
	}
25721 tejbeer 2395
 
2396
	public void checkfocusedModelInPartnerStock() throws Exception {
2397
 
2398
		List<Integer> fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId())
2399
				.collect(Collectors.toList());
27212 tejbeer 2400
		Map<Integer, Map<Integer, List<SaholicCIS>>> warehouseItemAvailabilityMap = saholicInventoryService
2401
				.getSaholicStock();
27213 tejbeer 2402
		Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
2403
		Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = this.getPartnerIdSalesHeaders();
27212 tejbeer 2404
 
2405
		Map<Integer, Map<Integer, List<SaholicPOItem>>> warehousePoItemAvailabilityMap = saholicInventoryService
2406
				.getSaholicPOItems();
25721 tejbeer 2407
		Map<Integer, List<FocusedModelShortageModel>> focusedModelShortageReportMap = new HashMap<>();
2408
		for (Integer fofoId : fofoIds) {
27102 amit.gupta 2409
			List<FocusedModelShortageModel> focusedModelShortageList = new ArrayList<>();
2410
			focusedModelShortageReportMap.put(fofoId, focusedModelShortageList);
25721 tejbeer 2411
			CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
2412
			Map<Integer, Integer> processingOrderMap = null;
2413
			Map<Integer, Integer> catalogIdAndQtyMap = null;
2414
			Map<Integer, Integer> grnPendingOrdersMap = null;
2415
 
2416
			Map<Integer, Integer> currentInventorySnapshot = currentInventorySnapshotRepository.selectByFofoId(fofoId)
2417
					.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
2418
 
2419
			if (!currentInventorySnapshot.isEmpty()) {
2420
				catalogIdAndQtyMap = itemRepository.selectByIds(currentInventorySnapshot.keySet()).stream()
2421
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2422
								Collectors.summingInt(x -> currentInventorySnapshot.get(x.getId()))));
2423
 
2424
			}
2425
 
2426
			Map<Integer, Integer> grnPendingOrders = orderRepository.selectPendingGrnOrders(fofoId).stream()
2427
					.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
2428
							Collectors.summingInt(x -> x.getLineItem().getQuantity())));
2429
			if (!grnPendingOrders.isEmpty()) {
2430
				grnPendingOrdersMap = itemRepository.selectByIds(grnPendingOrders.keySet()).stream()
2431
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2432
								Collectors.summingInt(x -> grnPendingOrders.get(x.getId()))));
2433
 
2434
			}
2435
 
2436
			Map<Integer, Integer> processingOrder = orderRepository.selectOrders(fofoId, orderStatusList).stream()
2437
					.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
2438
							Collectors.summingInt(x -> x.getLineItem().getQuantity())));
2439
			if (!processingOrder.isEmpty()) {
2440
				processingOrderMap = itemRepository.selectByIds(processingOrder.keySet()).stream()
2441
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2442
								Collectors.summingInt(x -> processingOrder.get(x.getId()))));
2443
 
2444
			}
2445
 
25800 tejbeer 2446
			List<String> brands = mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name"))
2447
					.collect(Collectors.toList());
2448
 
27088 tejbeer 2449
			List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId())
2450
					.collect(Collectors.toList());
27095 tejbeer 2451
			LOGGER.info("regionIds" + regionIds);
27102 amit.gupta 2452
			if (regionIds.size() == 0) {
2453
				LOGGER.info("No region found for partner {}", fofoId);
2454
				continue;
2455
			}
27100 amit.gupta 2456
			Map<Integer, Optional<Integer>> focusedCatalogIdAndQtyMap = focusedModelRepository
27102 amit.gupta 2457
					.selectAllByRegionIds(regionIds).stream().collect(Collectors.groupingBy(FocusedModel::getCatalogId,
29668 tejbeer 2458
							Collectors.mapping(FocusedModel::getObsMinimumQty, Collectors.maxBy(Integer::compareTo))));
25800 tejbeer 2459
 
25721 tejbeer 2460
			LOGGER.info("focusedCatalogIdAndQtyMap" + focusedCatalogIdAndQtyMap);
2461
 
27100 amit.gupta 2462
			for (Map.Entry<Integer, Optional<Integer>> entry : focusedCatalogIdAndQtyMap.entrySet()) {
2463
				int minQty = entry.getValue().get();
25721 tejbeer 2464
				int inStockQty = 0;
2465
				int processingQty = 0;
2466
				int grnPendingQty = 0;
27208 tejbeer 2467
				int allColorNetAvailability = 0;
27253 tejbeer 2468
				int allColorPoAvailability = 0;
25721 tejbeer 2469
				if (processingOrderMap != null) {
2470
					processingQty = (processingOrderMap.get(entry.getKey()) == null) ? 0
2471
							: processingOrderMap.get(entry.getKey());
2472
 
2473
				}
2474
				if (grnPendingOrdersMap != null) {
2475
					grnPendingQty = (grnPendingOrdersMap.get(entry.getKey()) == null) ? 0
2476
							: grnPendingOrdersMap.get(entry.getKey());
2477
 
2478
				}
2479
				if (catalogIdAndQtyMap != null) {
2480
					inStockQty = (catalogIdAndQtyMap.get(entry.getKey()) == null) ? 0
2481
							: catalogIdAndQtyMap.get(entry.getKey());
2482
 
2483
				}
28526 tejbeer 2484
 
2485
				int grnStockQty = grnPendingQty + inStockQty;
25721 tejbeer 2486
				int totalQty = processingQty + grnPendingQty + inStockQty;
2487
 
29801 manish 2488
				int shortageQty = minQty - totalQty;
31328 amit.gupta 2489
				List<Item> items = itemRepository.selectAllByCatalogItemId(entry.getKey());
29801 manish 2490
				FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
25721 tejbeer 2491
 
29801 manish 2492
				Map<Integer, List<SaholicCIS>> itemAvailabilityMap = warehouseItemAvailabilityMap
2493
						.get(fofoStore.getWarehouseId());
27213 tejbeer 2494
 
29801 manish 2495
				Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = warehousePoItemAvailabilityMap
2496
						.get(fofoStore.getWarehouseId());
25721 tejbeer 2497
 
31328 amit.gupta 2498
				for (Item item : items) {
29801 manish 2499
					List<SaholicCIS> currentAvailability = null;
2500
					List<SaholicPOItem> poItemAvailability = null;
2501
					if (itemAvailabilityMap != null) {
31328 amit.gupta 2502
						currentAvailability = itemAvailabilityMap.get(item.getId());
29801 manish 2503
					}
27208 tejbeer 2504
 
29801 manish 2505
					if (poItemAvailabilityMap != null) {
31328 amit.gupta 2506
						poItemAvailability = poItemAvailabilityMap.get(item.getId());
29801 manish 2507
					}
2508
					if (currentAvailability != null) {
2509
						allColorNetAvailability += currentAvailability.stream()
2510
								.collect(Collectors.summingInt(SaholicCIS::getNetavailability));
2511
					}
28528 tejbeer 2512
 
29801 manish 2513
					if (poItemAvailability != null) {
2514
						allColorPoAvailability += poItemAvailability.stream()
2515
								.collect(Collectors.summingInt(SaholicPOItem::getUnfulfilledQty));
27208 tejbeer 2516
					}
2517
 
25721 tejbeer 2518
				}
2519
 
29801 manish 2520
				FocusedModelShortageModel fm = new FocusedModelShortageModel();
2521
				fm.setFofoId(fofoId);
2522
				fm.setStoreCode(fofoStore.getCode());
2523
				fm.setStoreName(customRetailer.getBusinessName());
31328 amit.gupta 2524
				fm.setBrandName(items.get(0).getBrand());
2525
				fm.setModelName(items.get(0).getModelName());
2526
				fm.setModelNumber(items.get(0).getModelNumber());
29801 manish 2527
				fm.setGrnStockQty(grnStockQty);
2528
				fm.setPendingIndentQty(processingQty);
2529
				fm.setShortageQty(shortageQty);
2530
				fm.setPoAvailabitiy(allColorPoAvailability);
2531
				fm.setWarehouseName(warehouseMap.get(customRetailer.getWarehouseId()));
2532
				fm.setStateManager(partnerIdSalesHeadersMap.get(fofoId).getRegionalManager());
2533
				fm.setTerritoryManager(partnerIdSalesHeadersMap.get(fofoId).getTerritoryManager());
31328 amit.gupta 2534
				fm.setItemName(items.get(0).getBrand() + items.get(0).getModelNumber() + items.get(0).getModelName());
29801 manish 2535
				fm.setAvailabitiy(allColorNetAvailability);
27233 tejbeer 2536
 
29801 manish 2537
				focusedModelShortageList.add(fm);
2538
			}
2539
 
29668 tejbeer 2540
			/*
2541
			 * if (!focusedModelShortageList.isEmpty()) { String subject = "Stock Alert";
2542
			 * String messageText = this.getMessage(focusedModelShortageList);
30393 amit.gupta 2543
			 *
29668 tejbeer 2544
			 * this.sendMailWithAttachments(subject, messageText,
2545
			 * customRetailer.getEmail()); String notificationMessage =
2546
			 * this.getNotificationMessage(focusedModelShortageList);
30393 amit.gupta 2547
			 *
29668 tejbeer 2548
			 * LOGGER.info("notificationMessage" + notificationMessage);
30393 amit.gupta 2549
			 *
29668 tejbeer 2550
			 * SendNotificationModel sendNotificationModel = new SendNotificationModel();
2551
			 * sendNotificationModel.setCampaignName("Stock Alert");
2552
			 * sendNotificationModel.setTitle("Alert");
2553
			 * sendNotificationModel.setMessage(notificationMessage);
2554
			 * sendNotificationModel.setType("url"); sendNotificationModel.setUrl(
2555
			 * "https://app.smartdukaan.com/pages/home/notifications");
2556
			 * sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2557
			 * sendNotificationModel.setMessageType(MessageType.notification); int userId =
2558
			 * userAccountRepository.selectUserIdByRetailerId(fofoId);
2559
			 * sendNotificationModel.setUserIds(Arrays.asList(userId));
2560
			 * notificationService.sendNotification(sendNotificationModel);
30393 amit.gupta 2561
			 *
29668 tejbeer 2562
			 * }
2563
			 */
27233 tejbeer 2564
 
25721 tejbeer 2565
		}
27102 amit.gupta 2566
		if (!focusedModelShortageReportMap.isEmpty()) {
25800 tejbeer 2567
			String fileName = "Stock Alert-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
30215 amit.gupta 2568
			Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
25837 amit.gupta 2569
			Map<String, List<List<?>>> emailRowsMap = new HashMap<>();
25721 tejbeer 2570
 
25800 tejbeer 2571
			focusedModelShortageReportMap.entrySet().forEach(x -> {
2572
				storeGuyMap.entrySet().forEach(y -> {
2573
 
2574
					if (y.getValue().contains(x.getKey())) {
2575
						if (!emailRowsMap.containsKey(y.getKey())) {
2576
							emailRowsMap.put(y.getKey(), new ArrayList<>());
2577
						}
27208 tejbeer 2578
						List<List<? extends Serializable>> fms = x.getValue().stream()
2579
								.map(r -> Arrays.asList(r.getStoreCode(), r.getStoreName(), r.getBrandName(),
27213 tejbeer 2580
										r.getModelName(), r.getModelNumber(), r.getWarehouseName(), r.getStateManager(),
28526 tejbeer 2581
										r.getTerritoryManager(), r.getPendingIndentQty(), r.getGrnStockQty(),
2582
										r.getShortageQty(), r.getAvailabitiy()))
25800 tejbeer 2583
								.collect(Collectors.toList());
2584
						emailRowsMap.get(y.getKey()).addAll(fms);
2585
 
25721 tejbeer 2586
					}
2587
 
25800 tejbeer 2588
				});
25721 tejbeer 2589
 
2590
			});
2591
 
27212 tejbeer 2592
			List<String> headers = Arrays.asList("Store Code", "Store Name", "Brand", "Model Name", "Model Number",
28526 tejbeer 2593
					"Warehouse Name", "State Manager", "Territory Manager", "Pending Indent", "InStock", "Shortage Qty",
2594
					"Availability");
25837 amit.gupta 2595
			emailRowsMap.entrySet().forEach(entry -> {
25721 tejbeer 2596
 
25800 tejbeer 2597
				ByteArrayOutputStream baos = null;
2598
				try {
25837 amit.gupta 2599
					baos = FileUtil.getCSVByteStream(headers, entry.getValue());
25800 tejbeer 2600
				} catch (Exception e2) {
2601
					e2.printStackTrace();
2602
				}
30752 tejbeer 2603
				String[] sendToArray = new String[] {
28526 tejbeer 2604
 
29996 tejbeer 2605
						entry.getKey()
29995 tejbeer 2606
 
2607
				};
2608
 
25800 tejbeer 2609
				try {
2610
					Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Stock Alert", "PFA", fileName,
2611
							new ByteArrayResource(baos.toByteArray()));
2612
				} catch (Exception e1) { // TODO Auto-generated catch block
2613
					e1.printStackTrace();
2614
				}
25721 tejbeer 2615
 
25800 tejbeer 2616
			});
2617
		}
25721 tejbeer 2618
	}
2619
 
2620
	private String getNotificationMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2621
		StringBuilder sb = new StringBuilder();
2622
		sb.append("Focused Model Shortage in Your Stock : \n");
2623
		for (FocusedModelShortageModel entry : focusedModelShortageModel) {
2624
 
2625
			sb.append(entry.getItemName() + "-" + entry.getShortageQty());
2626
			sb.append(String.format("%n", ""));
2627
		}
2628
		return sb.toString();
2629
	}
2630
 
2631
	private void sendMailWithAttachments(String subject, String messageText, String email) throws Exception {
2632
		MimeMessage message = mailSender.createMimeMessage();
2633
		MimeMessageHelper helper = new MimeMessageHelper(message, true);
2634
 
2635
		helper.setSubject(subject);
2636
		helper.setText(messageText, true);
2637
		helper.setTo(email);
27116 amit.gupta 2638
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
25721 tejbeer 2639
		helper.setFrom(senderAddress);
2640
		mailSender.send(message);
2641
 
2642
	}
2643
 
2644
	private String getMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2645
		StringBuilder sb = new StringBuilder();
2646
		sb.append("<html><body><p>Alert</p><p>Focused Model Shortage in Your Stock:-</p>"
2647
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
2648
		sb.append("<tbody>\n" + "	    				<tr>\n"
2649
				+ "	    					<th style='border:1px solid black;padding: 5px'>Item</th>\n"
2650
				+ "	    					<th style='border:1px solid black;padding: 5px'>Shortage Qty</th>\n"
2651
				+ "	    				</tr>");
2652
		for (FocusedModelShortageModel entry : focusedModelShortageModel) {
2653
 
2654
			sb.append("<tr>");
2655
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getItemName() + "</td>");
2656
 
2657
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getShortageQty() + "</td>");
2658
 
2659
			sb.append("</tr>");
2660
 
2661
		}
2662
 
2663
		sb.append("</tbody></table></body></html>");
2664
 
2665
		return sb.toString();
2666
	}
2667
 
25927 amit.gupta 2668
	public void notifyLead() throws Exception {
29488 manish 2669
		List<Lead> leadsToNotify = leadRepository.selectLeadsScheduledBetweenDate(null,
2670
				LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
25927 amit.gupta 2671
		Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream()
2672
				.collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
27477 amit.gupta 2673
		LOGGER.info("authUserEmailMap {}", authUserEmailMap);
25927 amit.gupta 2674
		Map<String, Integer> dtrEmailMap = dtrUserRepository
2675
				.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream()
2676
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
25936 amit.gupta 2677
 
27477 amit.gupta 2678
		LOGGER.info("dtrEmailMap {}", dtrEmailMap);
26790 tejbeer 2679
 
25927 amit.gupta 2680
		Map<Integer, Integer> authUserKeyMap = new HashMap<>();
2681
 
2682
		for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2683
			int authId = authUserEmail.getKey();
2684
			String email = authUserEmail.getValue();
2685
			authUserKeyMap.put(authId, dtrEmailMap.get(email));
2686
		}
27477 amit.gupta 2687
		LOGGER.info("authUserKeyMap", authUserKeyMap);
2688
		LOGGER.info("leadsToNotify {}", leadsToNotify);
26790 tejbeer 2689
 
29308 tejbeer 2690
		String templateMessage = "Lead followup for %s %s, %s, %s is due by %s";
25927 amit.gupta 2691
		for (Lead lead : leadsToNotify) {
27217 amit.gupta 2692
			if (authUserKeyMap.get(lead.getAssignTo()) == null) {
2693
				LOGGER.info("Assignee no longer part of system {}", lead.getAssignTo());
25927 amit.gupta 2694
				continue;
2695
			}
30982 tejbeer 2696
			String title = "Leads followup Reminder";
25927 amit.gupta 2697
			String notificationMessage = String.format(templateMessage, lead.getFirstName(), lead.getLastName(),
29308 tejbeer 2698
					lead.getAddress(), lead.getLeadMobile(), leadTimeFormatter.format(lead.getScheduledTimestamp()));
30982 tejbeer 2699
			String url = "https://app.smartdukaan.com/pages/home/leadUpdate?leadId=" + lead.getId();
25927 amit.gupta 2700
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
2701
			sendNotificationModel.setCampaignName("Lead Reminder");
30982 tejbeer 2702
			sendNotificationModel.setTitle(title);
25927 amit.gupta 2703
			sendNotificationModel.setMessage(notificationMessage);
2704
			sendNotificationModel.setType("url");
30982 tejbeer 2705
			sendNotificationModel.setUrl(url);
25927 amit.gupta 2706
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2707
			sendNotificationModel.setMessageType(MessageType.reminder);
26320 tejbeer 2708
			sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(lead.getAssignTo())));
25929 amit.gupta 2709
			System.out.println(sendNotificationModel);
25927 amit.gupta 2710
			notificationService.sendNotification(sendNotificationModel);
30982 tejbeer 2711
			AuthUser authUser = authRepository.selectById(lead.getAssignTo());
30991 tejbeer 2712
			// notificationService.sendWhatsappMessage(notificationMessage, title,
2713
			// authUser.getMobileNumber());
25927 amit.gupta 2714
		}
2715
	}
26945 amit.gupta 2716
 
25927 amit.gupta 2717
	public void notifyVisits() throws Exception {
26945 amit.gupta 2718
		List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository
2719
				.selectVisitsScheduledBetweenDate(LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
25927 amit.gupta 2720
		Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream()
2721
				.collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
2722
		Map<String, Integer> dtrEmailMap = dtrUserRepository
2723
				.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream()
2724
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
2725
		Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26945 amit.gupta 2726
 
25927 amit.gupta 2727
		for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2728
			int authId = authUserEmail.getKey();
2729
			String email = authUserEmail.getValue();
2730
			authUserKeyMap.put(authId, dtrEmailMap.get(email));
2731
		}
2732
		String visitTemplate = "Planned visit to franchisee %s is due by %s";
2733
		String followupTemplate = "Lead followup for franchisee %s is due by %s";
2734
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("MMM 7, EEEE h:m a");
2735
		for (FranchiseeVisit visit : franchiseeVisits) {
2736
			if (authUserKeyMap.containsKey(visit.getAuthId())) {
2737
				continue;
2738
			}
2739
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
2740
			String message = null;
26945 amit.gupta 2741
			if (visit.getFranchiseActivityId() == 0) {
2742
				message = String.format(visitTemplate, visit.getPartnerName(),
30574 amit.gupta 2743
						timeFormatter.format(visit.getScheduleTimestamp()));
26945 amit.gupta 2744
				sendNotificationModel.setCampaignName("Franchisee visit Reminder");
25927 amit.gupta 2745
			} else {
26945 amit.gupta 2746
				message = String.format(followupTemplate, visit.getPartnerName(),
30574 amit.gupta 2747
						timeFormatter.format(visit.getScheduleTimestamp()));
25927 amit.gupta 2748
				sendNotificationModel.setCampaignName("Franchisee followup Reminder");
2749
			}
2750
			sendNotificationModel.setMessage(message);
2751
			sendNotificationModel.setType("url");
26482 tejbeer 2752
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25927 amit.gupta 2753
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2754
			sendNotificationModel.setMessageType(MessageType.reminder);
2755
			sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(visit.getAuthId())));
30991 tejbeer 2756
			// notificationService.sendNotification(sendNotificationModel);
25927 amit.gupta 2757
		}
25910 amit.gupta 2758
	}
25982 amit.gupta 2759
 
26283 tejbeer 2760
	public void ticketClosed() throws Exception {
2761
 
2762
		List<Ticket> tickets = ticketRepository.selectAllNotClosedTicketsWithStatus(ActivityType.RESOLVED);
2763
		for (Ticket ticket : tickets) {
2764
			if (ticket.getUpdateTimestamp().toLocalDate().isBefore(LocalDate.now().minusDays(7))) {
2765
				ticket.setCloseTimestamp(LocalDateTime.now());
2766
				ticket.setLastActivity(ActivityType.RESOLVED_ACCEPTED);
2767
				ticket.setUpdateTimestamp(LocalDateTime.now());
2768
				ticketRepository.persist(ticket);
2769
			}
2770
		}
2771
 
2772
	}
2773
 
26790 tejbeer 2774
	public void checkValidateReferral() throws Exception {
2775
 
2776
		List<Refferal> referrals = refferalRepository.selectByStatus(RefferalStatus.pending);
26791 tejbeer 2777
		LOGGER.info("referrals" + referrals);
26790 tejbeer 2778
		if (!referrals.isEmpty()) {
2779
			String subject = "Referral Request";
2780
			String messageText = this.getMessageForReferral(referrals);
2781
 
26792 tejbeer 2782
			MimeMessage message = mailSender.createMimeMessage();
2783
			MimeMessageHelper helper = new MimeMessageHelper(message, true);
30752 tejbeer 2784
			String[] email = { "kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com" };
26792 tejbeer 2785
			helper.setSubject(subject);
2786
			helper.setText(messageText, true);
2787
			helper.setTo(email);
2788
			InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
2789
			helper.setFrom(senderAddress);
2790
			mailSender.send(message);
2791
 
26790 tejbeer 2792
		}
2793
	}
2794
 
2795
	private String getMessageForReferral(List<Refferal> referrals) {
2796
		StringBuilder sb = new StringBuilder();
2797
		sb.append("<html><body><p>Alert</p><p>Pending Referrals:-</p>"
2798
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
2799
		sb.append("<tbody>\n" + "	    				<tr>\n"
2800
				+ "	    					<th style='border:1px solid black;padding: 5px'>RefereeName</th>\n"
2801
				+ "	    					<th style='border:1px solid black;padding: 5px'>Referee Email</th>\n"
2802
				+ "	    					<th style='border:1px solid black;padding: 5px'>Referral Name</th>\n"
2803
				+ "	    					<th style='border:1px solid black;padding: 5px'>Refferal Mobile</th>\n"
2804
				+ "	    					<th style='border:1px solid black;padding: 5px'>city</th>\n"
2805
				+ "	    					<th style='border:1px solid black;padding: 5px'>state</th>\n"
2806
				+ "	    				</tr>");
2807
		for (Refferal entry : referrals) {
2808
 
2809
			sb.append("<tr>");
2810
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeName() + "</td>");
2811
 
2812
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeEmail() + "</td>");
2813
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getFirstName() + "</td>");
2814
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMobile() + "</td>");
2815
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCity() + "</td>");
2816
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getState() + "</td>");
2817
 
2818
			sb.append("</tr>");
2819
 
2820
		}
2821
 
2822
		sb.append("</tbody></table></body></html>");
2823
 
2824
		return sb.toString();
2825
	}
2826
 
30421 tejbeer 2827
	private String getMessageForUncontacblePartner(List<PartnerCollectionRemark> pcrs)
2828
			throws ProfitMandiBusinessException {
2829
		StringBuilder sb = new StringBuilder();
2830
		sb.append("<html><body><p>Alert</p><p>Not Responding Partner:-</p>"
2831
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
2832
		sb.append("<tbody>\n" + "	    				<tr>\n"
2833
				+ "	    					<th style='border:1px solid black;padding: 5px'>PartnerName</th>\n"
2834
				+ "	    					<th style='border:1px solid black;padding: 5px'>from</th>\n"
2835
 
2836
				+ "	    				</tr>");
2837
		for (PartnerCollectionRemark entry : pcrs) {
2838
 
2839
			CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
2840
 
2841
			sb.append("<tr>");
2842
			sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "("
2843
					+ customRetailer.getCode() + ")" + "</td>");
2844
 
2845
			sb.append("<td style='border:1px solid black;padding: 5px'>"
2846
					+ entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
2847
 
2848
			sb.append("</tr>");
2849
 
2850
		}
2851
 
2852
		sb.append("</tbody></table></body></html>");
2853
 
2854
		return sb.toString();
2855
	}
2856
 
27271 amit.gupta 2857
	public void reverseWallet() throws Exception {
2858
		LocalDate localDate = LocalDate.of(2020, 10, 28);
28205 tejbeer 2859
		List<UserWalletHistory> uwhList = userWalletHistoryRepository.selectAllByDateType(localDate.atStartOfDay(),
2860
				localDate.plusDays(1).atStartOfDay(),
27271 amit.gupta 2861
				Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
2862
		for (UserWalletHistory uwh : uwhList) {
28205 tejbeer 2863
			if (uwh.getBusinessTimestamp().getMonth().equals(Month.SEPTEMBER)) {
27275 amit.gupta 2864
				UserWallet uw = userWalletRepository.selectById(uwh.getWalletId());
28205 tejbeer 2865
				// LOGGER.info("UWH - {}", uwh);
2866
				// amount += uwh.getAmount();
2867
				// System.out.println("Amount is - " + amount);
2868
				// walletService.rollbackAmountFromWallet(uw.getUserId(), uwh.getAmount(),
2869
				// uwh.getReference(), uwh.getReferenceType(), "Margin reversal for error prone
2870
				// run", uwh.getBusinessTimestamp());
27313 amit.gupta 2871
				int orderId = uwh.getReference();
2872
				FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
2873
				int inventoryItemId = 0;
28205 tejbeer 2874
				// fofoOrderRepository.delete(fofoOrder);
27313 amit.gupta 2875
				List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
28205 tejbeer 2876
				/*
2877
				 * List<PaymentOptionTransaction> paymentOptionTransactions =
2878
				 * paymentOptionTransactionRepository.selectByReferenceIdAndType(fofoOrder.getId
2879
				 * (), PaymentOptionReferenceType.ORDER); for(PaymentOptionTransaction
2880
				 * paymentOptionTransaction : paymentOptionTransactions) {
2881
				 * //paymentOptionTransactionRepository.delete(paymentOptionTransaction); }
2882
				 */
2883
				for (FofoOrderItem foi : fofoOrderItems) {
2884
					// fofoOrderItemRepository.delete(foi);
27313 amit.gupta 2885
					List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(foi.getId());
28205 tejbeer 2886
					for (FofoLineItem fli : flis) {
2887
						// fofoLineItemRepository.delete(fli);
27313 amit.gupta 2888
						inventoryItemId = fli.getInventoryItemId();
2889
					}
2890
				}
28205 tejbeer 2891
				List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(
2892
						java.util.stream.Stream.of(inventoryItemId).collect(Collectors.toSet()));
2893
				for (SchemeInOut sio : schemeInOuts) {
2894
					if (sio.getCreateTimestamp().toLocalDate().equals(localDate)) {
27314 amit.gupta 2895
						LOGGER.info("SIO - {}", sio);
27315 amit.gupta 2896
						sio.setRolledBackTimestamp(LocalDateTime.now());
27313 amit.gupta 2897
					}
2898
				}
28205 tejbeer 2899
 
27271 amit.gupta 2900
			}
2901
		}
28205 tejbeer 2902
 
27271 amit.gupta 2903
	}
28205 tejbeer 2904
 
2905
	public void partnerProblemAlert() throws Exception {
2906
		LocalDateTime curDate = LocalDate.now().atStartOfDay();
2907
		Map<Integer, Double> lmtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
2908
				curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1), 0, false);
2909
		Map<Integer, Double> mtdSales = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate.withDayOfMonth(1),
2910
				curDate.with(LocalTime.MAX), 0, false);
2911
		Map<Integer, PartnerDailyInvestment> pdi = partnerDailyInvestmentRepository.selectAll(LocalDate.now()).stream()
2912
				.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
2913
 
2914
		for (Entry<Integer, Double> ls : lmtdSale.entrySet()) {
2915
 
2916
			double lmtdTwentyPercentSale = ls.getValue() * 0.2;
28208 tejbeer 2917
 
2918
			LOGGER.info("lmtdTwentyPercentSale" + lmtdTwentyPercentSale);
2919
 
28211 tejbeer 2920
			double mtdSale = mtdSales.get(ls.getKey()) == null ? 0 : mtdSales.get(ls.getKey());
28208 tejbeer 2921
 
2922
			LOGGER.info("mtdSale" + mtdSale);
2923
 
28209 tejbeer 2924
			double totalSixtyPercentInvestment = pdi.get(ls.getKey()) == null ? 0
2925
					: pdi.get(ls.getKey()).getTotalInvestment() * 0.6;
28205 tejbeer 2926
 
28208 tejbeer 2927
			LOGGER.info("totalSixtyPercentInvestment" + totalSixtyPercentInvestment);
2928
 
28209 tejbeer 2929
			double stockInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getInStockAmount();
28208 tejbeer 2930
 
2931
			LOGGER.info("stockInvestment" + stockInvestment);
2932
 
28205 tejbeer 2933
			boolean Investmentvalue = partnerInvestmentService.isInvestmentBelow(ls.getKey(), 25);
2934
 
2935
			PartnerProblem partnerProblem = partnerProblemRepository.selectByFofoId(ls.getKey());
2936
 
28210 tejbeer 2937
			if (partnerProblem == null) {
28205 tejbeer 2938
				partnerProblem = new PartnerProblem();
2939
				partnerProblem.setFofoId(ls.getKey());
2940
				if (mtdSale < lmtdTwentyPercentSale) {
2941
					partnerProblem.setMtd(1);
2942
				}
2943
				if (Investmentvalue) {
2944
					partnerProblem.setInvestment(1);
2945
				}
2946
 
2947
				if (stockInvestment < totalSixtyPercentInvestment) {
2948
					partnerProblem.setInvestment(1);
2949
				}
2950
 
2951
				partnerProblemRepository.persist(partnerProblem);
2952
			} else {
2953
				if (mtdSale < lmtdTwentyPercentSale) {
2954
					partnerProblem.setMtd(partnerProblem.getMtd() + 1);
2955
 
2956
				} else {
2957
					partnerProblem.setMtd(0);
2958
 
2959
				}
2960
				if (Investmentvalue) {
2961
					partnerProblem.setInvestment(partnerProblem.getInvestment() + 1);
2962
				} else {
2963
					partnerProblem.setInvestment(0);
2964
 
2965
				}
2966
				if (stockInvestment < totalSixtyPercentInvestment) {
2967
					partnerProblem.setStockInvestment(partnerProblem.getStockInvestment() + 1);
2968
				} else {
2969
					partnerProblem.setStockInvestment(0);
2970
				}
2971
 
2972
			}
2973
 
2974
		}
2975
 
28213 tejbeer 2976
		List<PartnerProblem> partnerProblems = partnerProblemRepository.selectAll().stream()
2977
				.filter(x -> x.getMtd() + x.getInvestment() + x.getStockInvestment() > 0).collect(Collectors.toList());
2978
 
28223 tejbeer 2979
		partnerProblems = partnerProblems.stream().sorted((x1, x2) -> {
28224 tejbeer 2980
			return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment()
28223 tejbeer 2981
					+ x2.getStockInvestment() ? 1 : -1;
2982
		}).collect(Collectors.toList());
28227 tejbeer 2983
 
2984
		Map<Integer, PartnerProblem> partnerProblemMap = partnerProblems.stream().sorted((x1, x2) -> {
2985
			return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment()
2986
					+ x2.getStockInvestment() ? 1 : -1;
2987
		}).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
2988
 
28212 tejbeer 2989
		Map<Integer, CustomRetailer> customRetailers = retailerService.getAllFofoRetailers();
28213 tejbeer 2990
 
28467 tejbeer 2991
		List<Integer> assignTo = Arrays.asList(15, 9, 54, 53);
28213 tejbeer 2992
 
2993
		Map<Integer, AuthUser> assignAuthUserMap = authRepository.selectAllAuthUserByIds(assignTo).stream()
2994
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
2995
 
28286 tejbeer 2996
		List<String> sendTo = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com",
30765 tejbeer 2997
				"niranjan.kala@smartdukaan.com", "sm@smartdukaan.com");
28208 tejbeer 2998
		LOGGER.info("partnerProblem" + partnerProblems);
28205 tejbeer 2999
		StringBuilder sb = new StringBuilder();
28218 tejbeer 3000
		sb.append("<htl><body>");
28222 tejbeer 3001
		sb.append(
3002
				"<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>");
28205 tejbeer 3003
		sb.append("<tbody>\n" + "	    <tr>"
3004
				+ "	    					<th style='border:1px solid black;padding: 5px'>Partner Name</th>"
3005
				+ "                         <th style='border:1px solid black;padding: 5px'>Assign TO</th>"
3006
				+ "	    					<th style='border:1px solid black;padding: 5px'>Mtd</th>"
3007
				+ "	    					<th style='border:1px solid black;padding: 5px'>Investment</th>"
3008
				+ "	    					<th style='border:1px solid black;padding: 5px'>Stock</th>"
3009
				+ "	    					<th style='border:1px solid black;padding: 5px'>Manager</th>"
3010
 
3011
				+ "	    				</tr>");
3012
 
3013
		for (PartnerProblem pp : partnerProblems) {
28467 tejbeer 3014
			int value = pp.getFofoId() % 4;
28205 tejbeer 3015
 
3016
			Map<EscalationType, AuthUser> authUserMap = csService.getAuthUserAndEsclationByPartnerId(pp.getFofoId());
28217 tejbeer 3017
			LOGGER.info("authUserMap" + authUserMap);
28205 tejbeer 3018
			sb.append("<tr>");
3019
			sb.append("<td style='border:1px solid black;padding: 5px'>"
3020
					+ customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
28213 tejbeer 3021
			sb.append("<td style='border:1px solid black;padding: 5px'>"
3022
					+ assignAuthUserMap.get(assignTo.get(value)).getName() + "</td>");
28205 tejbeer 3023
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
3024
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
3025
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
28216 tejbeer 3026
			sb.append("<td style='border:1px solid black;padding: 5px'>"
28224 tejbeer 3027
					+ (authUserMap.get(EscalationType.L1) == null ? "N/A"
30752 tejbeer 3028
							: authUserMap.get(EscalationType.L1).getFirstName())
28224 tejbeer 3029
					+ " ," + (authUserMap.get(EscalationType.L2) == null ? "N/A"
30752 tejbeer 3030
							: authUserMap.get(EscalationType.L2).getFirstName())
28216 tejbeer 3031
					+ "</td>");
28205 tejbeer 3032
 
3033
			sb.append("</tr>");
3034
		}
3035
		sb.append("</tbody></table><br><br>");
3036
		String subject = "Partner Problem Alert!";
3037
		String[] email = sendTo.toArray(new String[sendTo.size()]);
3038
 
28222 tejbeer 3039
		this.sendMailHtmlFormat(email, sb.toString(), null, subject);
3040
 
28218 tejbeer 3041
		Map<Integer, List<Integer>> authUserPartnerMapping = csService.getAuthUserIdPartnerIdMapping();
3042
 
3043
		for (Entry<Integer, List<Integer>> authUserPartner : authUserPartnerMapping.entrySet()) {
28222 tejbeer 3044
			AuthUser authUser = authRepository.selectById(authUserPartner.getKey());
28227 tejbeer 3045
			for (Integer patnerId : authUserPartner.getValue()) {
3046
				if (partnerProblemMap.get(patnerId) != null) {
28218 tejbeer 3047
 
28227 tejbeer 3048
					StringBuilder sbbuilder = new StringBuilder();
3049
					sbbuilder.append("<hml><body>");
3050
					sb.append(
3051
							"<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>");
3052
					sbbuilder.append("<tbody>\n" + "	    <tr>"
3053
							+ "	    					<th style='border:1px solid black;padding: 5px'>Partner Name</th>"
3054
							+ "	    					<th style='border:1px solid black;padding: 5px'>Mtd</th>"
3055
							+ "	    					<th style='border:1px solid black;padding: 5px'>Investment</th>"
3056
							+ "	    					<th style='border:1px solid black;padding: 5px'>Stock</th>"
28218 tejbeer 3057
 
28227 tejbeer 3058
							+ "	    				</tr>");
28218 tejbeer 3059
 
28227 tejbeer 3060
					for (Integer partnerId : authUserPartner.getValue()) {
3061
						if (partnerProblemMap.get(partnerId) != null) {
3062
							PartnerProblem pp = partnerProblemMap.get(partnerId);
3063
							sbbuilder.append("<tr>");
3064
							sbbuilder.append("<td style='border:1px solid black;padding: 5px'>"
3065
									+ customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
3066
							sbbuilder
3067
									.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
3068
							sbbuilder.append(
3069
									"<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
3070
							sbbuilder.append("<td style='border:1px solid black;padding: 5px'>"
3071
									+ pp.getStockInvestment() + "</td>");
3072
 
3073
							sbbuilder.append("</tr>");
3074
						}
3075
 
28224 tejbeer 3076
					}
28227 tejbeer 3077
					sbbuilder.append("</tbody></table><br><br>");
28224 tejbeer 3078
 
28286 tejbeer 3079
					this.sendMailOfHtmlFormat(authUser.getEmailId(), sbbuilder.toString(), null, subject);
28230 tejbeer 3080
					break;
28218 tejbeer 3081
				}
28230 tejbeer 3082
 
28223 tejbeer 3083
			}
28222 tejbeer 3084
		}
3085
	}
28218 tejbeer 3086
 
28222 tejbeer 3087
	private void sendMailHtmlFormat(String email[], String body, String cc[], String subject)
3088
			throws MessagingException, ProfitMandiBusinessException, IOException {
3089
		MimeMessage message = mailSender.createMimeMessage();
3090
		MimeMessageHelper helper = new MimeMessageHelper(message);
3091
		helper.setSubject(subject);
3092
		helper.setText(body, true);
3093
		helper.setTo(email);
3094
		if (cc != null) {
3095
			helper.setCc(cc);
28218 tejbeer 3096
		}
28222 tejbeer 3097
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
3098
		helper.setFrom(senderAddress);
3099
		mailSender.send(message);
28205 tejbeer 3100
	}
3101
 
28775 amit.gupta 3102
	@Autowired
3103
	WarehouseRepository warehouseRepository;
28790 amit.gupta 3104
 
28775 amit.gupta 3105
	public void getVendorWarehouses(int warehouseId) {
28778 amit.gupta 3106
		LOGGER.info("Warehouses - {}", warehouseRepository.getVendorWarehouses().get(warehouseId));
28790 amit.gupta 3107
 
28775 amit.gupta 3108
	}
29488 manish 3109
 
29451 manish 3110
	public void checkImeiActivation() {
29488 manish 3111
 
29451 manish 3112
		try {
3113
			vivoImeiActivationService.checkImeiActivation();
3114
		} catch (ProfitMandiBusinessException e) {
3115
			// TODO Auto-generated catch block
3116
			e.printStackTrace();
3117
		} catch (IOException e) {
3118
			// TODO Auto-generated catch block
3119
			e.printStackTrace();
3120
		} catch (Exception e) {
3121
			// TODO Auto-generated catch block
3122
			e.printStackTrace();
3123
		}
28775 amit.gupta 3124
 
29451 manish 3125
	}
3126
 
29668 tejbeer 3127
	public void checkItelImeiActivation(LocalDate date, Integer day) {
29488 manish 3128
		LOGGER.info("Hello - {}", "hhh");
3129
 
3130
		try {
29668 tejbeer 3131
			itelImeiActivationService.checkItelImeiActivation(date, day);
29488 manish 3132
		} catch (ProfitMandiBusinessException e) {
3133
			// TODO Auto-generated catch block
3134
			e.printStackTrace();
3135
		} catch (IOException e) {
3136
			// TODO Auto-generated catch block
3137
			e.printStackTrace();
3138
		} catch (Exception e) {
3139
			// TODO Auto-generated catch block
3140
			e.printStackTrace();
3141
		}
3142
 
3143
	}
3144
 
29807 manish 3145
	public void selectFinServiceFollowUpDateByCurrDate(LocalDate currentDate)
3146
			throws MessagingException, ProfitMandiBusinessException, IOException {
29801 manish 3147
		LOGGER.info("selectfinServiceFollow - {}", "selectfinServiceFollowUpDateByCurrDate");
3148
 
29807 manish 3149
		serviceConfigService.selectFinServicePartnerfollowUpDateByCurrentDate(currentDate);
3150
 
29801 manish 3151
	}
3152
 
29668 tejbeer 3153
	public void checkTecnoImeiActivation(LocalDate date, Integer day) {
29488 manish 3154
		LOGGER.info("Hello - {}", "hhh");
3155
 
3156
		try {
29668 tejbeer 3157
			tecnoImeiActivation.checkTecnoImeiActivation(date, day);
29488 manish 3158
		} catch (ProfitMandiBusinessException e) {
3159
			// TODO Auto-generated catch block
3160
			e.printStackTrace();
3161
		} catch (IOException e) {
3162
			// TODO Auto-generated catch block
3163
			e.printStackTrace();
3164
		} catch (Exception e) {
3165
			// TODO Auto-generated catch block
3166
			e.printStackTrace();
3167
		}
3168
 
3169
	}
3170
 
29252 amit.gupta 3171
	public void checkCancellationMargin() throws Exception {
3172
		LocalDateTime startDate = LocalDate.of(2021, 4, 1).atStartOfDay();
3173
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectCancelledBetweenSaleDate(startDate, LocalDateTime.now());
3174
		LOGGER.info("Total Orders =  {}", fofoOrders.size());
29308 tejbeer 3175
		for (FofoOrder fofoOrder : fofoOrders) {
3176
			List<UserWalletHistory> history = userWalletHistoryRepository
3177
					.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.SCHEME_OUT);
3178
			history.addAll(userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(),
3179
					WalletReferenceType.ACTIVATION_SCHEME));
3180
			int walletSum = history.stream().mapToInt(x -> x.getAmount()).sum();
3181
			if (Math.abs(walletSum) > 1) {
3182
				// LOGGER.info("Cancelled invoice {}, Order Id = {}, = havent rolledback, Value
3183
				// = {}", fofoOrder.getInvoiceNumber(), fofoOrder.getId(), walletSum);
29252 amit.gupta 3184
				List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
3185
				List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(fofoOrderItems.get(0).getId());
3186
				FofoLineItem fli = flis.get(0);
29308 tejbeer 3187
				if (StringUtils.isEmpty(fli.getSerialNumber()))
3188
					continue;
3189
				List<SchemeInOut> schemeInOuts = schemeInOutRepository
3190
						.selectByInventoryItemIds(new HashSet<>(Arrays.asList(fli.getInventoryItemId())));
29252 amit.gupta 3191
				InventoryItem inventoryItem = inventoryItemRepository.selectById(fli.getInventoryItemId());
29308 tejbeer 3192
				double schemeSum = schemeInOuts.stream().filter(x -> x.getRolledBackTimestamp() == null)
3193
						.mapToDouble(x -> x.getAmount()).sum();
3194
				/*
3195
				 * if(inventoryItem.getGoodQuantity()==1) {
3196
				 * LOGGER.info("GoodQty, Serial Number {}, InventoryItem = {}, Billed on {}",
3197
				 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3198
				 * inventoryItem.getUpdateTimestamp()); } else
3199
				 * if(inventoryItem.getBadQuantity()==1){
3200
				 * LOGGER.info("Bad Qty, Serial Number {}, InventoryItem = {}, Billed on {}",
3201
				 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3202
				 * inventoryItem.getUpdateTimestamp()); } else if
3203
				 * (inventoryItem.getLastScanType().equals(ScanType.SALE)) { LOGGER.
3204
				 * info("Problem Sold, Serial Number {}, InventoryItem = {}, Billed on {}",
3205
				 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3206
				 * inventoryItem.getUpdateTimestamp()); }
3207
				 */
3208
				if (inventoryItem.getLastScanType().equals(ScanType.SALE)
3209
						|| inventoryItem.getLastScanType().equals(ScanType.SALE_RET)) {
3210
					Map<String, Double> map = schemeInOuts.stream()
3211
							.collect(
3212
									Collectors.groupingBy(
3213
											x -> DateTimeFormatter.ofPattern("yyyyMMddHH")
3214
													.format(x.getCreateTimestamp()) + "- " + x.getSchemeId(),
3215
											Collectors.summingDouble(x -> x.getAmount())));
3216
					for (Map.Entry<String, Double> entry : map.entrySet()) {
3217
						LOGGER.info("{} = {}", entry.getKey(), entry.getValue());
29252 amit.gupta 3218
					}
29308 tejbeer 3219
					LOGGER.info("id- {}, imei- {}, lastScan = {}, Scheme sum - {}", inventoryItem.getId(),
3220
							inventoryItem.getSerialNumber(), inventoryItem.getLastScanType(), schemeSum);
29252 amit.gupta 3221
				}
3222
			}
3223
		}
29308 tejbeer 3224
 
29252 amit.gupta 3225
	}
3226
 
29488 manish 3227
	public static String readFileAsString(String file) throws Exception {
3228
		String data = "";
3229
		data = new String(Files.readAllBytes(Paths.get(file)));
3230
		return data;
3231
	}
29451 manish 3232
 
29308 tejbeer 3233
	public void markDelhiveryOrderDelivered() throws ProfitMandiBusinessException, IOException {
3234
		List<Order> orders = orderRepository.selectOrderByProviderIdAndStatus(ProfitMandiConstants.DELHIVERY_PROVIDERID,
3235
				OrderStatus.SHIPPED_FROM_WH);
3236
 
3237
		if (!orders.isEmpty()) {
29441 tejbeer 3238
			Set<String> airwayBill = orders.stream().map(x -> x.getAirwayBillNumber()).collect(Collectors.toSet());
29308 tejbeer 3239
 
29441 tejbeer 3240
			int arraylength = airwayBill.size();
3241
 
3242
			if (arraylength >= 75) {
3243
 
3244
				airwayBill = airwayBill.stream().limit(74).collect(Collectors.toSet());
3245
			}
29308 tejbeer 3246
			LOGGER.info("airwayBill" + airwayBill);
3247
			String url = "https://track.delhivery.com/api/v1/packages/json/";
3248
 
3249
			OkHttpClient client = new OkHttpClient();
3250
 
3251
			Request request1 = new Request.Builder()
3252
					.url(url + "?waybill=" + String.join(",", airwayBill) + "&token=" + token).get().build();
3253
 
3254
			LOGGER.info("request1" + request1);
3255
 
3256
			Response response = client.newCall(request1).execute();
3257
 
3258
			LOGGER.info("jsonbj" + response.body());
3259
 
3260
			JSONObject jsonObj = new JSONObject(response.body().string());
3261
 
3262
			LOGGER.info("jsonObj" + jsonObj);
3263
 
29403 tejbeer 3264
			JSONArray shipmentData = jsonObj.getJSONArray("ShipmentData");
29308 tejbeer 3265
			Set<String> airwaybillStatus = new HashSet<>();
29403 tejbeer 3266
			for (int i = 0; i < shipmentData.length(); i++) {
3267
				JSONObject jsonObject = shipmentData.getJSONObject(i);
29308 tejbeer 3268
				JSONObject shipment = jsonObject.getJSONObject("Shipment");
3269
 
3270
				LOGGER.info("shipment" + shipment);
3271
				JSONObject statusDescription = shipment.getJSONObject("Status");
3272
				String awb = shipment.getString("AWB");
3273
 
3274
				String status = statusDescription.getString("Status");
3275
				LOGGER.info("status" + status);
3276
 
3277
				LOGGER.info("awb" + awb);
3278
				if (status.equals("Delivered")) {
3279
					airwaybillStatus.add(awb);
3280
				}
3281
 
3282
			}
31117 tejbeer 3283
			markOrderDelivered(airwaybillStatus);
3284
		}
3285
	}
29308 tejbeer 3286
 
31117 tejbeer 3287
	public void markBlueDartOrderDelivered() throws ProfitMandiBusinessException, IOException {
29308 tejbeer 3288
 
31117 tejbeer 3289
		String loginId = "DEL81122";
30982 tejbeer 3290
 
31117 tejbeer 3291
		String licencekey = "uhfhlg2jpmnqfhfrlsgzfr1nhu1qfvel";
30982 tejbeer 3292
 
31117 tejbeer 3293
		List<Order> orders = orderRepository.selectOrderByProviderIdAndStatus(ProfitMandiConstants.BLUEDART_PROVIDERID,
3294
				OrderStatus.SHIPPED_FROM_WH);
30982 tejbeer 3295
 
31117 tejbeer 3296
		if (!orders.isEmpty()) {
30982 tejbeer 3297
 
31118 tejbeer 3298
			Set<String> airwayBillNo = orders.stream().map(x -> x.getAirwayBillNumber()).collect(Collectors.toSet());
29308 tejbeer 3299
 
31117 tejbeer 3300
			LOGGER.info("airwayBill" + airwayBillNo);
3301
			String url = "https://api.bluedart.com/servlet/RoutingServlet?handler=tnt&action=custawbquery";
30982 tejbeer 3302
 
31117 tejbeer 3303
			String response = restClient.get(url + "&loginid=" + loginId + "&awb=awb&numbers="
3304
					+ String.join(",", airwayBillNo) + "&format=xml&lickey=" + licencekey + "&verno=1.3&scan=1", null,
3305
					null);
3306
 
3307
			JSONObject updateJson = XML.toJSONObject(response);
3308
 
3309
			JSONObject shipmentData = updateJson.getJSONObject("ShipmentData");
3310
			Object shipmentObject = shipmentData.get("Shipment");
3311
 
3312
			Set<String> airwaybillStatus = new HashSet<>();
3313
 
3314
			if (shipmentObject instanceof JSONArray) {
3315
				JSONArray shipments = (JSONArray) shipmentObject;
3316
				for (int i = 0; i < shipments.length(); i++) {
3317
					JSONObject jsonObject = shipments.getJSONObject(i);
3318
 
3319
					Number awb = jsonObject.getNumber("WaybillNo");
3320
					String status = jsonObject.getString("Status");
3321
 
3322
					if (status.equals("SHIPMENT DELIVERED")) {
3323
						airwaybillStatus.add(awb.toString());
3324
					}
3325
 
29308 tejbeer 3326
				}
31117 tejbeer 3327
			} else {
3328
				JSONObject jsonObject = (JSONObject) shipmentObject;
3329
				Number awb = jsonObject.getNumber("WaybillNo");
3330
				String status = jsonObject.getString("Status");
3331
 
3332
				if (status.equals("SHIPMENT DELIVERED")) {
3333
					airwaybillStatus.add(awb.toString());
3334
				}
3335
 
29308 tejbeer 3336
			}
3337
 
31117 tejbeer 3338
			LOGGER.info("airwaybillStatus" + airwaybillStatus);
3339
 
31118 tejbeer 3340
			markOrderDelivered(airwaybillStatus);
29308 tejbeer 3341
		}
31117 tejbeer 3342
 
29308 tejbeer 3343
	}
3344
 
31117 tejbeer 3345
	private void markOrderDelivered(Set<String> airwaybillStatus)
3346
			throws ProfitMandiBusinessException, HttpHostConnectException {
3347
		if (!airwaybillStatus.isEmpty()) {
3348
			for (String aws : airwaybillStatus) {
3349
 
3350
				List<Order> deliverdOrders = orderRepository.selectByAirwayBillNumber(aws);
3351
 
3352
				int fofoId = deliverdOrders.get(0).getRetailerId();
3353
				for (Order dlo : deliverdOrders) {
3354
					dlo.setStatus(OrderStatus.DELIVERY_SUCCESS);
3355
					dlo.setStatusDescription("Order Delivered");
3356
					dlo.setDeliveryTimestamp(LocalDateTime.now());
3357
				}
3358
 
3359
				com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(fofoId);
3360
 
3361
				Address address = addressRepository.selectById(user.getAddressId());
3362
 
3363
				String title = "Order Delivered";
3364
 
3365
				String message = String.format("Dear partner, Your SmartDukaan Order " + aws
3366
						+ " has been delivered to you in a safe sealed bag.");
3367
 
3368
				SendNotificationModel sendNotificationModel = new SendNotificationModel();
3369
				sendNotificationModel.setCampaignName("Order Delivered");
3370
				sendNotificationModel.setTitle(title);
3371
				sendNotificationModel.setMessage(message);
3372
				sendNotificationModel.setType("url");
3373
				sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
3374
				sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
3375
				sendNotificationModel.setMessageType(MessageType.notification);
3376
				int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
3377
				sendNotificationModel.setUserIds(Arrays.asList(userId));
3378
				notificationService.sendNotification(sendNotificationModel);
3379
 
3380
				notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
3381
 
3382
			}
3383
		}
3384
	}
3385
 
29814 tejbeer 3386
	public void partnerWiseCreditAccount() throws Exception {
3387
 
3388
		List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
3389
 
3390
		for (FofoStore fs : fofoStores) {
3391
 
3392
			if (fs.getPan() != null) {
3393
				AccountStatusResponseOut accountStatusResponseOut = mandiiService.getStatus(fs.getPan());
29815 tejbeer 3394
 
3395
				LOGGER.info("accountStatusResponseOut" + accountStatusResponseOut);
29814 tejbeer 3396
				CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(fs.getId(),
3397
						Gateway.MANDII);
3398
 
3399
				if (creditAccount == null) {
3400
 
3401
					creditAccount = new CreditAccount();
3402
 
3403
					creditAccount.setFofoId(fs.getId());
3404
					creditAccount.setGateway(Gateway.MANDII);
3405
 
3406
				}
29835 tejbeer 3407
 
3408
				if (accountStatusResponseOut == null) {
3409
					creditAccount.setCreditStatus(CreditStatus.UNKNOWN);
3410
					creditAccount.setDescription("User company not found");
3411
 
29817 tejbeer 3412
				} else {
29835 tejbeer 3413
					if (accountStatusResponseOut.getSanctionLimit() != null) {
3414
						creditAccount.setSanctionedAmount(accountStatusResponseOut.getSanctionLimit().floatValue());
3415
					} else {
3416
						creditAccount.setSanctionedAmount(0);
3417
					}
29817 tejbeer 3418
 
29835 tejbeer 3419
					creditAccount.setInterestRate(accountStatusResponseOut.getRateOfInterest());
3420
					if (accountStatusResponseOut.getBalanceAmount() != null) {
3421
						creditAccount.setAvailableAmount(accountStatusResponseOut.getBalanceAmount().floatValue());
3422
					} else {
3423
						creditAccount.setAvailableAmount(0);
3424
					}
3425
 
3426
					if (accountStatusResponseOut.getCurrentStage() != null) {
3427
						creditAccount.setDescription(accountStatusResponseOut.getCurrentStage().toString());
3428
					}
3429
					if (accountStatusResponseOut.getStatus().equals(EligibilityStatusEnum.SANCTION_AVAILABLE)) {
3430
						creditAccount.setCreditStatus(CreditStatus.SANCTIONED);
3431
					} else if (accountStatusResponseOut.getStatus().equals(EligibilityStatusEnum.IN_ELIGIBLE)) {
3432
						creditAccount.setCreditStatus(CreditStatus.INELIGIBLE);
3433
					} else {
3434
 
3435
						creditAccount.setCreditStatus(CreditStatus.TO_BE_EVALUATED);
3436
					}
29817 tejbeer 3437
				}
3438
 
29814 tejbeer 3439
				creditAccount.setUpdatedOn(LocalDateTime.now());
3440
				creditAccountRepository.persist(creditAccount);
3441
			}
3442
		}
3443
	}
3444
 
30421 tejbeer 3445
	@Autowired
3446
	private PartnerCollectionRemarkRepository partnerCollectionRemarkRepository;
3447
 
3448
	public void reviewUncontactablePartner()
3449
			throws ProfitMandiBusinessException, MessagingException, UnsupportedEncodingException {
3450
 
3451
		Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
3452
 
3453
		List<Integer> pcrms = partnerCollectionRemarkRepository
3454
				.selectMaxRemarkId(new ArrayList<>(customRetailerMap.keySet()));
3455
 
3456
		if (!pcrms.isEmpty()) {
3457
			Map<Integer, PartnerCollectionRemark> partnerCollectionRemarksMap = partnerCollectionRemarkRepository
3458
					.selectByIds(pcrms).stream().filter(x -> x.getRemark().equals(CollectionRemark.NOT_RESPONDING))
3459
					.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
3460
 
3461
			if (!partnerCollectionRemarksMap.isEmpty()) {
3462
				for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMapping()
3463
						.entrySet()) {
3464
					List<PartnerCollectionRemark> filteredRows = storeGuyEntry.getValue().stream()
3465
							.map(x -> partnerCollectionRemarksMap.get(x)).filter(x -> x != null)
3466
							.collect(Collectors.toList());
30752 tejbeer 3467
					String subject = "UNCONTACTABLE PARTNERS";
30421 tejbeer 3468
					String messageText = this.getMessageForUncontacblePartner(filteredRows);
3469
 
3470
					MimeMessage message = mailSender.createMimeMessage();
3471
					MimeMessageHelper helper = new MimeMessageHelper(message, true);
30752 tejbeer 3472
					String[] email = new String[] { storeGuyEntry.getKey() };
30421 tejbeer 3473
 
3474
					helper.setSubject(subject);
3475
					helper.setText(messageText, true);
3476
					helper.setTo(email);
3477
					InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com",
3478
							"Smartdukaan Alerts");
3479
					helper.setFrom(senderAddress);
3480
					mailSender.send(message);
3481
 
3482
					LOGGER.info("filteredRows {}", filteredRows);
3483
 
3484
				}
3485
			}
30859 tejbeer 3486
 
30421 tejbeer 3487
		}
3488
	}
3489
 
30859 tejbeer 3490
	@Autowired
3491
	private LoanRepository loanRepository;
3492
 
3493
	@Autowired
3494
	private LoanStatementRepository loanStatementRepository;
3495
 
3496
	@Autowired
3497
	private SDCreditService sdCreditService;
3498
 
3499
	@Autowired
3500
	private SDCreditRequirementRepository sdCreditRequirementRepository;
3501
 
30936 tejbeer 3502
	@Autowired
3503
	private CurrentPartnerDailyInvestmentRepository currentPartnerDailyInvestmentRepository;
3504
 
3505
	@Autowired
3506
	private TransactionRepository transactionRepository;
3507
 
3508
	@Autowired
31020 tejbeer 3509
	private SanctionRequestRepository sanctionRequestRepository;
3510
 
30859 tejbeer 3511
	public void calculateInterestAccured() throws ProfitMandiBusinessException {
3512
 
3513
		List<Loan> loans = loanRepository.selectAllActiveLoan();
3514
 
3515
		if (!loans.isEmpty()) {
3516
 
3517
			for (Loan loan : loans) {
3518
 
3519
				List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
3520
 
3521
				Map<LoanReferenceType, Double> loanStatusAmount = loanStatements.stream().collect(Collectors.groupingBy(
3522
						x -> x.getLoanReferenceType(), Collectors.summingDouble(x -> x.getAmount().doubleValue())));
3523
 
3524
				if (loan.getFreeDays() > 0) {
3525
					LocalDateTime freeDaysLimitDate = loan.getCreatedOn().plusDays(loan.getFreeDays() - 1);
30936 tejbeer 3526
 
3527
					LOGGER.info("freeDaysLimitDate {}", freeDaysLimitDate);
30859 tejbeer 3528
					if (LocalDateTime.now().isAfter(freeDaysLimitDate)) {
30936 tejbeer 3529
						int loanStatementId = loanStatementRepository.selectLatestLoanSatement(loan.getFofoId(),
3530
								loan.getId());
3531
						LOGGER.info("loanStatementId {}", loanStatementId);
30859 tejbeer 3532
 
30936 tejbeer 3533
						if (loanStatementId != 0) {
3534
 
3535
							this.calculateInterest(loan, loanStatusAmount, loanStatementId);
3536
 
3537
						} else {
3538
							sdCreditService.addInterest(freeDaysLimitDate.toLocalDate(), LocalDate.now(), loan,
3539
									loanStatusAmount);
3540
						}
3541
 
30859 tejbeer 3542
					}
3543
				} else {
3544
 
3545
					int loanStatementId = loanStatementRepository.selectLatestLoanSatement(loan.getFofoId(),
3546
							loan.getId());
30936 tejbeer 3547
					LOGGER.info("loanStatementId2 {}", loanStatementId);
30859 tejbeer 3548
 
30936 tejbeer 3549
					this.calculateInterest(loan, loanStatusAmount, loanStatementId);
30859 tejbeer 3550
 
3551
				}
3552
 
3553
			}
3554
		}
3555
 
3556
	}
3557
 
31332 amit.gupta 3558
	@Autowired
3559
	FofoPaymentRepository fofoPaymentRepository;
3560
 
3561
	@Autowired
3562
	CCAvenuePaymentService ccAvenuePaymentService;
3563
	public void settleCCAvePayments() throws Exception {
3564
		List<FofoPayment> fofoPayments = fofoPaymentRepository.selectAllByGatewayStatus(Gateway.CCAVENUE, PaymentStatus.INIT).stream()
3565
				.filter(x->x.getCreateTimestamp().isBefore(LocalDateTime.now().minusMinutes(30l))).collect(Collectors.toList());
3566
		for (FofoPayment fofoPayment : fofoPayments) {
3567
			ccAvenuePaymentService.updatePayment(fofoPayment);
3568
		}
3569
	}
3570
 
30936 tejbeer 3571
	private void calculateInterest(Loan loan, Map<LoanReferenceType, Double> loanStatusAmount, int loanStatementId)
3572
			throws ProfitMandiBusinessException {
3573
		LoanStatement loanStatement = loanStatementRepository.selectById(loanStatementId);
3574
 
3575
		if (loanStatement.getLoanId() == loan.getId()) {
3576
 
3577
			sdCreditService.addInterest(loanStatement.getCreatedAt().toLocalDate(), LocalDate.now(), loan,
3578
					loanStatusAmount);
3579
 
3580
		} else {
3581
			throw new ProfitMandiBusinessException("loanstament", loanStatement.getLoanId(), "Invalid LoanId");
3582
		}
3583
	}
3584
 
31020 tejbeer 3585
	public void loanSettlement() throws Exception {
30859 tejbeer 3586
		List<Loan> loans = loanRepository.selectAllActiveLoan();
3587
 
3588
		if (!loans.isEmpty()) {
3589
 
3590
			for (Loan loan : loans) {
3591
 
3592
				UserWallet userWallet = userWalletRepository.selectByRetailerId(loan.getFofoId());
3593
				SDCreditRequirement sdCreditRequirement = sdCreditRequirementRepository
3594
						.selectByFofoId(loan.getFofoId());
3595
 
3596
				if (userWallet.getAmount() >= 100) {
3597
					List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
3598
 
31175 tejbeer 3599
					LOGGER.info("loanStatements {}", loanStatements);
3600
 
30859 tejbeer 3601
					Map<LoanReferenceType, Double> loanStatusAmount = loanStatements.stream()
3602
							.collect(Collectors.groupingBy(x -> x.getLoanReferenceType(),
31177 tejbeer 3603
									Collectors.summingDouble(x -> FormattingUtils.serialize(x.getAmount()))));
30859 tejbeer 3604
 
3605
					LOGGER.info("loanStatusAmount {}", loanStatusAmount);
31020 tejbeer 3606
					Double interestAmount = loanStatusAmount.get(LoanReferenceType.INTEREST);
30859 tejbeer 3607
 
31020 tejbeer 3608
					if (interestAmount == null) {
3609
						interestAmount = (double) 0;
3610
					}
3611
 
30859 tejbeer 3612
					double principalAmount = loanStatusAmount.get(LoanReferenceType.PRINCIPAL);
3613
					double paidAmount = 0;
3614
					if (userWallet.getAmount() > Math.abs(interestAmount)) {
3615
 
31175 tejbeer 3616
						LOGGER.info("interestAmount b {}", interestAmount);
3617
 
31177 tejbeer 3618
						if (interestAmount < 0) {
31175 tejbeer 3619
							LOGGER.info("interestAmount a {}", interestAmount);
30859 tejbeer 3620
 
3621
							settledLoanStatement(LoanReferenceType.INTEREST, BigDecimal.valueOf(interestAmount),
3622
									loan.getFofoId(), loan.getId(), "Amount adjusted against loan",
3623
									LocalDateTime.now());
3624
							loan.setInterestPaid(loan.getInterestPaid().add(BigDecimal.valueOf(interestAmount).abs()));
3625
 
3626
							paidAmount += Math.abs(interestAmount);
3627
						}
3628
 
3629
						double userWalletAmount = userWallet.getAmount() - Math.abs(interestAmount);
3630
 
31177 tejbeer 3631
						if (userWalletAmount > Math.abs(principalAmount) && principalAmount < 0) {
30859 tejbeer 3632
 
3633
							settledLoanStatement(LoanReferenceType.PRINCIPAL, BigDecimal.valueOf(principalAmount),
3634
									loan.getFofoId(), loan.getId(), "Amount adjusted against loan",
3635
									LocalDateTime.now());
3636
							double amount = userWalletAmount - Math.abs(principalAmount);
3637
 
3638
							paidAmount += Math.abs(principalAmount);
3639
 
3640
							userWallet.setAmount((int) amount);
3641
 
31020 tejbeer 3642
							BigDecimal utilizationAmount = sdCreditRequirement.getUtilizedAmount()
3643
									.subtract(BigDecimal.valueOf(principalAmount).abs());
3644
 
31110 tejbeer 3645
							sdCreditRequirement.setUtilizedAmount(utilizationAmount);
3646
 
3647
							CreditAccount creditAccount = creditAccountRepository
3648
									.selectByFofoIdAndGateway(loan.getFofoId(), Gateway.SDDIRECT);
3649
 
3650
							creditAccount.setAvailableAmount(sdCreditRequirement.getAvailableLimit().floatValue());
3651
							creditAccount.setUpdatedOn(LocalDateTime.now());
3652
 
30859 tejbeer 3653
							loan.setPendingAmount(BigDecimal.ZERO);
3654
 
31177 tejbeer 3655
						} else if (principalAmount < 0) {
30859 tejbeer 3656
 
3657
							settledLoanStatement(LoanReferenceType.PRINCIPAL, BigDecimal.valueOf(userWalletAmount),
3658
									loan.getFofoId(), loan.getId(), "Amount adjusted against loan",
3659
									LocalDateTime.now());
3660
 
3661
							paidAmount += Math.abs(userWalletAmount);
3662
 
31020 tejbeer 3663
							BigDecimal availableLimit = sdCreditRequirement.getAvailableLimit()
3664
									.add(BigDecimal.valueOf(userWalletAmount)).abs();
3665
 
3666
							BigDecimal utilizationAmount = sdCreditRequirement.getUtilizedAmount()
3667
									.subtract(BigDecimal.valueOf(userWalletAmount)).abs();
3668
 
31110 tejbeer 3669
							sdCreditRequirement.setUtilizedAmount(utilizationAmount);
31020 tejbeer 3670
 
31110 tejbeer 3671
							CreditAccount creditAccount = creditAccountRepository
3672
									.selectByFofoIdAndGateway(loan.getFofoId(), Gateway.SDDIRECT);
3673
 
3674
							creditAccount.setAvailableAmount(sdCreditRequirement.getAvailableLimit().floatValue());
3675
							creditAccount.setUpdatedOn(LocalDateTime.now());
30859 tejbeer 3676
							userWallet.setAmount(0);
3677
 
3678
							loan.setPendingAmount(
3679
									loan.getPendingAmount().subtract(BigDecimal.valueOf(userWalletAmount)));
3680
 
3681
						}
3682
 
3683
						createUserWalletHistory(userWallet.getId(), userWallet.getUserId(),
3684
								WalletReferenceType.LOAN_REPAYMENT, loan.getId(), Math.abs(paidAmount));
3685
 
3686
					} else {
3687
 
3688
						settledLoanStatement(LoanReferenceType.INTEREST, BigDecimal.valueOf(userWallet.getAmount()),
3689
								loan.getFofoId(), loan.getId(), "Amount adjusted against loan", LocalDateTime.now());
3690
 
3691
						paidAmount += Math.abs(userWallet.getAmount());
3692
 
3693
						createUserWalletHistory(userWallet.getId(), userWallet.getUserId(),
3694
								WalletReferenceType.LOAN_REPAYMENT, loan.getId(), Math.abs(paidAmount));
3695
 
3696
						loan.setInterestPaid(
3697
								loan.getInterestPaid().add(BigDecimal.valueOf(userWallet.getAmount()).abs()));
3698
 
3699
						userWallet.setAmount(0);
3700
					}
3701
 
3702
				}
3703
			}
30999 tejbeer 3704
 
31020 tejbeer 3705
			List<Order> allOrders = orderRepository.selectHoldOrder();
3706
 
3707
			LOGGER.info("allOrders {}", allOrders);
3708
 
3709
			if (!allOrders.isEmpty()) {
3710
				Map<Integer, List<Order>> transactionOrdersMap = allOrders.stream()
3711
						.collect(Collectors.groupingBy(Order::getTransactionId, Collectors.toList()));
3712
				LinkedHashMap<Integer, List<Order>> sortedTransactionOrdersMap = new LinkedHashMap<>();
3713
				transactionOrdersMap.entrySet().stream().sorted(Map.Entry.comparingByKey())
3714
						.forEachOrdered(x -> sortedTransactionOrdersMap.put(x.getKey(), x.getValue()));
3715
				LOGGER.info("sortedTransactionOrdersMap {}", sortedTransactionOrdersMap);
3716
 
3717
				for (Entry<Integer, List<Order>> transactionOrdersEntry : sortedTransactionOrdersMap.entrySet()) {
3718
 
3719
					List<Order> orders = transactionOrdersEntry.getValue();
3720
 
3721
					double totalAmount = orders.stream().collect(Collectors.summingDouble(x -> x.getTotalAmount()));
3722
 
3723
					LocalDateTime createDate = orders.get(0).getCreateTimestamp();
3724
 
3725
					int fofoId = orders.get(0).getRetailerId();
3726
 
3727
					int transactionId = transactionOrdersEntry.getKey();
3728
 
3729
					SanctionRequest sanctionRequest = sanctionRequestRepository.selectByTransactionId(transactionId);
3730
 
3731
					double loanSettleAmount = loanStatementRepository.selectByDateAndFofoId(createDate, fofoId).stream()
3732
							.filter(x -> x.getAmount().doubleValue() > 0)
3733
							.collect(Collectors.summingDouble(x -> x.getAmount().doubleValue()));
3734
 
3735
					LOGGER.info("loanSettleAmount {}", loanSettleAmount);
3736
 
3737
					LOGGER.info("totalAmount {}", totalAmount);
3738
					if (loanSettleAmount >= sanctionRequest.getUtilizationAmount().doubleValue()) {
3739
 
3740
						LOGGER.info("totalAmount {}", totalAmount);
3741
 
3742
						orders.forEach(x -> x.setShipmentHold(false));
3743
 
3744
						List<String> authUserEmail = csService.getAuthUserIdByPartnerId(orders.get(0).getRetailerId())
3745
								.stream().map(x -> x.getEmailId()).collect(Collectors.toList());
3746
						authUserEmail.add("vinay.p@smartdukaan.com");
3747
						authUserEmail.add("shivam.gupta@smartdukaan.com");
3748
 
3749
						String[] emailTo = authUserEmail.toArray(new String[authUserEmail.size()]);
3750
 
3751
						String[] ccTo = { "tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com" };
3752
 
3753
						String subject = "Dispatched " + (orders.get(0).getRetailerName());
31218 tejbeer 3754
						String message = String.format("Dear Team, \n" + "kindly note the material for the "
31020 tejbeer 3755
								+ orders.get(0).getRetailerName() + "of Rs." + totalAmount + "is dispatched.");
3756
 
3757
						Utils.sendMailWithAttachments(mailSender, emailTo, ccTo, subject, message);
3758
 
3759
					}
3760
 
3761
				}
3762
			}
3763
 
30859 tejbeer 3764
		}
3765
 
3766
	}
3767
 
3768
	private void settledLoanStatement(LoanReferenceType loanReferneceType, BigDecimal amount, int fofoId, int loanId,
3769
			String description, LocalDateTime now) {
3770
 
3771
		sdCreditService.createLoanStatement(loanReferneceType, amount.abs(), fofoId, loanId, description,
3772
				LocalDateTime.now());
3773
 
3774
	}
3775
 
3776
	private void createUserWalletHistory(int walletId, int userId, WalletReferenceType referenceType, int loanId,
3777
			double interestAmount) {
3778
		UserWalletHistory uwh = new UserWalletHistory();
3779
		uwh.setWalletId(walletId);
3780
		uwh.setFofoId(userId);
3781
		uwh.setBusinessTimestamp(LocalDateTime.now());
3782
		uwh.setReferenceType(referenceType);
3783
		uwh.setReference(loanId);
3784
		uwh.setTimestamp(LocalDateTime.now());
3785
		uwh.setAmount((int) -(interestAmount));
30908 tejbeer 3786
		uwh.setDescription("Amount adjusted against loan");
30859 tejbeer 3787
		userWalletHistoryRepository.persist(uwh);
3788
 
3789
	}
3790
 
30965 tejbeer 3791
	public void dailyLoanAlert()
3792
			throws ProfitMandiBusinessException, HttpHostConnectException, UnsupportedEncodingException {
30859 tejbeer 3793
		List<Loan> loans = loanRepository.selectAllActiveLoan();
3794
 
3795
		Map<Integer, Double> partnerLoanAmount = new HashMap<>();
3796
 
3797
		if (!loans.isEmpty()) {
3798
 
3799
			for (Loan loan : loans) {
3800
 
3801
				List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
3802
 
3803
				double amount = loanStatements.stream().map(x -> x.getAmount())
3804
						.collect(Collectors.summingDouble(x -> x.doubleValue()));
3805
				if (partnerLoanAmount.get(loan.getFofoId()) != null) {
3806
					amount += partnerLoanAmount.get(loan.getFofoId());
3807
					partnerLoanAmount.put(loan.getFofoId(), amount);
3808
				} else {
3809
					partnerLoanAmount.put(loan.getFofoId(), amount);
3810
				}
3811
 
3812
			}
3813
 
3814
		}
3815
 
3816
		if (!partnerLoanAmount.isEmpty()) {
3817
 
3818
			for (Entry<Integer, Double> partnerLoanAmountEnrty : partnerLoanAmount.entrySet()) {
3819
 
3820
				int fofoId = partnerLoanAmountEnrty.getKey();
3821
 
30965 tejbeer 3822
				com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(fofoId);
3823
 
3824
				Address address = addressRepository.selectById(user.getAddressId());
3825
 
3826
				String title = "Alert Credit Outstanding!";
30859 tejbeer 3827
				String url = "http://app.smartdukaan.com/pages/home/credit";
30989 tejbeer 3828
				String message = "Your total pending Loan amount is Rs."
3829
						+ FormattingUtils.formatDecimal(Math.abs(partnerLoanAmountEnrty.getValue())) + ".";
30859 tejbeer 3830
				notificationService.sendNotification(fofoId, title, MessageType.notification, title, message, url);
3831
 
30989 tejbeer 3832
				notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30965 tejbeer 3833
 
30859 tejbeer 3834
			}
3835
 
3836
		}
3837
 
3838
	}
3839
 
30896 amit.gupta 3840
	public void processActivatedImeisForSchemes() throws ProfitMandiBusinessException {
3841
		schemeService.processActivatedImeisForSchemes();
3842
	}
3843
 
30913 tejbeer 3844
	public void updatePartnerLimit() throws ProfitMandiBusinessException {
3845
		Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
3846
 
3847
		Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream()
3848
				.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
3849
		Map<Integer, CurrentPartnerDailyInvestment> currentPartnerDailyInvestmentMap = currentPartnerDailyInvestmentRepository
3850
				.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
30933 tejbeer 3851
		double limitValue = 100000;
30913 tejbeer 3852
		for (Entry<Integer, CustomRetailer> customRetailerEntry : customRetailerMap.entrySet()) {
3853
			int fofoId = customRetailerEntry.getKey();
3854
			SDCreditRequirement sdCreditRequirement = sdCreditRequirementMap.get(customRetailerEntry.getKey());
30929 tejbeer 3855
			LocalDateTime firstBillingDate = transactionRepository.getFirstBillingDate(fofoId);
30913 tejbeer 3856
			CurrentPartnerDailyInvestment currentPartnerDailyInvestment = currentPartnerDailyInvestmentMap.get(fofoId);
3857
			BigDecimal suggestedAmount = BigDecimal.ZERO;
3858
			if (currentPartnerDailyInvestment != null) {
3859
				suggestedAmount = BigDecimal.valueOf(currentPartnerDailyInvestment.getTotalInvestment() * 0.1);
3860
			}
3861
 
30933 tejbeer 3862
			if (suggestedAmount.doubleValue() > limitValue) {
30917 tejbeer 3863
 
30933 tejbeer 3864
				suggestedAmount = BigDecimal.valueOf(limitValue);
30917 tejbeer 3865
 
3866
			}
30920 tejbeer 3867
 
3868
			if (suggestedAmount.doubleValue() < 0) {
3869
				suggestedAmount = BigDecimal.ZERO;
3870
			}
3871
 
30913 tejbeer 3872
			LOGGER.info("suggestedAmount {} ", suggestedAmount);
3873
 
3874
			if (sdCreditRequirement == null) {
3875
				sdCreditRequirement = new SDCreditRequirement();
3876
				sdCreditRequirement.setFofoId(fofoId);
3877
				sdCreditRequirement.setCreditDays(15);
3878
				sdCreditRequirement.setInterestRate(BigDecimal.valueOf(0.05));
3879
				sdCreditRequirement.setSuggestedLimit(suggestedAmount);
30929 tejbeer 3880
				sdCreditRequirement.setRisk(CreditRisk.HIGH_RISK);
30913 tejbeer 3881
				sdCreditRequirement.setLimit(suggestedAmount);
3882
				sdCreditRequirement.setUtilizedAmount(BigDecimal.ZERO);
3883
				sdCreditRequirement.setCreateTimestamp(LocalDateTime.now());
3884
				sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
3885
				sdCreditRequirementRepository.persist(sdCreditRequirement);
3886
			}
30929 tejbeer 3887
 
30936 tejbeer 3888
			CreditRisk creditRisk = sdCreditService.getCurrentRisk(sdCreditRequirement, firstBillingDate);
30929 tejbeer 3889
 
3890
			sdCreditRequirement.setRisk(creditRisk);
3891
 
30913 tejbeer 3892
			sdCreditRequirement.setSuggestedLimit(suggestedAmount);
3893
			sdCreditRequirement.setLimit(suggestedAmount);
3894
			BigDecimal utilizedLimit = new BigDecimal(sdCreditService.getUtilizationAmount(fofoId));
3895
 
3896
			BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);
3897
 
3898
			LOGGER.info("utilizedLimit {} ", utilizedLimit);
3899
 
3900
			LOGGER.info("availableLimit {} ", availableLimit);
3901
 
3902
			sdCreditRequirement.setUtilizedAmount(utilizedLimit);
3903
 
3904
			sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
3905
 
30934 tejbeer 3906
			CreditAccount creditAccount = creditAccountRepository
3907
					.selectByFofoIdAndGateway(sdCreditRequirement.getFofoId(), Gateway.SDDIRECT);
30965 tejbeer 3908
			if (creditAccount != null) {
30934 tejbeer 3909
 
30965 tejbeer 3910
				creditAccount.setInterestRate(sdCreditRequirement.getInterestRate().floatValue());
3911
				creditAccount.setSanctionedAmount(sdCreditRequirement.getLimit().floatValue());
3912
				creditAccount.setAvailableAmount(availableLimit.floatValue());
3913
				creditAccount.setFreeDays(sdCreditRequirement.getFreeDays());
30934 tejbeer 3914
				creditAccount.setUpdatedOn(LocalDateTime.now());
3915
			}
3916
 
30913 tejbeer 3917
		}
3918
 
3919
	}
3920
 
30936 tejbeer 3921
	public void notifyDefaultLoans() throws ProfitMandiBusinessException, MessagingException, IOException {
30929 tejbeer 3922
 
30936 tejbeer 3923
		sdCreditService.updateRisk();
3924
		List<Loan> defaultLoans = sdCreditService.getDefaultLoan();
3925
		if (!defaultLoans.isEmpty()) {
3926
			this.sendDefaultLoanAlert(defaultLoans);
30929 tejbeer 3927
		}
3928
 
3929
	}
3930
 
30936 tejbeer 3931
	public void sendDefaultLoanAlert(List<Loan> defaultLoans)
3932
			throws ProfitMandiBusinessException, MessagingException, IOException {
3933
		String subject = "Default Partners";
30929 tejbeer 3934
 
31218 tejbeer 3935
		List<Integer> categoryIds = Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_CATEGORY,
3936
				ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_SALES,
3937
				ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS,
3938
				ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT);
31177 tejbeer 3939
 
31218 tejbeer 3940
		for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService
3941
				.getAuthUserPartnerIdMappingByCategoryIds(categoryIds).entrySet()) {
30936 tejbeer 3942
			List<Loan> filteredRows = new ArrayList<>();
3943
			for (Loan loan : defaultLoans) {
30929 tejbeer 3944
 
30936 tejbeer 3945
				if (storeGuyEntry.getValue().contains(loan.getFofoId())) {
30929 tejbeer 3946
 
30936 tejbeer 3947
					filteredRows.add(loan);
30929 tejbeer 3948
				}
3949
			}
30936 tejbeer 3950
			if (!filteredRows.isEmpty()) {
3951
				String messageText = this.getMessageForDueDateExtend(filteredRows);
3952
				String[] email = new String[] { storeGuyEntry.getKey() };
30929 tejbeer 3953
 
30936 tejbeer 3954
				this.sendMailHtmlFormat(email, messageText, null, subject);
30929 tejbeer 3955
 
30931 tejbeer 3956
			}
3957
 
30936 tejbeer 3958
		}
30929 tejbeer 3959
 
30936 tejbeer 3960
		for (Loan defaultLoan : defaultLoans) {
3961
			List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
30929 tejbeer 3962
 
30936 tejbeer 3963
			double amount = loanStatements.stream().map(x -> x.getAmount())
3964
					.collect(Collectors.summingDouble(x -> x.doubleValue()));
30929 tejbeer 3965
 
30982 tejbeer 3966
			com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(defaultLoan.getFofoId());
3967
 
3968
			Address address = addressRepository.selectById(user.getAddressId());
3969
 
30989 tejbeer 3970
			String title = "Loan Amount Overdue!";
30936 tejbeer 3971
			String url = "http://app.smartdukaan.com/pages/home/credit";
30989 tejbeer 3972
			String message = "Your loan due date "
30936 tejbeer 3973
					+ defaultLoan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"))
30991 tejbeer 3974
					+ " has been exceeded. Additional penal interest of "
3975
					+ defaultLoan.getInterestRate().setScale(2, RoundingMode.HALF_UP)
30989 tejbeer 3976
					+ "%  and Rs.100 shall be levied on daily basis." + " Your total pending Loan amount is Rs."
30991 tejbeer 3977
					+ FormattingUtils.formatDecimal(Math.abs(amount)) + ". !!Pay Now!!";
30936 tejbeer 3978
			notificationService.sendNotification(defaultLoan.getFofoId(), title, MessageType.notification, title,
3979
					message, url);
3980
 
30989 tejbeer 3981
			notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 3982
 
30929 tejbeer 3983
		}
3984
	}
3985
 
3986
	private String getMessageForDueDateExtend(List<Loan> loans) throws ProfitMandiBusinessException {
3987
		StringBuilder sb = new StringBuilder();
30936 tejbeer 3988
		sb.append(
3989
				"<html><body><p>Alert</p><p>Default Partners :-</p>" + "<br/><p>EveryDay Rs.100 charged as Penalty</p>"
3990
						+ "<br/><table style='border:1px solid black ;padding: 5px';>");
30929 tejbeer 3991
		sb.append("<tbody>\n" + "	    				<tr>\n"
3992
				+ "	    					<th style='border:1px solid black;padding: 5px'>PartnerName</th>\n"
3993
				+ "	    					<th style='border:1px solid black;padding: 5px'>due date</th>\n"
3994
				+ "	    					<th style='border:1px solid black;padding: 5px'>Days</th>\n"
30936 tejbeer 3995
				+ "	    					<th style='border:1px solid black;padding: 5px'>Pending Amount</th>\n"
30929 tejbeer 3996
 
3997
				+ "	    				</tr>");
3998
		for (Loan entry : loans) {
30936 tejbeer 3999
 
4000
			List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(entry.getId());
4001
 
4002
			double amount = loanStatements.stream().map(x -> x.getAmount())
4003
					.collect(Collectors.summingDouble(x -> x.doubleValue()));
4004
 
30929 tejbeer 4005
			long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getDueDate().toLocalDate(), LocalDateTime.now());
4006
 
4007
			CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
4008
 
4009
			sb.append("<tr>");
4010
			sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "("
4011
					+ customRetailer.getCode() + ")" + "</td>");
4012
 
4013
			sb.append("<td style='border:1px solid black;padding: 5px'>"
4014
					+ entry.getDueDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
4015
			sb.append("<td style='border:1px solid black;padding: 5px'>" + noOfdaysBetween + "</td>");
30936 tejbeer 4016
			sb.append("<td style='border:1px solid black;padding: 5px'>"
4017
					+ new DecimalFormat("#.##").format(Math.abs(amount)) + "</td>");
30929 tejbeer 4018
 
4019
			sb.append("</tr>");
4020
 
4021
		}
4022
 
4023
		sb.append("</tbody></table></body></html>");
4024
 
4025
		return sb.toString();
4026
	}
4027
 
30936 tejbeer 4028
	public void notifyLoanDueDateCross() throws ProfitMandiBusinessException, MessagingException, IOException {
4029
 
4030
		List<Loan> loans = loanRepository.selectAllActiveLoan().stream()
4031
				.filter(x -> x.getDueDate().isBefore(LocalDateTime.now())).collect(Collectors.toList());
4032
		if (!loans.isEmpty()) {
4033
			for (Loan loan : loans) {
4034
 
4035
				long noOfdaysBetween = ChronoUnit.DAYS.between(loan.getDueDate().toLocalDate(), LocalDate.now());
4036
 
30982 tejbeer 4037
				com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(loan.getFofoId());
4038
 
4039
				Address address = addressRepository.selectById(user.getAddressId());
4040
 
30936 tejbeer 4041
				LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
4042
 
4043
				if (noOfdaysBetween <= 15 && noOfdaysBetween >= 0) {
4044
					List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
4045
 
4046
					double amount = loanStatements.stream().map(x -> x.getAmount())
4047
							.collect(Collectors.summingDouble(x -> x.doubleValue()));
4048
 
30989 tejbeer 4049
					String url = "http://app.smartdukaan.com/pages/home/credit";
4050
 
30982 tejbeer 4051
					String title = "Alert!";
30989 tejbeer 4052
					String message = "Your loan due date "
30936 tejbeer 4053
							+ loan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"))
30991 tejbeer 4054
							+ " has been exceeded. Additional penal interest of "
4055
							+ loan.getInterestRate().setScale(2, RoundingMode.HALF_UP)
30989 tejbeer 4056
							+ "% shall be levied on daily basis. Your total pending loan amount is Rs."
30936 tejbeer 4057
							+ FormattingUtils.formatDecimal(Math.abs(amount)) + ". !!Pay Now!!";
30989 tejbeer 4058
 
30936 tejbeer 4059
					notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title,
4060
							message, url);
30982 tejbeer 4061
 
30989 tejbeer 4062
					notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 4063
 
30936 tejbeer 4064
				}
4065
			}
4066
		}
4067
 
4068
	}
4069
 
4070
	public void alertForDueDate() throws ProfitMandiBusinessException, MessagingException, IOException {
4071
 
4072
		List<Loan> loans = loanRepository.selectAllActiveLoan();
4073
 
4074
		if (!loans.isEmpty()) {
4075
			for (Loan loan : loans) {
4076
 
30982 tejbeer 4077
				com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(loan.getFofoId());
4078
 
4079
				Address address = addressRepository.selectById(user.getAddressId());
4080
 
30936 tejbeer 4081
				long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), loan.getDueDate().toLocalDate());
4082
 
4083
				LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
4084
 
4085
				if (noOfdaysBetween <= 4 && noOfdaysBetween >= 0) {
4086
					List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
4087
					double amount = loanStatements.stream().map(x -> x.getAmount())
4088
							.collect(Collectors.summingDouble(x -> x.doubleValue()));
4089
 
30965 tejbeer 4090
					String title = "Alert!";
30936 tejbeer 4091
					String url = "http://app.smartdukaan.com/pages/home/credit";
4092
					String message = null;
4093
					if (noOfdaysBetween == 0) {
4094
 
4095
						message = "Your total pending Loan amount is Rs."
4096
								+ FormattingUtils.formatDecimal(Math.abs(amount)) + " is due for Today, Pay Now!!";
4097
 
4098
					} else {
4099
 
4100
						message = "Your total pending Loan amount is Rs."
4101
								+ FormattingUtils.formatDecimal(Math.abs(amount)) + " is due by "
4102
								+ loan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"))
30989 tejbeer 4103
								+ " , Pay Now!!";
30936 tejbeer 4104
 
4105
					}
4106
					notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title,
4107
							message, url);
30989 tejbeer 4108
					notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 4109
 
30936 tejbeer 4110
				}
4111
			}
4112
		}
4113
 
4114
	}
4115
 
30982 tejbeer 4116
	public void userMobileNumberOptIn() throws HttpHostConnectException, ProfitMandiBusinessException {
4117
 
4118
		List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
4119
 
4120
		List<com.spice.profitmandi.dao.entity.user.User> users = userUserRepository
4121
				.selectByIds(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
4122
 
4123
		List<Address> addresses = addressRepository
4124
				.selectByIds(users.stream().map(x -> x.getAddressId()).collect(Collectors.toList()));
4125
 
30984 tejbeer 4126
		LOGGER.info("addresses" + addresses);
4127
 
30982 tejbeer 4128
		for (Address address : addresses) {
4129
			Map<String, String> requestheaders = new HashMap<>();
4130
			requestheaders.put("Content-Type", "application/x-www-form-urlencoded");
4131
			Map<String, String> requestParams = new HashMap<>();
4132
			requestParams.put("userid", String.valueOf(2000215976));
4133
			requestParams.put("password", "MFRd!BBL");
30983 tejbeer 4134
			requestParams.put("phone_number", address.getPhoneNumber());
30982 tejbeer 4135
			requestParams.put("auth_scheme", "plain");
4136
			requestParams.put("v", "1.1");
30983 tejbeer 4137
			requestParams.put("format", "json");
30982 tejbeer 4138
 
4139
			requestParams.put("method", "OPT_IN");
4140
 
4141
			requestParams.put("channel", "WHATSAPP");
4142
			String response = restClient.get("https://media.smsgupshup.com/GatewayAPI/rest", requestParams,
4143
					requestheaders);
4144
			LOGGER.info("response" + response);
4145
		}
4146
 
4147
	}
4148
 
4149
	public void authUserMobileNumberOptIn() throws HttpHostConnectException, ProfitMandiBusinessException {
4150
 
4151
		List<AuthUser> authUsers = authRepository.selectAllActiveUser();
30984 tejbeer 4152
		LOGGER.info("authUsers" + authUsers);
4153
 
30982 tejbeer 4154
		for (AuthUser authUser : authUsers) {
4155
			Map<String, String> requestheaders = new HashMap<>();
4156
			requestheaders.put("Content-Type", "application/x-www-form-urlencoded");
4157
			Map<String, String> requestParams = new HashMap<>();
4158
			requestParams.put("userid", String.valueOf(2000215976));
4159
			requestParams.put("password", "MFRd!BBL");
30983 tejbeer 4160
			requestParams.put("phone_number", authUser.getMobileNumber());
30982 tejbeer 4161
			requestParams.put("auth_scheme", "plain");
4162
			requestParams.put("v", "1.1");
30983 tejbeer 4163
			requestParams.put("format", "json");
30982 tejbeer 4164
 
4165
			requestParams.put("method", "OPT_IN");
4166
 
4167
			requestParams.put("channel", "WHATSAPP");
4168
			String response = restClient.get("https://media.smsgupshup.com/GatewayAPI/rest", requestParams,
4169
					requestheaders);
4170
			LOGGER.info("response" + response);
4171
		}
4172
 
4173
	}
4174
 
31206 tejbeer 4175
	@Autowired
4176
	private HygieneDataRepository hygieneDataRepository;
4177
 
4178
	public void hygineAlertForPartner() throws ProfitMandiBusinessException, MessagingException, IOException {
4179
 
4180
		List<String> remarks = new ArrayList<>();
4181
		remarks.add("Out of Service");
4182
		remarks.add("Duplicate number");
4183
		remarks.add("Partner number");
4184
		List<HygieneData> hygieneData = hygieneDataRepository.selectAllByDisposedDateAndRemark(LocalDate.now(),
4185
				remarks);
4186
 
4187
		if (!hygieneData.isEmpty()) {
4188
 
4189
			Map<Integer, List<HygieneData>> partnerHygieneDataMap = hygieneData.stream()
4190
					.collect(Collectors.groupingBy(x -> x.getFofoId()));
4191
 
4192
			for (Entry<Integer, List<HygieneData>> partnerHygieneDataMapEntry : partnerHygieneDataMap.entrySet()) {
4193
 
31209 tejbeer 4194
				CustomRetailer customRetailer = retailerService.getFofoRetailer(partnerHygieneDataMapEntry.getKey());
4195
 
31206 tejbeer 4196
				StringBuilder sb = new StringBuilder();
4197
				sb.append("<html><body><p>Dear Partner,"
4198
						+ "</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"
4199
 
4200
						+ " </p>"
4201
						+ "<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."
4202
						+ "</p><p>Kindly ensure going forward that the details are correct so to avoid 1% margin loss.\n"
4203
						+ "</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"
4204
						+ "				" + "</p>"
4205
 
4206
						+ "<br/><table style='border:1px solid black ;padding: 5px';>");
4207
				sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4208
				sb.append("<th style='border:1px solid black;padding: 5px'>Invoice Number</th>\n");
4209
				sb.append("<th style='border:1px solid black;padding: 5px'>Customer Name</th>\n");
4210
				sb.append("<th style='border:1px solid black;padding: 5px'>Customer Number</th>\n");
4211
				sb.append("</tr>\n");
4212
 
4213
				List<HygieneData> hygienes = partnerHygieneDataMapEntry.getValue();
4214
 
4215
				List<Integer> orderIds = hygienes.stream().map(x -> x.getOrderId()).collect(Collectors.toList());
4216
 
4217
				List<FofoOrder> fofoOrders = fofoOrderRepository.selectAllByOrderIds(orderIds);
4218
 
4219
				for (FofoOrder fofoOrder : fofoOrders) {
4220
					Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
4221
					sb.append("<tr>");
4222
					sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoOrder.getInvoiceNumber()
4223
							+ "</td>\n");
4224
					sb.append("<td style='border:1px solid black;padding: 5px'>" + customer.getFirstName() + ""
4225
							+ customer.getLastName() + "</td>\n");
4226
					sb.append("<td style='border:1px solid black;padding: 5px'>" + customer.getMobileNumber()
4227
							+ "</td>\n");
4228
 
4229
					sb.append("</tr>\n");
4230
				}
4231
 
4232
				sb.append("</tbody></table></body></html>");
4233
				String subject = "Customer Info - Hygiene Alert";
4234
 
31209 tejbeer 4235
				this.sendMailOfHtmlFormat(customRetailer.getEmail(), sb.toString(), null, subject);
31206 tejbeer 4236
 
4237
			}
4238
 
4239
		}
4240
 
4241
	}
4242
 
4243
	public void hygineAlertForInternalTeam() throws ProfitMandiBusinessException, MessagingException, IOException {
4244
 
4245
		List<String> remarks = new ArrayList<>();
4246
		remarks.add("Out of Service");
4247
		remarks.add("Duplicate number");
4248
		remarks.add("Partner number");
4249
		List<HygieneData> hygieneDataLastThreeMonth = hygieneDataRepository
4250
				.selectDisposedDateAndRemarks(
4251
						LocalDate.now().withDayOfMonth(1).minusMonths(3).atStartOfDay(), LocalDate.now().minusMonths(1)
4252
								.withDayOfMonth(LocalDate.now().minusMonths(1).lengthOfMonth()).atTime(LocalTime.MAX),
4253
						remarks);
4254
 
4255
		List<HygieneData> hygieneDataRecentMonth = hygieneDataRepository
4256
				.selectDisposedDateAndRemarks(LocalDate.now().withDayOfMonth(1), remarks);
4257
		Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
4258
		Map<Integer, List<HygieneData>> partnerHygieneLastThreeMonthMap = null;
4259
 
4260
		Map<Integer, List<HygieneData>> partnerHygieneDataRecentMonth = null;
4261
 
4262
		if (!hygieneDataLastThreeMonth.isEmpty()) {
4263
			partnerHygieneLastThreeMonthMap = hygieneDataLastThreeMonth.stream()
4264
					.collect(Collectors.groupingBy(x -> x.getFofoId()));
4265
 
4266
		}
4267
 
4268
		if (!hygieneDataRecentMonth.isEmpty()) {
4269
			partnerHygieneDataRecentMonth = hygieneDataRecentMonth.stream()
4270
					.collect(Collectors.groupingBy(x -> x.getFofoId()));
4271
		}
4272
 
4273
		for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
4274
 
4275
			String email = storeGuyEntry.getKey();
4276
 
4277
			List<Integer> fofoIds = new ArrayList<>(storeGuyEntry.getValue());
4278
 
4279
			Map<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthData = new HashMap<>();
4280
			Map<Integer, Map<LocalDate, List<HygieneData>>> partnerDateWiseData = new HashMap<>();
4281
			for (Integer fofoId : fofoIds) {
4282
 
4283
				partnerYearMonthData.put(fofoId, null);
4284
				partnerDateWiseData.put(fofoId, null);
4285
				if (!partnerHygieneLastThreeMonthMap.isEmpty()) {
4286
					List<HygieneData> hygienes = partnerHygieneLastThreeMonthMap.get(fofoId);
4287
 
4288
					if (hygienes != null) {
4289
						Map<YearMonth, List<HygieneData>> yearMonthData = hygienes.stream()
4290
								.collect(Collectors.groupingBy(x -> YearMonth.from(x.getDisposedTimestamp())));
4291
 
4292
						partnerYearMonthData.put(fofoId, yearMonthData);
4293
 
4294
					}
4295
					List<HygieneData> dateWiseHygienes = partnerHygieneDataRecentMonth.get(fofoId);
4296
 
4297
					if (dateWiseHygienes != null) {
4298
 
4299
						Map<LocalDate, List<HygieneData>> dateWiseData = hygienes.stream()
4300
								.collect(Collectors.groupingBy(x -> (x.getDisposedTimestamp()).toLocalDate()));
4301
 
4302
						partnerDateWiseData.put(fofoId, dateWiseData);
4303
 
4304
					}
4305
 
4306
				}
4307
 
4308
			}
4309
 
4310
			String subject = "Customer Info - Hygiene Alert";
4311
 
4312
			LOGGER.info("hygieneData {}", partnerDateWiseData.values());
4313
 
4314
			boolean partnerDateWise = partnerDateWiseData.values().stream().allMatch(Objects::isNull);
4315
 
4316
			boolean partnerYearMonth = partnerYearMonthData.values().stream().allMatch(Objects::isNull);
4317
 
4318
			if (!partnerDateWise && !partnerYearMonth) {
4319
				String sb = this.getMessageHygieneAlertForPartner(partnerYearMonthData, partnerDateWiseData);
31209 tejbeer 4320
				this.sendMailOfHtmlFormat(email, sb, null, subject);
31206 tejbeer 4321
			}
4322
 
4323
		}
4324
 
4325
	}
4326
 
4327
	private String getMessageHygieneAlertForPartner(
4328
			Map<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthData,
4329
			Map<Integer, Map<LocalDate, List<HygieneData>>> partnerDateWiseData) {
4330
 
4331
		Map<Integer, CustomRetailer> customeRetailerMap = retailerService.getAllFofoRetailers();
4332
 
4333
		LocalDateTime startDate = LocalDate.now().withDayOfMonth(1).atStartOfDay();
4334
		LocalDateTime endDate = LocalDateTime.now();
4335
 
4336
		LocalDateTime startYearMonth = LocalDate.now().withDayOfMonth(1).minusMonths(3).atStartOfDay();
4337
		LocalDateTime endYearMonth = LocalDate.now().minusMonths(1)
4338
				.withDayOfMonth(LocalDate.now().minusMonths(1).lengthOfMonth()).atTime(LocalTime.MAX);
4339
 
4340
		DateTimeFormatter dateYearMonthFormatter = DateTimeFormatter.ofPattern("MMM''uu");
4341
 
4342
		List<YearMonth> yearMonthRange = new ArrayList<>();
4343
		yearMonthRange.add(YearMonth.from(startYearMonth));
4344
 
4345
		yearMonthRange.add(YearMonth.from(startYearMonth.plusMonths(1)));
4346
 
4347
		yearMonthRange.add(YearMonth.from(endYearMonth));
4348
 
4349
		long noOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate.plusDays(1));
4350
 
4351
		List<LocalDate> dateRange = Stream.iterate(startDate.toLocalDate(), date -> date.plusDays(1))
4352
				.limit(noOfDaysBetween).collect(Collectors.toList());
4353
 
4354
		StringBuilder sb = new StringBuilder();
4355
		sb.append("<html><body><p>Hi,"
4356
				+ "</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"
4357
				+ " </p>" + "<p>Kindly ensure going forward that the details are correct so to avoid 1% margin loss.\n"
4358
				+ "</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>"
4359
 
4360
				+ "<table style='border:1px solid black ;padding: 5px';>");
4361
		sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4362
		sb.append("<th style='border:1px solid black;padding: 5px'>Partner Name</th>\n");
4363
 
4364
		for (YearMonth yearMonth : yearMonthRange) {
4365
			sb.append("<th style='border:1px solid black;padding: 5px'>" + yearMonth.format(dateYearMonthFormatter)
4366
					+ "</th>\n");
4367
		}
4368
 
4369
		for (LocalDate localDate : dateRange) {
4370
			sb.append("<th style='border:1px solid black;padding: 5px'>" + localDate + "</th>\n");
4371
		}
4372
 
4373
		sb.append("</tr>\n");
4374
 
4375
		for (Entry<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthEntry : partnerYearMonthData
4376
				.entrySet()) {
4377
 
4378
			int fofoId = partnerYearMonthEntry.getKey();
4379
 
4380
			Map<YearMonth, List<HygieneData>> yearMonthData = partnerYearMonthEntry.getValue();
4381
 
4382
			Map<LocalDate, List<HygieneData>> dateWiseData = partnerDateWiseData.get(fofoId);
4383
 
4384
			if (yearMonthData == null && dateWiseData == null) {
4385
				continue;
4386
			}
4387
 
4388
			sb.append("<tr>");
4389
			sb.append("<td style='border:1px solid black;padding: 5px'>"
4390
					+ customeRetailerMap.get(fofoId).getBusinessName() + "</td>\n");
4391
			for (YearMonth yearMonth : yearMonthRange) {
4392
 
4393
				if (yearMonthData == null) {
4394
					sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
4395
 
4396
				} else {
4397
					List<HygieneData> hygieneList = yearMonthData.get(yearMonth);
4398
 
4399
					if (hygieneList != null) {
4400
						sb.append("<td style='border:1px solid black;padding: 5px'>" + hygieneList.size() + "</td>\n");
4401
 
4402
					} else {
4403
						sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
4404
 
4405
					}
4406
				}
4407
			}
4408
 
4409
			for (LocalDate localDate : dateRange) {
4410
 
4411
				if (dateWiseData == null) {
4412
					sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
4413
 
4414
				} else {
4415
					List<HygieneData> hygieneList = dateWiseData.get(localDate);
4416
 
4417
					if (hygieneList != null) {
4418
						sb.append("<td style='border:1px solid black;padding: 5px'>" + hygieneList.size() + "</td>\n");
4419
 
4420
					} else {
4421
						sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
4422
 
4423
					}
4424
				}
4425
			}
4426
			sb.append("</tr>");
4427
 
4428
		}
4429
 
4430
		sb.append("</tbody></table></body></html>");
4431
 
4432
		return sb.toString();
4433
	}
4434
 
31218 tejbeer 4435
	@Autowired
4436
	private MonthlyTargetRepository monthlyTargetRepository;
4437
 
4438
	public void monthlyTargetForPartner() throws MessagingException, ProfitMandiBusinessException, IOException {
4439
 
4440
		LocalDateTime curDate = LocalDateTime.now();
4441
		List<MonthlyTarget> monthlyTargets = monthlyTargetRepository.selectByDate(YearMonth.now());
4442
 
4443
		Map<Integer, MonthlyTarget> partnersMonthlyTarget = monthlyTargets.stream()
4444
				.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
4445
 
4446
		Map<Integer, Double> secondaryMtd = orderRepository
4447
				.selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
4448
		Map<Integer, Double> todaytertiary = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate,
4449
				curDate.with(LocalTime.MAX), 0, false);
4450
 
31249 tejbeer 4451
		String subject = "Monthly Target Vs Achievement";
31218 tejbeer 4452
 
4453
		for (Entry<Integer, MonthlyTarget> partnerMonthlyTargetEntry : partnersMonthlyTarget.entrySet()) {
4454
 
4455
			int fofoId = partnerMonthlyTargetEntry.getKey();
4456
 
4457
			CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
4458
 
4459
			Double purchaseTarget = partnerMonthlyTargetEntry.getValue().getPurchaseTarget();
4460
 
4461
			Double saleTarget = partnerMonthlyTargetEntry.getValue().getSaleTarget();
4462
 
4463
			if (purchaseTarget > 0) {
4464
				Double purchase = secondaryMtd.get(fofoId);
4465
 
31249 tejbeer 4466
				if (purchase == null) {
4467
					purchase = 0.0;
4468
				}
4469
 
4470
				Double balanceTarget = purchaseTarget - purchase;
4471
 
4472
				if (balanceTarget <= 0) {
4473
					balanceTarget = 0.0;
4474
				}
4475
 
31218 tejbeer 4476
				StringBuilder sb = new StringBuilder();
31249 tejbeer 4477
				sb.append("<html><body><p>Dear Partner,\n");
4478
				sb.append("<p>Pls note your agreed monthly target is Rs." + purchaseTarget
4479
						+ " and your achievement till date is Rs." + purchase + "</p>");
4480
				sb.append("<p>Pls note that your balance target is Rs." + balanceTarget + "</p>\n");
4481
				sb.append(
4482
						"<p>We wish you all the best and we are confident that this focussed approach towards our outlet sales will help us take our outlet to the best SmartDukaan in your city.\n"
4483
								+ "</p>\n");
31218 tejbeer 4484
 
4485
				this.sendMailOfHtmlFormat(customRetailer.getEmail(), sb.toString(), null, subject);
4486
 
31249 tejbeer 4487
				// this.sendMailOfHtmlFormat("tejbeer.kaur@smartdukaan.com", sb.toString(),
4488
				// null, subject);
4489
 
31218 tejbeer 4490
			}
4491
 
4492
		}
4493
 
4494
	}
4495
 
4496
	public void monthlyTargetForInternalTeam() throws MessagingException, ProfitMandiBusinessException, IOException {
4497
 
4498
		LocalDateTime curDate = LocalDateTime.now();
4499
 
4500
		List<Integer> categoryIds = Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_CATEGORY,
4501
				ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_SALES,
4502
				ProfitMandiConstants.TICKET_CATEGORY_MARKETING, ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS,
4503
				ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT);
4504
 
4505
		Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds);
4506
 
4507
		List<MonthlyTarget> monthlyTargets = monthlyTargetRepository.selectByDate(YearMonth.now());
4508
 
4509
		Map<Integer, CustomRetailer> customeRetailerMap = retailerService.getAllFofoRetailers();
4510
 
4511
		Map<Integer, MonthlyTarget> partnersMonthlyTarget = monthlyTargets.stream()
4512
				.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
4513
 
4514
		Map<Integer, Double> secondaryMtd = orderRepository
4515
				.selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
4516
		Map<Integer, Double> todaytertiary = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate,
4517
				curDate.with(LocalTime.MAX), 0, false);
4518
 
31249 tejbeer 4519
		String subject = "Monthly Target Vs Achievement";
31218 tejbeer 4520
 
4521
		for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
4522
 
4523
			String email = storeGuyEntry.getKey();
4524
 
4525
			List<Integer> fofoIds = new ArrayList<>(storeGuyEntry.getValue());
4526
			Map<Integer, MonthlyTarget> monthlyTargetAchievement = new HashMap<>();
4527
			for (Integer fofoId : fofoIds) {
4528
 
4529
				MonthlyTarget monthlyTarget = partnersMonthlyTarget.get(fofoId);
31249 tejbeer 4530
				if (monthlyTarget != null) {
4531
					Double purchaseTarget = monthlyTarget.getPurchaseTarget();
31218 tejbeer 4532
 
31249 tejbeer 4533
					Double saleTarget = monthlyTarget.getSaleTarget();
31218 tejbeer 4534
 
31249 tejbeer 4535
					if (purchaseTarget != null && purchaseTarget > 0) {
4536
						Double purchase = secondaryMtd.get(fofoId);
4537
						if (purchase == null) {
4538
							purchase = 0.0;
4539
						}
4540
						monthlyTarget.setPurchaseAchievement(purchase);
4541
						monthlyTargetAchievement.put(fofoId, monthlyTarget);
31218 tejbeer 4542
 
31249 tejbeer 4543
					}
31218 tejbeer 4544
				}
4545
			}
4546
 
4547
			if (!monthlyTargetAchievement.isEmpty()) {
4548
 
4549
				StringBuilder sb = new StringBuilder();
4550
 
31249 tejbeer 4551
				sb.append("<html><body><p>Hi,\n");
4552
				sb.append("<p>Pls note your Partners agreed monthly target foolowing are :</p>\n"
4553
						+ " <table style='border:1px solid black ;padding: 5px';>");
31218 tejbeer 4554
				sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4555
				sb.append("<th style='border:1px solid black;padding: 5px'>Partner Name</th>\n");
4556
 
4557
				sb.append("<th style='border:1px solid black;padding: 5px'>Purchase Target</th>\n");
4558
 
4559
				sb.append("<th style='border:1px solid black;padding: 5px'>Purchase Achievement</th>\n");
4560
				sb.append("</tr>\n");
4561
 
4562
				for (Entry<Integer, MonthlyTarget> monthlyTargetAchievementEntry : monthlyTargetAchievement
4563
						.entrySet()) {
4564
					sb.append("<tr>");
4565
					int fofoId = monthlyTargetAchievementEntry.getKey();
4566
 
4567
					MonthlyTarget monthlyTarget = monthlyTargetAchievementEntry.getValue();
4568
					sb.append("<td style='border:1px solid black;padding: 5px'>"
4569
							+ customeRetailerMap.get(fofoId).getBusinessName() + "</td>\n");
4570
 
4571
					sb.append("<td style='border:1px solid black;padding: 5px'>" + monthlyTarget.getPurchaseTarget()
4572
							+ "</td>\n");
4573
 
4574
					sb.append("<td style='border:1px solid black;padding: 5px'>"
4575
							+ monthlyTarget.getPurchaseAchievement() + "</td>\n");
4576
 
4577
					sb.append("</tr>\n");
4578
 
4579
				}
4580
 
4581
				this.sendMailOfHtmlFormat(email, sb.toString(), null, subject);
31249 tejbeer 4582
				// this.sendMailOfHtmlFormat("tejbeer.kaur@smartdukaan.com", sb.toString(),
4583
				// null, subject);
31218 tejbeer 4584
 
4585
			}
4586
 
4587
		}
4588
 
4589
	}
4590
 
26418 tejbeer 4591
}
31206 tejbeer 4592
// 2284'