Subversion Repositories SmartDukaan

Rev

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