Subversion Repositories SmartDukaan

Rev

Rev 29441 | Rev 29451 | 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
 
24121 govind 3
import java.io.IOException;
24807 amit.gupta 4
import java.io.Serializable;
23739 amit.gupta 5
import java.sql.Timestamp;
28805 amit.gupta 6
import java.time.Duration;
23724 amit.gupta 7
import java.time.LocalDate;
8
import java.time.LocalDateTime;
24256 amit.gupta 9
import java.time.LocalTime;
27271 amit.gupta 10
import java.time.Month;
29107 amit.gupta 11
import java.time.YearMonth;
24653 govind 12
import java.time.format.DateTimeFormatter;
29107 amit.gupta 13
import java.time.temporal.ChronoField;
23724 amit.gupta 14
import java.time.temporal.ChronoUnit;
15
import java.util.ArrayList;
16
import java.util.Arrays;
27683 amit.gupta 17
import java.util.Base64;
24627 amit.gupta 18
import java.util.Collections;
26945 amit.gupta 19
import java.util.Comparator;
23723 amit.gupta 20
import java.util.HashMap;
24241 amit.gupta 21
import java.util.HashSet;
23724 amit.gupta 22
import java.util.List;
23723 amit.gupta 23
import java.util.Map;
28205 tejbeer 24
import java.util.Map.Entry;
24242 amit.gupta 25
import java.util.Optional;
24542 amit.gupta 26
import java.util.Set;
23724 amit.gupta 27
import java.util.stream.Collectors;
23723 amit.gupta 28
 
24121 govind 29
import javax.mail.MessagingException;
30
import javax.mail.internet.InternetAddress;
31
import javax.mail.internet.MimeMessage;
32
 
23929 amit.gupta 33
import org.apache.commons.io.output.ByteArrayOutputStream;
25598 amit.gupta 34
import org.apache.commons.lang.StringUtils;
25300 tejbeer 35
import org.apache.http.client.methods.CloseableHttpResponse;
36
import org.apache.http.client.methods.HttpPost;
37
import org.apache.http.entity.StringEntity;
38
import org.apache.http.impl.client.CloseableHttpClient;
39
import org.apache.http.impl.client.HttpClients;
23755 amit.gupta 40
import org.apache.logging.log4j.LogManager;
41
import org.apache.logging.log4j.Logger;
29308 tejbeer 42
import org.json.JSONArray;
25300 tejbeer 43
import org.json.JSONObject;
23723 amit.gupta 44
import org.springframework.beans.factory.annotation.Autowired;
23933 amit.gupta 45
import org.springframework.beans.factory.annotation.Qualifier;
23724 amit.gupta 46
import org.springframework.beans.factory.annotation.Value;
23929 amit.gupta 47
import org.springframework.core.io.ByteArrayResource;
24692 amit.gupta 48
import org.springframework.core.io.InputStreamSource;
23929 amit.gupta 49
import org.springframework.mail.javamail.JavaMailSender;
24121 govind 50
import org.springframework.mail.javamail.MimeMessageHelper;
23723 amit.gupta 51
import org.springframework.stereotype.Component;
23724 amit.gupta 52
import org.springframework.transaction.annotation.Transactional;
23723 amit.gupta 53
 
24542 amit.gupta 54
import com.google.common.collect.Lists;
25300 tejbeer 55
import com.google.gson.Gson;
28369 tejbeer 56
import com.razorpay.Payment;
25721 tejbeer 57
import com.spice.profitmandi.common.enumuration.MessageType;
23724 amit.gupta 58
import com.spice.profitmandi.common.enumuration.RechargeStatus;
24681 amit.gupta 59
import com.spice.profitmandi.common.enumuration.ReporticoProject;
24121 govind 60
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
23929 amit.gupta 61
import com.spice.profitmandi.common.model.CustomRetailer;
25721 tejbeer 62
import com.spice.profitmandi.common.model.FocusedModelShortageModel;
24542 amit.gupta 63
import com.spice.profitmandi.common.model.GstRate;
27678 amit.gupta 64
import com.spice.profitmandi.common.model.PdfModel;
25590 amit.gupta 65
import com.spice.profitmandi.common.model.ProfitMandiConstants;
23724 amit.gupta 66
import com.spice.profitmandi.common.model.RechargeCredential;
25821 amit.gupta 67
import com.spice.profitmandi.common.model.SendNotificationModel;
24681 amit.gupta 68
import com.spice.profitmandi.common.services.ReporticoService;
24002 amit.gupta 69
import com.spice.profitmandi.common.util.FileUtil;
23929 amit.gupta 70
import com.spice.profitmandi.common.util.FormattingUtils;
27678 amit.gupta 71
import com.spice.profitmandi.common.util.PdfUtils;
23929 amit.gupta 72
import com.spice.profitmandi.common.util.Utils;
24592 amit.gupta 73
import com.spice.profitmandi.common.util.Utils.Attachment;
29308 tejbeer 74
import com.spice.profitmandi.common.web.client.RestClient;
25300 tejbeer 75
import com.spice.profitmandi.dao.Interface.Campaign;
25590 amit.gupta 76
import com.spice.profitmandi.dao.entity.auth.AuthUser;
25800 tejbeer 77
import com.spice.profitmandi.dao.entity.catalog.FocusedModel;
25609 amit.gupta 78
import com.spice.profitmandi.dao.entity.catalog.Item;
24590 amit.gupta 79
import com.spice.profitmandi.dao.entity.catalog.Scheme;
25590 amit.gupta 80
import com.spice.profitmandi.dao.entity.cs.Position;
26283 tejbeer 81
import com.spice.profitmandi.dao.entity.cs.Ticket;
23724 amit.gupta 82
import com.spice.profitmandi.dao.entity.dtr.DailyRecharge;
28769 amit.gupta 83
import com.spice.profitmandi.dao.entity.dtr.EmployeeAttendance;
27678 amit.gupta 84
import com.spice.profitmandi.dao.entity.dtr.InsurancePolicy;
25300 tejbeer 85
import com.spice.profitmandi.dao.entity.dtr.NotificationCampaign;
86
import com.spice.profitmandi.dao.entity.dtr.PushNotifications;
23724 amit.gupta 87
import com.spice.profitmandi.dao.entity.dtr.RechargeProvider;
88
import com.spice.profitmandi.dao.entity.dtr.RechargeProviderCreditWalletHistory;
89
import com.spice.profitmandi.dao.entity.dtr.RechargeTransaction;
28769 amit.gupta 90
import com.spice.profitmandi.dao.entity.dtr.User;
26283 tejbeer 91
import com.spice.profitmandi.dao.entity.fofo.ActivityType;
28368 tejbeer 92
import com.spice.profitmandi.dao.entity.fofo.Customer;
24542 amit.gupta 93
import com.spice.profitmandi.dao.entity.fofo.CustomerAddress;
24590 amit.gupta 94
import com.spice.profitmandi.dao.entity.fofo.FofoLineItem;
23724 amit.gupta 95
import com.spice.profitmandi.dao.entity.fofo.FofoOrder;
24542 amit.gupta 96
import com.spice.profitmandi.dao.entity.fofo.FofoOrderItem;
23929 amit.gupta 97
import com.spice.profitmandi.dao.entity.fofo.FofoStore;
24249 amit.gupta 98
import com.spice.profitmandi.dao.entity.fofo.InventoryItem;
24277 amit.gupta 99
import com.spice.profitmandi.dao.entity.fofo.PartnerDailyInvestment;
28205 tejbeer 100
import com.spice.profitmandi.dao.entity.fofo.PartnerProblem;
28971 amit.gupta 101
import com.spice.profitmandi.dao.entity.fofo.PartnerType;
28368 tejbeer 102
import com.spice.profitmandi.dao.entity.fofo.PendingOrder;
103
import com.spice.profitmandi.dao.entity.fofo.PendingOrderItem;
23724 amit.gupta 104
import com.spice.profitmandi.dao.entity.fofo.Purchase;
28368 tejbeer 105
import com.spice.profitmandi.dao.entity.fofo.RazorPay;
24242 amit.gupta 106
import com.spice.profitmandi.dao.entity.fofo.ScanRecord;
24241 amit.gupta 107
import com.spice.profitmandi.dao.entity.fofo.SchemeInOut;
27208 tejbeer 108
import com.spice.profitmandi.dao.entity.inventory.SaholicCIS;
109
import com.spice.profitmandi.dao.entity.inventory.SaholicPOItem;
29308 tejbeer 110
import com.spice.profitmandi.dao.entity.transaction.Order;
24431 amit.gupta 111
import com.spice.profitmandi.dao.entity.transaction.PriceDrop;
25609 amit.gupta 112
import com.spice.profitmandi.dao.entity.transaction.PriceDropIMEI;
24587 amit.gupta 113
import com.spice.profitmandi.dao.entity.transaction.UserWallet;
24580 amit.gupta 114
import com.spice.profitmandi.dao.entity.transaction.UserWalletHistory;
24542 amit.gupta 115
import com.spice.profitmandi.dao.entity.user.Address;
25300 tejbeer 116
import com.spice.profitmandi.dao.entity.user.Device;
25927 amit.gupta 117
import com.spice.profitmandi.dao.entity.user.FranchiseeVisit;
25910 amit.gupta 118
import com.spice.profitmandi.dao.entity.user.Lead;
26790 tejbeer 119
import com.spice.profitmandi.dao.entity.user.Refferal;
24250 amit.gupta 120
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
25598 amit.gupta 121
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
26790 tejbeer 122
import com.spice.profitmandi.dao.enumuration.dtr.RefferalStatus;
24242 amit.gupta 123
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
25609 amit.gupta 124
import com.spice.profitmandi.dao.enumuration.transaction.PriceDropImeiStatus;
25300 tejbeer 125
import com.spice.profitmandi.dao.model.SimpleCampaign;
126
import com.spice.profitmandi.dao.model.SimpleCampaignParams;
25590 amit.gupta 127
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
25300 tejbeer 128
import com.spice.profitmandi.dao.repository.catalog.DeviceRepository;
25721 tejbeer 129
import com.spice.profitmandi.dao.repository.catalog.FocusedModelRepository;
24249 amit.gupta 130
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
24241 amit.gupta 131
import com.spice.profitmandi.dao.repository.catalog.SchemeRepository;
26929 amit.gupta 132
import com.spice.profitmandi.dao.repository.catalog.StateGstRateRepository;
25590 amit.gupta 133
import com.spice.profitmandi.dao.repository.cs.CsService;
27088 tejbeer 134
import com.spice.profitmandi.dao.repository.cs.PartnerRegionRepository;
25590 amit.gupta 135
import com.spice.profitmandi.dao.repository.cs.PositionRepository;
27088 tejbeer 136
import com.spice.profitmandi.dao.repository.cs.RegionRepository;
26283 tejbeer 137
import com.spice.profitmandi.dao.repository.cs.TicketRepository;
23724 amit.gupta 138
import com.spice.profitmandi.dao.repository.dtr.DailyRechargeRepository;
28769 amit.gupta 139
import com.spice.profitmandi.dao.repository.dtr.EmployeeAttendanceRepository;
23929 amit.gupta 140
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
25927 amit.gupta 141
import com.spice.profitmandi.dao.repository.dtr.FranchiseeActivityRepository;
142
import com.spice.profitmandi.dao.repository.dtr.FranchiseeVisitRepository;
25837 amit.gupta 143
import com.spice.profitmandi.dao.repository.dtr.InsurancePolicyRepository;
25910 amit.gupta 144
import com.spice.profitmandi.dao.repository.dtr.LeadRepository;
24653 govind 145
import com.spice.profitmandi.dao.repository.dtr.Mongo;
25300 tejbeer 146
import com.spice.profitmandi.dao.repository.dtr.NotificationCampaignRepository;
28205 tejbeer 147
import com.spice.profitmandi.dao.repository.dtr.PartnerProblemRepository;
25300 tejbeer 148
import com.spice.profitmandi.dao.repository.dtr.PushNotificationRepository;
23724 amit.gupta 149
import com.spice.profitmandi.dao.repository.dtr.RechargeProviderCreditWalletHistoryRepository;
150
import com.spice.profitmandi.dao.repository.dtr.RechargeProviderRepository;
151
import com.spice.profitmandi.dao.repository.dtr.RechargeTransactionRepository;
26790 tejbeer 152
import com.spice.profitmandi.dao.repository.dtr.RefferalRepository;
24542 amit.gupta 153
import com.spice.profitmandi.dao.repository.dtr.RetailerRegisteredAddressRepository;
24669 govind 154
import com.spice.profitmandi.dao.repository.dtr.UserAccountRepository;
25721 tejbeer 155
import com.spice.profitmandi.dao.repository.dtr.UserCampaignRepository;
26408 amit.gupta 156
import com.spice.profitmandi.dao.repository.fofo.ActivatedImeiRepository;
25721 tejbeer 157
import com.spice.profitmandi.dao.repository.fofo.CurrentInventorySnapshotRepository;
24542 amit.gupta 158
import com.spice.profitmandi.dao.repository.fofo.CustomerAddressRepository;
28377 tejbeer 159
import com.spice.profitmandi.dao.repository.fofo.CustomerRepository;
24590 amit.gupta 160
import com.spice.profitmandi.dao.repository.fofo.FofoLineItemRepository;
24542 amit.gupta 161
import com.spice.profitmandi.dao.repository.fofo.FofoOrderItemRepository;
23724 amit.gupta 162
import com.spice.profitmandi.dao.repository.fofo.FofoOrderRepository;
24249 amit.gupta 163
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
24277 amit.gupta 164
import com.spice.profitmandi.dao.repository.fofo.PartnerDailyInvestmentRepository;
24174 govind 165
import com.spice.profitmandi.dao.repository.fofo.PartnerTargetRepository;
27086 tejbeer 166
import com.spice.profitmandi.dao.repository.fofo.PartnerTypeChangeRepository;
25503 amit.gupta 167
import com.spice.profitmandi.dao.repository.fofo.PartnerTypeChangeService;
28368 tejbeer 168
import com.spice.profitmandi.dao.repository.fofo.PendingOrderItemRepository;
169
import com.spice.profitmandi.dao.repository.fofo.PendingOrderRepository;
28377 tejbeer 170
import com.spice.profitmandi.dao.repository.fofo.PendingOrderService;
23724 amit.gupta 171
import com.spice.profitmandi.dao.repository.fofo.PurchaseRepository;
28368 tejbeer 172
import com.spice.profitmandi.dao.repository.fofo.RazorPayRepository;
24242 amit.gupta 173
import com.spice.profitmandi.dao.repository.fofo.ScanRecordRepository;
24241 amit.gupta 174
import com.spice.profitmandi.dao.repository.fofo.SchemeInOutRepository;
28990 amit.gupta 175
import com.spice.profitmandi.dao.repository.inventory.StateRepository;
28775 amit.gupta 176
import com.spice.profitmandi.dao.repository.inventory.WarehouseRepository;
25982 amit.gupta 177
import com.spice.profitmandi.dao.repository.transaction.HdfcPaymentRepository;
23929 amit.gupta 178
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
25609 amit.gupta 179
import com.spice.profitmandi.dao.repository.transaction.PriceDropIMEIRepository;
24431 amit.gupta 180
import com.spice.profitmandi.dao.repository.transaction.PriceDropRepository;
24580 amit.gupta 181
import com.spice.profitmandi.dao.repository.transaction.UserWalletHistoryRepository;
24587 amit.gupta 182
import com.spice.profitmandi.dao.repository.transaction.UserWalletRepository;
24542 amit.gupta 183
import com.spice.profitmandi.dao.repository.user.AddressRepository;
25721 tejbeer 184
import com.spice.profitmandi.dao.repository.user.UserRepository;
25854 amit.gupta 185
import com.spice.profitmandi.service.NotificationService;
24337 amit.gupta 186
import com.spice.profitmandi.service.PartnerInvestmentService;
28368 tejbeer 187
import com.spice.profitmandi.service.integrations.RazorpayPaymentService;
25694 amit.gupta 188
import com.spice.profitmandi.service.integrations.toffee.ToffeeService;
23929 amit.gupta 189
import com.spice.profitmandi.service.inventory.InventoryService;
27208 tejbeer 190
import com.spice.profitmandi.service.inventory.SaholicInventoryService;
25335 amit.gupta 191
import com.spice.profitmandi.service.order.OrderService;
24431 amit.gupta 192
import com.spice.profitmandi.service.pricing.PriceDropService;
23724 amit.gupta 193
import com.spice.profitmandi.service.recharge.provider.OxigenRechargeProviderService;
194
import com.spice.profitmandi.service.recharge.provider.ThinkWalnutDigitalRechargeProviderService;
195
import com.spice.profitmandi.service.scheme.SchemeService;
23929 amit.gupta 196
import com.spice.profitmandi.service.transaction.TransactionService;
197
import com.spice.profitmandi.service.user.RetailerService;
23739 amit.gupta 198
import com.spice.profitmandi.service.wallet.WalletService;
23723 amit.gupta 199
 
25721 tejbeer 200
import in.shop2020.model.v1.order.OrderStatus;
29308 tejbeer 201
import in.shop2020.model.v1.order.WalletReferenceType;
202
import okhttp3.OkHttpClient;
203
import okhttp3.Request;
204
import okhttp3.Response;;
23739 amit.gupta 205
 
23723 amit.gupta 206
@Component
23724 amit.gupta 207
@Transactional(rollbackFor = Throwable.class)
23723 amit.gupta 208
public class ScheduledTasks {
209
 
23724 amit.gupta 210
	@Value("${oxigen.recharge.transaction.url}")
211
	private String oxigenRechargeTransactionUrl;
23723 amit.gupta 212
 
23724 amit.gupta 213
	@Value("${oxigen.recharge.enquiry.url}")
214
	private String oxigenRechargeEnquiryUrl;
24533 govind 215
 
24431 amit.gupta 216
	@Autowired
27088 tejbeer 217
	private RegionRepository regionRepository;
28205 tejbeer 218
 
27795 amit.gupta 219
	private static final DateTimeFormatter leadTimeFormatter = DateTimeFormatter.ofPattern("d LLL, hh:mm a");
27088 tejbeer 220
 
221
	@Autowired
222
	private PartnerRegionRepository partnerRegionRepository;
28790 amit.gupta 223
 
28769 amit.gupta 224
	@Autowired
225
	private EmployeeAttendanceRepository employeeAttendanceRepository;
27088 tejbeer 226
 
227
	@Autowired
25503 amit.gupta 228
	private PartnerTypeChangeService partnerTypeChangeService;
25598 amit.gupta 229
 
25590 amit.gupta 230
	@Autowired
26408 amit.gupta 231
	private ActivatedImeiRepository activatedImeiRepository;
232
 
233
	@Autowired
25910 amit.gupta 234
	private LeadRepository leadRepository;
25927 amit.gupta 235
 
25910 amit.gupta 236
	@Autowired
25590 amit.gupta 237
	private AuthRepository authRepository;
25503 amit.gupta 238
 
239
	@Autowired
24431 amit.gupta 240
	private PriceDropService priceDropService;
26283 tejbeer 241
 
25590 amit.gupta 242
	@Autowired
25927 amit.gupta 243
	private FranchiseeVisitRepository franchiseeVisitRepository;
26790 tejbeer 244
 
25927 amit.gupta 245
	@Autowired
246
	private FranchiseeActivityRepository franchiseeActivityRepository;
26790 tejbeer 247
 
25927 amit.gupta 248
	@Autowired
25982 amit.gupta 249
	private HdfcPaymentRepository hdfcPaymentRepository;
26790 tejbeer 250
 
25982 amit.gupta 251
	@Autowired
25590 amit.gupta 252
	private CsService csService;
25846 amit.gupta 253
 
25837 amit.gupta 254
	@Autowired
27208 tejbeer 255
	private SaholicInventoryService saholicInventoryService;
256
 
257
	@Autowired
25837 amit.gupta 258
	private InsurancePolicyRepository insurancePolicyRepository;
23723 amit.gupta 259
 
25694 amit.gupta 260
	@Autowired
261
	private ToffeeService toffeeService;
262
 
23724 amit.gupta 263
	@Value("${oxigen.recharge.auth.key}")
264
	private String oxigenRechargeAuthKey;
265
 
266
	@Value("${oxigen.recharge.validation.url}")
267
	private String oxigenRechargeValidationUrl;
268
 
269
	@Value("${oxigen.recharge.validation.auth.key}")
270
	private String oxigenRechargeValidationAuthKey;
271
 
272
	@Value("${think.walnut.digital.recharge.transaction.mobile.url}")
273
	private String thinkWalnutDigitalRechargeTransactionMobileUrl;
274
 
275
	@Value("${think.walnut.digital.recharge.transaction.dth.url}")
276
	private String thinkWalnutDigitalRechargeTransactionDthUrl;
277
 
278
	@Value("${think.walnut.digital.recharge.enquiry.url}")
279
	private String thinkWalnutDigitalRechargeEnquiryUrl;
280
 
281
	@Value("${think.walnut.digital.recharge.balance.url}")
282
	private String thinkWalnutDigitalRechargeBalanceUrl;
283
 
284
	@Value("${think.walnut.digital.recharge.username}")
285
	private String thinkWalnutDigitalRechargeUserName;
286
 
287
	@Value("${think.walnut.digital.recharge.password}")
288
	private String thinkWalnutDigitalRechargePassword;
289
 
290
	@Value("${think.walnut.digital.recharge.auth.key}")
291
	private String thinkWalnutDigitalRechargeAuthKey;
292
 
23723 amit.gupta 293
	@Autowired
23724 amit.gupta 294
	private PurchaseRepository purchaseRepository;
295
 
296
	@Autowired
25609 amit.gupta 297
	private PriceDropIMEIRepository priceDropIMEIRepository;
298
 
299
	@Autowired
300
	PriceDropRepository priceDropRepository;
301
 
302
	@Autowired
27086 tejbeer 303
	private PartnerTypeChangeRepository partnerTypeChangeRepository;
28368 tejbeer 304
 
27086 tejbeer 305
	@Autowired
23724 amit.gupta 306
	private SchemeService schemeService;
24683 amit.gupta 307
 
29308 tejbeer 308
	@Value("${delhivery.tracking.token}")
309
	private String token;
310
 
29160 amit.gupta 311
	private static final String[] STOCK_AGEING_MAIL_LIST = new String[] { "uday.singh@smartudkaan.com",
312
			"mohinder.mutreja@smartdukaan.com", "ankit.bhatia@smartdukaan.com", "tarun.verma@smartdukaan.com",
28467 tejbeer 313
			"kuldeep.kumar@smartdukaan.com", "manish.gupta@smartdukaan.com" };
25609 amit.gupta 314
 
315
	private static final String[] ITEMWISE_PENDING_INDENT_MAIL_LIST = new String[] { "kamini.sharma@smartdukaan.com",
28205 tejbeer 316
			"tarun.verma@smartdukaan.com", "uday.singh@smartdukaan.com", "kuldeep.kumar@smartdukaan.com",
317
			"niranjan.kala@smartdukaan.com" };
25609 amit.gupta 318
 
28709 amit.gupta 319
	private static final String[] INDENT_TERTIARY_MAIL_LIST = new String[] { "uday.singh@smartdukaan.com",
320
			"kuldeep.kumar@smartdukaan.com" };
321
 
28790 amit.gupta 322
	private static final String[] EMPLOYEE_ATTENDANCE_MAIL_LIST = new String[] { "jyoti.rawat@smartdukaan.com",
323
			"sm@smartdukaan.com" };
324
 
25721 tejbeer 325
	private List<OrderStatus> orderStatusList = Arrays.asList(OrderStatus.SUBMITTED_FOR_PROCESSING);
326
 
24681 amit.gupta 327
	@Autowired
328
	private ReporticoService reporticoService;
23724 amit.gupta 329
 
330
	@Autowired
24337 amit.gupta 331
	private PartnerInvestmentService partnerInvestmentService;
25598 amit.gupta 332
 
25590 amit.gupta 333
	@Autowired
334
	private PositionRepository positionRepository;
24337 amit.gupta 335
 
336
	@Autowired
24542 amit.gupta 337
	private FofoOrderItemRepository fofoOrderItemRepository;
25865 amit.gupta 338
 
25854 amit.gupta 339
	@Autowired
340
	private NotificationService notificationService;
24542 amit.gupta 341
 
342
	@Autowired
24277 amit.gupta 343
	private PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
344
 
345
	@Autowired
24241 amit.gupta 346
	private SchemeInOutRepository schemeInOutRepository;
347
 
348
	@Autowired
23724 amit.gupta 349
	private RechargeTransactionRepository rechargeTransactionRepository;
350
 
351
	@Autowired
24542 amit.gupta 352
	private CustomerAddressRepository customerAddressRepository;
353
 
354
	@Autowired
23724 amit.gupta 355
	private RechargeProviderCreditWalletHistoryRepository rechargeProviderCreditWalletHistoryRepository;
356
 
357
	@Autowired
24590 amit.gupta 358
	private FofoLineItemRepository fofoLineItemRepository;
359
 
360
	@Autowired
23724 amit.gupta 361
	private FofoOrderRepository fofoOrderRepository;
24587 amit.gupta 362
 
24580 amit.gupta 363
	@Autowired
364
	private UserWalletHistoryRepository userWalletHistoryRepository;
24250 amit.gupta 365
 
24249 amit.gupta 366
	@Autowired
24587 amit.gupta 367
	private UserWalletRepository userWalletRepository;
368
 
369
	@Autowired
24249 amit.gupta 370
	private InventoryItemRepository inventoryItemRepository;
23929 amit.gupta 371
 
23739 amit.gupta 372
	@Autowired
373
	private WalletService walletService;
23724 amit.gupta 374
 
375
	@Autowired
376
	private ThinkWalnutDigitalRechargeProviderService thinkWalnutDigitalRechargeProviderService;
377
 
378
	@Autowired
379
	private OxigenRechargeProviderService oxigenRechargeProviderService;
380
 
381
	@Autowired
382
	private RechargeProviderRepository rechargeProviderRepository;
383
 
384
	@Autowired
24242 amit.gupta 385
	private ScanRecordRepository scanRecordRepository;
386
 
387
	@Autowired
23724 amit.gupta 388
	private DailyRechargeRepository dailyRechargeRepository;
389
 
23929 amit.gupta 390
	@Autowired
391
	private FofoStoreRepository fofoStoreRepository;
24177 govind 392
 
23724 amit.gupta 393
	@Value("${prod}")
394
	private boolean prod;
26945 amit.gupta 395
 
26929 amit.gupta 396
	@Autowired
397
	private StateGstRateRepository stateGstRateRepository;
23724 amit.gupta 398
 
23929 amit.gupta 399
	@Autowired
400
	private RetailerService retailerService;
401
 
402
	@Autowired
403
	private TransactionService transactionService;
24250 amit.gupta 404
 
24249 amit.gupta 405
	@Autowired
406
	private ItemRepository itemRepository;
23929 amit.gupta 407
 
408
	@Autowired
409
	private OrderRepository orderRepository;
25351 tejbeer 410
 
25335 amit.gupta 411
	@Autowired
412
	private OrderService orderService;
23929 amit.gupta 413
 
414
	@Autowired
24241 amit.gupta 415
	private SchemeRepository schemeRepository;
416
 
417
	@Autowired
23929 amit.gupta 418
	private JavaMailSender mailSender;
24177 govind 419
 
24174 govind 420
	@Autowired
421
	private PartnerTargetRepository partnerTargetRepository;
24002 amit.gupta 422
 
423
	@Autowired
424
	@Qualifier(value = "googleMailSender")
23932 amit.gupta 425
	private JavaMailSender googleMailSender;
23929 amit.gupta 426
 
427
	@Autowired
428
	private InventoryService inventoryService;
429
 
24533 govind 430
	@Autowired
24542 amit.gupta 431
	private AddressRepository addressRepository;
432
 
433
	@Autowired
434
	private RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
435
 
24653 govind 436
	@Autowired
437
	private Mongo mongoClient;
24683 amit.gupta 438
 
24669 govind 439
	@Autowired
25300 tejbeer 440
	private DeviceRepository deviceRepository;
441
 
442
	@Autowired
443
	private PushNotificationRepository pushNotificationRepository;
444
 
445
	@Autowired
446
	private NotificationCampaignRepository notificationCampaignRepository;
447
 
448
	@Autowired
25721 tejbeer 449
	private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
450
 
451
	@Autowired
452
	private FocusedModelRepository focusedModelRepository;
453
 
454
	@Autowired
24669 govind 455
	private UserAccountRepository userAccountRepository;
24653 govind 456
 
25721 tejbeer 457
	@Autowired
25927 amit.gupta 458
	private UserRepository userUserRepository;
25721 tejbeer 459
 
460
	@Autowired
25927 amit.gupta 461
	private com.spice.profitmandi.dao.repository.dtr.UserRepository dtrUserRepository;
462
 
463
	@Autowired
25721 tejbeer 464
	private UserCampaignRepository userCampaignRepository;
465
 
466
	@Autowired
467
	private Gson gson;
468
 
26283 tejbeer 469
	@Autowired
470
	private TicketRepository ticketRepository;
471
 
26790 tejbeer 472
	@Autowired
473
	private RefferalRepository refferalRepository;
474
 
28205 tejbeer 475
	@Autowired
476
	private PartnerProblemRepository partnerProblemRepository;
477
 
28368 tejbeer 478
	@Autowired
479
	private PendingOrderRepository pendingOrderRepository;
480
 
481
	@Autowired
482
	private PendingOrderItemRepository pendingOrderItemRepository;
483
 
484
	@Value("${razorpay.account.keyId}")
485
	private String keyId;
486
 
487
	@Value("${razorpay.account.keySecret}")
488
	private String keySecret;
489
 
28369 tejbeer 490
	@Autowired
491
	private RazorpayPaymentService razorPaymentService;
492
 
493
	@Autowired
494
	private RazorPayRepository razorPayRepository;
495
 
28377 tejbeer 496
	@Autowired
497
	private PendingOrderService pendingOrderService;
498
 
499
	@Autowired
500
	private CustomerRepository customerRepository;
501
 
29308 tejbeer 502
	@Autowired
503
	private RestClient restClient;
504
 
23755 amit.gupta 505
	private static final Logger LOGGER = LogManager.getLogger(ScheduledTasks.class);
23724 amit.gupta 506
 
25300 tejbeer 507
	private String FCM_URL = "https://fcm.googleapis.com/fcm/send";
508
	private String FCM_API_KEY = "AAAASAjNcn4:APA91bG6fWRIgYJI0L9gCjP5ynaXz2hJHYKtD9dfH7Depdv31Nd9APJwhx-OPkAJ1WSz4BGNYG8lHThLFSjDGFxIwUZv241YcAJEGDLgt86mxq9FXJe-yBRu-S0_ZwHqmX-QaVKl5F_A";
509
 
23724 amit.gupta 510
	public void generateDailyRecharge() {
511
		List<RechargeProviderCreditWalletHistory> allCreditHistory = rechargeProviderCreditWalletHistoryRepository
512
				.selectAll(0, 2000);
513
		List<RechargeProvider> rechargeProviders = rechargeProviderRepository.selectAll();
514
		rechargeProviders.stream().forEach(x -> x.setAmount(0));
515
 
516
		rechargeProviders.stream().forEach(x -> {
517
			Map<LocalDate, List<RechargeProviderCreditWalletHistory>> dateWiseProviderCreditsMap = allCreditHistory
518
					.stream().filter(z -> z.getProviderId() == x.getId())
519
					.collect(Collectors.groupingBy(x1 -> x1.getReceiveTimestamp().toLocalDate()));
520
 
29252 amit.gupta 521
			LOGGER.info("dateWiseProviderCreditsMap -{}", dateWiseProviderCreditsMap);
23724 amit.gupta 522
			LocalDate endDate = LocalDate.now().plusDays(1);
523
			float previousDayClosing = 0;
524
			LocalDate date = LocalDate.of(2018, 4, 6);
525
			while (date.isBefore(endDate)) {
526
				List<RechargeTransaction> dateWiseRechargeTransactions = rechargeTransactionRepository
527
						.selectAllBetweenTimestamp(Arrays.asList(RechargeStatus.values()), date.atStartOfDay(),
528
								date.plusDays(1).atStartOfDay());
529
 
530
				List<RechargeTransaction> successfulTransactions = dateWiseRechargeTransactions.stream()
531
						.filter(y -> y.getStatus().equals(RechargeStatus.SUCCESS)).collect(Collectors.toList());
532
 
533
				float dailyAmount = 0;
534
				float totalCommission = 0;
535
				for (RechargeTransaction rechargeTransaction : successfulTransactions) {
536
					if (rechargeTransaction.getProviderId() == x.getId()) {
537
						dailyAmount += rechargeTransaction.getAmount();
538
						totalCommission += rechargeTransaction.getCommission();
539
					}
540
				}
541
 
542
				List<RechargeProviderCreditWalletHistory> rechargeHistoryList = dateWiseProviderCreditsMap.get(date);
543
				float dailyWalletRecharge = 0;
544
				if (rechargeHistoryList != null) {
545
					for (RechargeProviderCreditWalletHistory rechargeProviderCreditWalletHistory : rechargeHistoryList) {
546
						if (rechargeProviderCreditWalletHistory.getProviderId() == x.getId()) {
547
							dailyWalletRecharge += rechargeProviderCreditWalletHistory.getAmount();
548
						}
549
					}
550
				}
551
				if (dailyAmount > 0 || dailyWalletRecharge > 0) {
552
					DailyRecharge dailyRecharge = null;
553
					try {
554
						dailyRecharge = dailyRechargeRepository.selectByProviderIdAndCreateDate(x.getId(), date);
555
					} catch (Exception e) {
556
						LOGGER.info("Could not find Recharge entry");
557
					}
558
					if (dailyRecharge == null) {
559
						dailyRecharge = new DailyRecharge();
560
						dailyRecharge.setCreateDate(date);
561
					}
562
					dailyRecharge.setOpeningBalance(previousDayClosing);
563
					dailyRecharge.setProviderId(x.getId());
564
					dailyRecharge.setWalletRechargeAmount(dailyWalletRecharge);
565
					dailyRecharge.setTotalAmount(dailyAmount);
566
					dailyRecharge.setTotalCommission(totalCommission);
567
					float closingBalance = dailyRecharge.getOpeningBalance() + dailyWalletRecharge - dailyAmount;
568
					dailyRecharge.setClosingBalance(closingBalance);
569
					dailyRechargeRepository.persist(dailyRecharge);
570
					x.setAmount(x.getAmount() + dailyRecharge.getClosingBalance() - dailyRecharge.getOpeningBalance());
571
					previousDayClosing = dailyRecharge.getClosingBalance();
572
				}
573
				date = date.plusDays(1);
574
			}
575
			rechargeProviderRepository.persist(x);
576
		});
23761 amit.gupta 577
		LOGGER.info("finished generating daily recharge");
23724 amit.gupta 578
	}
579
 
23738 amit.gupta 580
	public void reconcileRecharge() throws Exception {
23724 amit.gupta 581
		LocalDateTime fromDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).minusDays(30);
582
		LocalDateTime toDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS);
583
		List<RechargeStatus> nonSuccessRechargeStatuses = new ArrayList<>(Arrays.asList(RechargeStatus.values()));
584
		LOGGER.info("nonSuccessRechargeStatuses {} ", nonSuccessRechargeStatuses);
585
		nonSuccessRechargeStatuses.remove(RechargeStatus.SUCCESS);
586
		nonSuccessRechargeStatuses.remove(RechargeStatus.FAILED);
587
		RechargeCredential thinkWalnutDigitalRechargeEnquiryCredential = new RechargeCredential();
588
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUrl(thinkWalnutDigitalRechargeEnquiryUrl);
589
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUserName(thinkWalnutDigitalRechargeUserName);
590
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargePassword(thinkWalnutDigitalRechargePassword);
591
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargeAuthKey(thinkWalnutDigitalRechargeAuthKey);
592
		Map<String, RechargeStatus> requestRechargeStatusChanged = new HashMap<>();
593
		List<RechargeTransaction> rechargeTransactions = rechargeTransactionRepository
594
				.selectAllBetweenTimestamp(nonSuccessRechargeStatuses, fromDate, toDate);
595
		for (RechargeTransaction rechargeTransaction : rechargeTransactions) {
596
			try {
597
				int providerId = rechargeTransaction.getProviderId();
598
				if (providerId == 1) {
599
					oxigenRechargeProviderService.doCheckStatusRequest(oxigenRechargeEnquiryUrl, oxigenRechargeAuthKey,
600
							rechargeTransaction);
601
				} else if (providerId == 2) {
602
					thinkWalnutDigitalRechargeProviderService
603
							.doCheckStatusRequest(thinkWalnutDigitalRechargeEnquiryCredential, rechargeTransaction);
604
				}
605
				if (rechargeTransaction.getStatus().equals(RechargeStatus.SUCCESS)
606
						|| rechargeTransaction.getStatus().equals(RechargeStatus.FAILED)) {
607
					requestRechargeStatusChanged.put(rechargeTransaction.getRequestId(),
608
							rechargeTransaction.getStatus());
609
				}
610
			} catch (Exception e) {
611
				LOGGER.info("Could not check status for Request {}", rechargeTransaction.getRequestId());
612
			}
613
		}
23738 amit.gupta 614
		LOGGER.info("Reconcile recharge ran successfully");
23724 amit.gupta 615
	}
28205 tejbeer 616
 
27438 amit.gupta 617
	public void processActivation() throws Exception {
618
		schemeService.processActivation();
619
	}
24240 amit.gupta 620
 
621
	// TemporaryMethod
24237 amit.gupta 622
	public void migrateInvoice() {
623
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectFromSaleDate(LocalDateTime.now().minusDays(3));
624
		Map<Integer, List<FofoOrder>> partnerOrdersMap = new HashMap<>();
24241 amit.gupta 625
		partnerOrdersMap = fofoOrders.stream()
626
				.collect(Collectors.groupingBy(FofoOrder::getFofoId, Collectors.toList()));
24237 amit.gupta 627
		for (List<FofoOrder> orderList : partnerOrdersMap.values()) {
24240 amit.gupta 628
			int sequence = 0;
629
			String prefix = "";
24241 amit.gupta 630
			List<FofoOrder> sortedList = orderList.stream().sorted((x1, x2) -> x1.getId() - x2.getId())
631
					.collect(Collectors.toList());
632
			for (FofoOrder order : sortedList) {
633
 
24240 amit.gupta 634
				LOGGER.info("Order Id is {}, partner Id is {}", order.getId(), order.getFofoId());
24241 amit.gupta 635
				if (!order.getInvoiceNumber().contains("SEC")) {
24240 amit.gupta 636
					sequence = Integer.parseInt(order.getInvoiceNumber().split("/")[1]);
637
					prefix = order.getInvoiceNumber().split("/")[0];
638
				} else {
639
					sequence += 1;
24241 amit.gupta 640
					String invoiceNumber = prefix + "/" + sequence;
24240 amit.gupta 641
					order.setInvoiceNumber(invoiceNumber);
642
					fofoOrderRepository.persist(order);
643
				}
644
			}
24241 amit.gupta 645
 
24237 amit.gupta 646
		}
647
	}
23724 amit.gupta 648
 
24241 amit.gupta 649
	// Temporary Method
24252 amit.gupta 650
	public void evaluateExcessSchemeOut() throws Exception {
24244 amit.gupta 651
		Map<Integer, String> userNameMap = retailerService.getAllFofoRetailerIdNameMap();
652
		Map<Integer, Float> userAmountMap = new HashMap<>();
24252 amit.gupta 653
 
25837 amit.gupta 654
		List<List<?>> rows = new ArrayList<>();
24271 amit.gupta 655
		List<String> headers = Arrays.asList("Scheme", "Item", "Partner", "Amount", "Credited On", "Invoice Number",
656
				"Sale On", "Scheme Start", "Scheme End", "Active On", "Expired On");
24241 amit.gupta 657
		schemeRepository.selectAll().stream().forEach(x -> {
24250 amit.gupta 658
			if (x.getType().equals(SchemeType.OUT)) {
659
				List<SchemeInOut> sioList = schemeInOutRepository
660
						.selectBySchemeIds(new HashSet<>(Arrays.asList(x.getId())));
661
				if (x.getActiveTimestamp() != null) {
662
					LocalDateTime endDateTime = x.getEndDateTime();
663
					if (x.getExpireTimestamp() != null && x.getExpireTimestamp().isBefore(x.getEndDateTime())) {
664
						endDateTime = x.getExpireTimestamp();
24249 amit.gupta 665
					}
24250 amit.gupta 666
					for (SchemeInOut sio : sioList) {
667
						InventoryItem inventoryItem = null;
24266 amit.gupta 668
						inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
24271 amit.gupta 669
						FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndSerialNumber(
670
								inventoryItem.getFofoId(), inventoryItem.getSerialNumber(), null, null, 0, 1).get(0);
24250 amit.gupta 671
						Optional<ScanRecord> record = scanRecordRepository
672
								.selectByInventoryItemId(sio.getInventoryItemId()).stream()
673
								.filter(y -> y.getType().equals(ScanType.SALE)).findFirst();
674
						if (record.isPresent()) {
675
							int fofoId = record.get().getFofoId();
676
							if (record.get().getCreateTimestamp().isAfter(endDateTime)
677
									|| record.get().getCreateTimestamp().isBefore(x.getStartDateTime())) {
678
								if (!userAmountMap.containsKey(fofoId)) {
679
									userAmountMap.put(fofoId, 0f);
680
								}
681
								userAmountMap.put(fofoId, sio.getAmount() + userAmountMap.get(fofoId));
682
								try {
24252 amit.gupta 683
									rows.add(Arrays.asList(x.getDescription(),
24250 amit.gupta 684
											itemRepository.selectById(inventoryItem.getItemId()).getItemDescription(),
24252 amit.gupta 685
											userNameMap.get(fofoId), sio.getAmount(),
24253 amit.gupta 686
											FormattingUtils.formatDate(sio.getCreateTimestamp()),
687
											fofoOrder.getInvoiceNumber(),
688
											FormattingUtils.formatDate(record.get().getCreateTimestamp()),
689
											FormattingUtils.formatDate(x.getStartDateTime()),
690
											FormattingUtils.formatDate(x.getEndDateTime()),
691
											FormattingUtils.formatDate(x.getActiveTimestamp()),
692
											FormattingUtils.formatDate(x.getExpireTimestamp())));
24250 amit.gupta 693
								} catch (Exception e) {
694
									e.printStackTrace();
695
								}
24242 amit.gupta 696
							}
24241 amit.gupta 697
						}
698
					}
699
				}
700
			}
701
		});
24246 amit.gupta 702
		userAmountMap.entrySet().stream()
703
				.forEach(x -> LOGGER.info("{} to be deducted from {}({}) for wrongly disbursed due to technical error.",
704
						x.getValue(), userNameMap.get(x.getKey())));
24241 amit.gupta 705
 
24252 amit.gupta 706
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
24271 amit.gupta 707
		Utils.sendMailWithAttachment(googleMailSender,
708
				new String[] { "amit.gupta@shop2020.in", "adeel.yazdani@smartdukaan.com" }, null,
709
				"Partner Excess Amount", "PFA", "ListofSchemes.csv", new ByteArrayResource(baos.toByteArray()));
24252 amit.gupta 710
 
24241 amit.gupta 711
	}
24271 amit.gupta 712
 
25584 amit.gupta 713
	public void processScheme(int offset, boolean dryRun) throws Exception {
24462 amit.gupta 714
		LocalDateTime startDate = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT).minusDays(offset);
24259 amit.gupta 715
		LocalDateTime endDate = startDate.plusDays(30);
25584 amit.gupta 716
		processScheme(startDate, endDate, dryRun);
24256 amit.gupta 717
	}
28205 tejbeer 718
 
27892 amit.gupta 719
	public void processSchemeOut(List<String> invoiceNumbers) throws Exception {
28205 tejbeer 720
		for (String invoiceNumber : invoiceNumbers) {
721
			System.out.println("Invoice Number - " + invoiceNumber);
27892 amit.gupta 722
			FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
723
			schemeService.processSchemeOut(fofoOrder.getId(), fofoOrder.getFofoId());
724
		}
725
	}
28205 tejbeer 726
 
27987 amit.gupta 727
	public void processSchemeIn(List<String> invoiceNumbers) throws Exception {
28205 tejbeer 728
		for (String invoiceNumber : invoiceNumbers) {
729
			System.out.println("Invoice Number - " + invoiceNumber);
27987 amit.gupta 730
			Purchase purchase = purchaseRepository.selectByPurchaseReference(invoiceNumber);
731
			schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
732
		}
733
	}
24533 govind 734
 
25584 amit.gupta 735
	public void processScheme(int offset, int durationDays, boolean dryRun) throws Exception {
24462 amit.gupta 736
		LocalDateTime startDate = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT).minusDays(offset);
24461 amit.gupta 737
		LocalDateTime endDate = startDate.plusDays(durationDays);
25584 amit.gupta 738
		processScheme(startDate, endDate, dryRun);
24461 amit.gupta 739
	}
24271 amit.gupta 740
 
25584 amit.gupta 741
	public void processScheme(boolean dryRun) throws Exception {
24256 amit.gupta 742
		LocalDateTime fromDate = LocalDateTime.now().minusDays(30);
25584 amit.gupta 743
		processScheme(fromDate, LocalDateTime.now(), dryRun);
24256 amit.gupta 744
	}
24271 amit.gupta 745
 
25584 amit.gupta 746
	public void processScheme(LocalDateTime startDate, LocalDateTime endDate, boolean dryRun) throws Exception {
23724 amit.gupta 747
		LOGGER.info("Started execution at {}", LocalDateTime.now());
25312 amit.gupta 748
		System.out.println(
749
				"InventoryId\tSerialNumber\tItem Id\tScheme Id\tScheme Name\tScheme Type\tAmount Type\tDP\tTaxable\tScheme Amount\tAmount Paid");
24561 amit.gupta 750
		try {
24587 amit.gupta 751
			List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
752
			for (Purchase purchase : purchases) {
753
				schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
754
			}
24271 amit.gupta 755
 
24587 amit.gupta 756
			List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
757
			for (FofoOrder fofoOrder : fofoOrders) {
758
				schemeService.processSchemeOut(fofoOrder.getId(), fofoOrder.getFofoId());
759
			}
760
		} catch (Exception e) {
24561 amit.gupta 761
			e.printStackTrace();
24565 amit.gupta 762
			throw e;
24561 amit.gupta 763
		}
28205 tejbeer 764
		List<UserWalletHistory> uwhs = userWalletHistoryRepository.selectAllByDateType(LocalDate.now().atStartOfDay(),
765
				endDate, Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
25043 amit.gupta 766
		System.out.println("Amount\tReference\tReferenceType\tTimestamp\tDescription");
25312 amit.gupta 767
		for (UserWalletHistory uwh : uwhs) {
768
			System.out.println(String.format("%d\t%d\t%s\t%s\t%s", uwh.getAmount(), uwh.getReference(),
769
					uwh.getReferenceType(), uwh.getTimestamp().toString(), uwh.getDescription()));
25043 amit.gupta 770
		}
23724 amit.gupta 771
		LOGGER.info("Schemes process successfully.");
25598 amit.gupta 772
		if (dryRun) {
25584 amit.gupta 773
			throw new Exception();
774
		}
23724 amit.gupta 775
	}
23929 amit.gupta 776
 
23739 amit.gupta 777
	public void processRechargeCashback() throws Throwable {
23761 amit.gupta 778
		LocalDateTime cashbackTime = LocalDateTime.now();
23929 amit.gupta 779
		int referenceId = (int) Timestamp.valueOf(cashbackTime).getTime() / 1000;
780
		List<RechargeTransaction> pendingTransactions = rechargeTransactionRepository
781
				.getPendingCashBackRehargeTransactions();
782
		Map<Object, Double> totalRetailerCashbacks = pendingTransactions.stream().collect(
783
				Collectors.groupingBy(x -> x.getRetailerId(), Collectors.summingDouble(x -> x.getCommission())));
784
		for (Map.Entry<Object, Double> totalRetailerCashback : totalRetailerCashbacks.entrySet()) {
785
			int retailerId = (Integer) totalRetailerCashback.getKey();
23739 amit.gupta 786
			float amount = totalRetailerCashback.getValue().floatValue();
23929 amit.gupta 787
			if (Math.round(amount) > 0) {
788
				walletService.addAmountToWallet(retailerId, referenceId, WalletReferenceType.CASHBACK,
26565 amit.gupta 789
						"Recharge Cashback", Math.round(amount), LocalDateTime.now());
23762 amit.gupta 790
			}
23739 amit.gupta 791
		}
23929 amit.gupta 792
		for (RechargeTransaction rt : pendingTransactions) {
23761 amit.gupta 793
			rt.setCashbackTimestamp(cashbackTime);
794
			rt.setCashbackReference(referenceId);
795
			rechargeTransactionRepository.persist(rt);
796
		}
23739 amit.gupta 797
		LOGGER.info("Cashbacks for Recharge processed Successfully");
798
	}
29160 amit.gupta 799
 
800
	public void rollOutUpgardedMarginsNextMonth() throws Exception {
29107 amit.gupta 801
		LocalDate startOfPreviousMonth = LocalDate.now().with(ChronoField.DAY_OF_MONTH, 1).minusMonths(1);
29160 amit.gupta 802
 
28971 amit.gupta 803
		List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
29160 amit.gupta 804
		for (FofoStore store : stores) {
805
			int fofoId = store.getId();
806
 
807
			PartnerType startOfMonthPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, startOfPreviousMonth);
808
			PartnerType todayPartnerType = partnerTypeChangeService.getTypeOnMonth(fofoId,
809
					YearMonth.from(startOfPreviousMonth.atStartOfDay()));
810
			if (!startOfMonthPartnerType.nextPartnerTypes().contains(todayPartnerType)) {
811
				continue;
812
			}
813
			if (!startOfMonthPartnerType.equals(todayPartnerType)) {
814
				LOGGER.info("Partner Type has been changed for code {} from {} to {}", store.getCode(),
815
						startOfMonthPartnerType, todayPartnerType);
816
				List<FofoOrder> fofoOrders = fofoOrderRepository.selectByFofoId(fofoId,
817
						startOfPreviousMonth.atStartOfDay(), startOfPreviousMonth.plusMonths(1).atStartOfDay(), 0, 0);
818
				for (FofoOrder fofoOrder : fofoOrders) {
819
					schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
28974 amit.gupta 820
				}
29160 amit.gupta 821
 
822
			}
28971 amit.gupta 823
		}
824
	}
29252 amit.gupta 825
 
29160 amit.gupta 826
	public void rollOutUpgardedMargins() throws Exception {
827
		LocalDate today = LocalDate.now();
828
		LocalDate yesterday = today.minusDays(1);
829
		int upgradedCount = 0;
830
		List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
831
		StringBuilder sb = new StringBuilder();
832
		for (FofoStore store : stores) {
833
			int fofoId = store.getId();
29252 amit.gupta 834
 
29160 amit.gupta 835
			PartnerType yesterdayPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, yesterday);
836
			PartnerType todayPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, today);
837
			if (!yesterdayPartnerType.nextPartnerTypes().contains(todayPartnerType)) {
838
				continue;
839
			}
840
			if (!yesterdayPartnerType.equals(todayPartnerType)) {
841
				upgradedCount++;
29252 amit.gupta 842
				sb.append(String.format("Partner Type has been changed for code %s from %s to %s", store.getCode(),
843
						yesterdayPartnerType.toString(), todayPartnerType.toString()));
29160 amit.gupta 844
				sb.append("<br>");
845
				LOGGER.info("Partner Type has been changed for code {} from {} to {}", store.getCode(),
846
						yesterdayPartnerType, todayPartnerType);
847
				List<FofoOrder> fofoOrders = fofoOrderRepository.selectByFofoId(fofoId,
848
						yesterday.withDayOfMonth(1).atStartOfDay(), yesterday.atStartOfDay(), 0, 0);
849
				for (FofoOrder fofoOrder : fofoOrders) {
850
					schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
851
				}
29252 amit.gupta 852
 
29160 amit.gupta 853
			}
854
		}
29252 amit.gupta 855
		if (upgradedCount > 0) {
856
			sendMailHtmlFormat(
857
					new String[] { "amit.gupta@smartdukaan.com", "tarun.verma@smartdukaan.com",
858
							"neeraj.gupta@smartdukaan.com" },
859
					sb.toString(), null, "Few Partners Category have been Upgraded");
29160 amit.gupta 860
		} else {
29252 amit.gupta 861
			sendMailHtmlFormat(
862
					new String[] { "amit.gupta@smartdukaan.com", "tarun.verma@smartdukaan.com",
863
							"neeraj.gupta@smartdukaan.com" },
864
					sb.toString(), null, "No partners Category have been upgraded today");
29160 amit.gupta 865
		}
866
	}
23724 amit.gupta 867
 
25598 amit.gupta 868
	private class SaleRoles {
869
 
870
		private List<String> l1;
871
		private List<String> l2;
872
 
873
		public SaleRoles() {
874
			l1 = new ArrayList<>();
875
			l2 = new ArrayList<>();
876
		}
877
 
878
		public List<String> getL1() {
879
			return l1;
880
		}
881
 
882
		public List<String> getL2() {
883
			return l2;
884
		}
885
 
886
	}
887
 
26945 amit.gupta 888
	private class FofoReportingModel {
889
		private String code;
890
		private int fofoId;
891
		private String businessName;
892
		private String territoryManager;
893
		private String regionalManager;
894
 
895
		@Override
896
		public String toString() {
897
			return "FofoReportingModel [code=" + code + ", fofoId=" + fofoId + ", businessName=" + businessName
898
					+ ", territoryManager=" + territoryManager + ", regionalManager=" + regionalManager + "]";
899
		}
900
 
901
		public String getCode() {
902
			return code;
903
		}
904
 
905
		public void setCode(String code) {
906
			this.code = code;
907
		}
908
 
909
		public String getBusinessName() {
910
			return businessName;
911
		}
912
 
913
		public void setBusinessName(String businessName) {
914
			this.businessName = businessName;
915
		}
916
 
917
		public String getTerritoryManager() {
918
			return territoryManager;
919
		}
920
 
921
		public void setTerritoryManager(String territoryManager) {
922
			this.territoryManager = territoryManager;
923
		}
924
 
925
		public String getRegionalManager() {
926
			return regionalManager;
927
		}
928
 
929
		public void setRegionalManager(String regionalManager) {
930
			this.regionalManager = regionalManager;
931
		}
932
 
933
		private ScheduledTasks getOuterType() {
934
			return ScheduledTasks.this;
935
		}
936
 
937
		@Override
938
		public int hashCode() {
939
			final int prime = 31;
940
			int result = 1;
941
			result = prime * result + getOuterType().hashCode();
942
			result = prime * result + ((businessName == null) ? 0 : businessName.hashCode());
943
			result = prime * result + ((code == null) ? 0 : code.hashCode());
944
			result = prime * result + fofoId;
945
			result = prime * result + ((regionalManager == null) ? 0 : regionalManager.hashCode());
946
			result = prime * result + ((territoryManager == null) ? 0 : territoryManager.hashCode());
947
			return result;
948
		}
949
 
950
		@Override
951
		public boolean equals(Object obj) {
952
			if (this == obj)
953
				return true;
954
			if (obj == null)
955
				return false;
956
			if (getClass() != obj.getClass())
957
				return false;
958
			FofoReportingModel other = (FofoReportingModel) obj;
959
			if (!getOuterType().equals(other.getOuterType()))
960
				return false;
961
			if (businessName == null) {
962
				if (other.businessName != null)
963
					return false;
964
			} else if (!businessName.equals(other.businessName))
965
				return false;
966
			if (code == null) {
967
				if (other.code != null)
968
					return false;
969
			} else if (!code.equals(other.code))
970
				return false;
971
			if (fofoId != other.fofoId)
972
				return false;
973
			if (regionalManager == null) {
974
				if (other.regionalManager != null)
975
					return false;
976
			} else if (!regionalManager.equals(other.regionalManager))
977
				return false;
978
			if (territoryManager == null) {
979
				if (other.territoryManager != null)
980
					return false;
981
			} else if (!territoryManager.equals(other.territoryManager))
982
				return false;
983
			return true;
984
		}
985
 
986
		public int getFofoId() {
987
			return fofoId;
988
		}
989
 
990
		public void setFofoId(int fofoId) {
991
			this.fofoId = fofoId;
992
		}
993
 
994
	}
995
 
24271 amit.gupta 996
	public void sendPartnerInvestmentDetails(List<String> sendTo) throws Exception {
24277 amit.gupta 997
		LocalDate yesterDay = LocalDate.now().minusDays(1);
25267 amit.gupta 998
		List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
23929 amit.gupta 999
		Map<Integer, CustomRetailer> customRetailerMap = retailerService
1000
				.getFofoRetailers(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
25351 tejbeer 1001
 
26957 amit.gupta 1002
		List<String> headers = Arrays.asList("Code", "Outlet name", "State Manager", "Teritory/Team Lead",
26945 amit.gupta 1003
				"Wallet Amount", "In Stock Amount", "Activated Stock", "Return In Transit Stock", "Unbilled Amount",
1004
				"Grn Pending Amount", "Min Investment", "Investment Amount", "Investment Short", "Unbilled Qty",
1005
				"Short Days");
25837 amit.gupta 1006
		List<List<?>> rows = new ArrayList<>();
25895 amit.gupta 1007
		Map<Integer, List<?>> partnerRowsMap = new HashMap<>();
25598 amit.gupta 1008
 
26945 amit.gupta 1009
		Map<Integer, FofoReportingModel> partnerIdSalesHeaderMap = this.getPartnerIdSalesHeaders();
25598 amit.gupta 1010
 
26945 amit.gupta 1011
		Map<Integer, Integer> shortDaysMap = partnerDailyInvestmentRepository
1012
				.selectAll(LocalDate.now().withDayOfMonth(1), LocalDate.now()).stream().collect(Collectors.groupingBy(
1013
						x -> x.getFofoId(), Collectors.summingInt(x -> x.getShortPercentage() > 10 ? 1 : 0)));
1014
 
24002 amit.gupta 1015
		for (FofoStore fofoStore : fofoStores) {
27750 amit.gupta 1016
			LOGGER.info("Fofo Store {},  {}", fofoStore.getId(), fofoStore.getCode());
26376 amit.gupta 1017
			int fofoId = fofoStore.getId();
26945 amit.gupta 1018
			PartnerDailyInvestment partnerDailyInvestment = partnerInvestmentService.getInvestment(fofoId, 1);
25598 amit.gupta 1019
			partnerDailyInvestment.setDate(yesterDay);
26945 amit.gupta 1020
 
25598 amit.gupta 1021
			try {
1022
				partnerDailyInvestmentRepository.persist(partnerDailyInvestment);
26945 amit.gupta 1023
				shortDaysMap.put(fofoId,
1024
						shortDaysMap.get(fofoId) + (partnerDailyInvestment.getShortPercentage() > 10 ? 1 : 0));
25598 amit.gupta 1025
			} catch (Exception e) {
1026
				// ignore the exceptions during persist
1027
			}
1028
 
24002 amit.gupta 1029
			CustomRetailer retailer = customRetailerMap.get(fofoStore.getId());
25837 amit.gupta 1030
			if (retailer == null || partnerIdSalesHeaderMap.get(fofoStore.getId()) == null) {
24002 amit.gupta 1031
				LOGGER.info("Could not find retailer with retailer Id {}", fofoStore.getId());
1032
				continue;
1033
			}
26945 amit.gupta 1034
			FofoReportingModel reportingModel = partnerIdSalesHeaderMap.get(fofoStore.getId());
1035
			List<Serializable> row = new ArrayList<>();
1036
			row.addAll(Arrays.asList(reportingModel.getCode(), reportingModel.getBusinessName(),
1037
					reportingModel.getRegionalManager(), reportingModel.getTerritoryManager()));
25927 amit.gupta 1038
			row.addAll(
1039
					Arrays.asList(partnerDailyInvestment.getWalletAmount(), partnerDailyInvestment.getInStockAmount(),
26945 amit.gupta 1040
							partnerDailyInvestment.getActivatedStockAmount() == 0 ? "-"
1041
									: "(" + partnerDailyInvestment.getActivatedStockAmount() + ")",
25927 amit.gupta 1042
							0, partnerDailyInvestment.getUnbilledAmount(), partnerDailyInvestment.getGrnPendingAmount(),
1043
							partnerDailyInvestment.getMinInvestment(), partnerDailyInvestment.getTotalInvestment(),
26945 amit.gupta 1044
							partnerDailyInvestment.getShortInvestment(), partnerDailyInvestment.getUnbilledQty(),
1045
							shortDaysMap.get(fofoId)));
25837 amit.gupta 1046
			partnerRowsMap.put(fofoStore.getId(), row);
24002 amit.gupta 1047
			rows.add(row);
1048
 
23929 amit.gupta 1049
		}
25312 amit.gupta 1050
 
24271 amit.gupta 1051
		String fileName = "InvestmentSummary-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
25598 amit.gupta 1052
 
25927 amit.gupta 1053
		if (sendTo == null) {
25895 amit.gupta 1054
			for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMapping().entrySet()) {
1055
				List<List<?>> filteredRows = storeGuyEntry.getValue().stream().map(x -> partnerRowsMap.get(x))
1056
						.filter(x -> x != null).collect(Collectors.toList());
1057
				ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, filteredRows);
1058
				String[] sendToArray = new String[] { storeGuyEntry.getKey() };
1059
				Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA",
1060
						fileName, new ByteArrayResource(baos.toByteArray()));
1061
			}
27210 tejbeer 1062
			sendTo = Arrays.asList("tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com",
28467 tejbeer 1063
					"neeraj.gupta@smartdukaan.com", "amit.gupta@shop2020.in", "manish.gupta@smartdukaan.com",
1064
					"niranjan.kala@smartdukaan.com");
25341 amit.gupta 1065
		}
25312 amit.gupta 1066
 
25604 amit.gupta 1067
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
1068
		String[] sendToArray = sendTo.toArray(new String[sendTo.size()]);
25609 amit.gupta 1069
		Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA",
1070
				fileName, new ByteArrayResource(baos.toByteArray()));
24271 amit.gupta 1071
 
23929 amit.gupta 1072
	}
24177 govind 1073
 
26945 amit.gupta 1074
	private Map<Integer, FofoReportingModel> getPartnerIdSalesHeaders() {
25598 amit.gupta 1075
		Map<String, SaleRoles> partnerEmailSalesMap = new HashMap<>();
1076
 
1077
		List<Position> positions = positionRepository
1078
				.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_SALES);
1079
		Map<Integer, AuthUser> authUsersMap = authRepository.selectAllActiveUser().stream()
1080
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
1081
		Map<Integer, List<CustomRetailer>> positionIdRetailerMap = csService.getPositionCustomRetailerMap(positions);
1082
		for (Position position : positions) {
1083
			List<CustomRetailer> crList = positionIdRetailerMap.get(position.getId());
25609 amit.gupta 1084
			if (crList == null)
1085
				continue;
25598 amit.gupta 1086
			for (CustomRetailer cr : crList) {
1087
				if (!partnerEmailSalesMap.containsKey(cr.getEmail())) {
1088
					partnerEmailSalesMap.put(cr.getEmail(), new SaleRoles());
1089
				}
1090
				SaleRoles saleRoles = partnerEmailSalesMap.get(cr.getEmail());
1091
				AuthUser authUser = authUsersMap.get(position.getAuthUserId());
26945 amit.gupta 1092
				if (authUser == null) {
26059 amit.gupta 1093
					continue;
1094
				}
25598 amit.gupta 1095
				String name = authUser.getFirstName() + " " + authUser.getLastName();
1096
				if (position.getEscalationType().equals(EscalationType.L1)) {
1097
					saleRoles.getL1().add(name);
1098
				} else if (position.getEscalationType().equals(EscalationType.L2)) {
1099
					saleRoles.getL2().add(name);
1100
				}
1101
			}
1102
		}
25837 amit.gupta 1103
 
1104
		Set<CustomRetailer> allCrList = new HashSet<>();
1105
		for (List<CustomRetailer> cr : positionIdRetailerMap.values()) {
1106
			allCrList.addAll(cr);
1107
		}
1108
 
1109
		Map<Integer, FofoStore> fofoStoresMap = fofoStoreRepository.selectActiveStores().stream()
1110
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
1111
 
26945 amit.gupta 1112
		Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = new HashMap<>();
25837 amit.gupta 1113
 
1114
		for (CustomRetailer cr : allCrList) {
1115
			FofoStore fofoStore = fofoStoresMap.get(cr.getPartnerId());
25927 amit.gupta 1116
			if (fofoStore == null) {
25870 amit.gupta 1117
				LOGGER.info("Could not find Store {} in active Store", cr.getBusinessName());
1118
				continue;
1119
			}
26945 amit.gupta 1120
			String code = fofoStore.getCode();
1121
			// String storeName = "SmartDukaan-" +
1122
			// fofoStore.getCode().replaceAll("[a-zA-Z]", "");
25837 amit.gupta 1123
			String businessName = cr.getBusinessName();
1124
			try {
1125
				String stateManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL2(), ", ");
1126
				String territoryManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL1(), ", ");
26945 amit.gupta 1127
				FofoReportingModel reportingModel = new FofoReportingModel();
1128
				reportingModel.setBusinessName(businessName);
1129
				reportingModel.setCode(code);
1130
				reportingModel.setFofoId(fofoStore.getId());
1131
				reportingModel.setRegionalManager(stateManager);
1132
				reportingModel.setTerritoryManager(territoryManager);
1133
				partnerIdSalesHeadersMap.put(fofoStore.getId(), reportingModel);
25837 amit.gupta 1134
			} catch (Exception e) {
1135
				LOGGER.warn("Could not find partner with email - {}", cr.getEmail());
1136
			}
1137
		}
1138
		return partnerIdSalesHeadersMap;
1139
 
25598 amit.gupta 1140
	}
1141
 
24271 amit.gupta 1142
	public void sendPartnerInvestmentDetails() throws Exception {
25565 amit.gupta 1143
		this.sendPartnerInvestmentDetails(null);
24271 amit.gupta 1144
	}
1145
 
24697 amit.gupta 1146
	public void sendAgeingReport(String... sendTo) throws Exception {
24692 amit.gupta 1147
 
1148
		InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.WAREHOUSENEW,
1149
				"itemstockageing.xml");
24708 amit.gupta 1150
		InputStreamSource isr1 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO,
24754 amit.gupta 1151
				"ItemwiseOverallPendingIndent.xml");
24683 amit.gupta 1152
		Attachment attachment = new Attachment(
25445 amit.gupta 1153
				"ageing-report-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr);
24707 amit.gupta 1154
		Attachment attachment1 = new Attachment(
25445 amit.gupta 1155
				"pending-indent-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr1);
25418 amit.gupta 1156
 
25609 amit.gupta 1157
		Utils.sendMailWithAttachments(googleMailSender, STOCK_AGEING_MAIL_LIST, null, "Stock Ageing Report", "PFA",
1158
				attachment);
1159
		Utils.sendMailWithAttachments(googleMailSender, ITEMWISE_PENDING_INDENT_MAIL_LIST, null,
1160
				"Itemwise Pending indent", "PFA", attachment1);
1161
 
25598 amit.gupta 1162
		// Reports to be sent to mapped partners
25597 amit.gupta 1163
		Map<String, Set<String>> storeGuysMap = csService.getAuthUserPartnerEmailMapping();
25503 amit.gupta 1164
 
1165
		for (Map.Entry<String, Set<String>> storeGuyEntry : storeGuysMap.entrySet()) {
25418 amit.gupta 1166
			Map<String, String> params = new HashMap<>();
25503 amit.gupta 1167
			if (storeGuyEntry.getValue().size() == 0)
1168
				continue;
25418 amit.gupta 1169
			params.put("MANUAL_email", String.join(",", storeGuyEntry.getValue()));
1170
			InputStreamSource isr3 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO,
1171
					"focostockreport.xml", params);
1172
			Attachment attache = new Attachment(
25609 amit.gupta 1173
					"Franchise-stock-report" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr3);
25584 amit.gupta 1174
			System.out.println(storeGuyEntry.getValue());
25609 amit.gupta 1175
			Utils.sendMailWithAttachments(googleMailSender, new String[] { storeGuyEntry.getKey() }, null,
1176
					"Franchise Stock Report", "PFA", attache);
25418 amit.gupta 1177
		}
25503 amit.gupta 1178
 
24681 amit.gupta 1179
	}
24533 govind 1180
 
28632 amit.gupta 1181
	public void sendIndentTertiary() throws Exception {
28709 amit.gupta 1182
 
28632 amit.gupta 1183
		InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO,
1184
				"indentandtertiary.xml");
1185
		Attachment attachment = new Attachment(
28839 tejbeer 1186
				"indentandtertiary-report-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr);
28709 amit.gupta 1187
		Utils.sendMailWithAttachments(googleMailSender, INDENT_TERTIARY_MAIL_LIST, null, "Indent Tertiary Report",
1188
				"PFA", attachment);
1189
 
28632 amit.gupta 1190
	}
28790 amit.gupta 1191
 
28769 amit.gupta 1192
	public void sendAttendanceMorningAlert() throws Exception {
28793 amit.gupta 1193
		LocalDateTime moriningTime = LocalDate.now().atTime(10, 31);
28775 amit.gupta 1194
		List<AuthUser> authUsers = authRepository.selectAllActiveUser();
28790 amit.gupta 1195
		Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive())
1196
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
1197
 
28769 amit.gupta 1198
		List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
28790 amit.gupta 1199
		Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
1200
 
1201
		List<EmployeeAttendance> employeeAttendances = employeeAttendanceRepository
1202
				.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now());
1203
 
1204
		Map<Integer, Optional<EmployeeAttendance>> employeeMorningAttendance = employeeAttendances.stream()
1205
				.collect(Collectors.groupingBy(EmployeeAttendance::getUserId,
1206
						Collectors.minBy(Comparator.comparing(EmployeeAttendance::getCreateTimestamp))));
1207
		for (AuthUser authUser : authUsers) {
28769 amit.gupta 1208
			User user = userMap.get(authUser.getEmailId());
1209
			Optional<EmployeeAttendance> employeeAttendanceOptional = employeeMorningAttendance.get(user.getId());
28817 amit.gupta 1210
			LOGGER.info("AuthUser - {}, employeeAttendanceOptional {}", authUser.getName(), employeeAttendanceOptional);
28839 tejbeer 1211
			if (employeeAttendanceOptional != null) {
28818 amit.gupta 1212
				LOGGER.info("employeeAttendanceOptional.orElse {}", employeeAttendanceOptional.orElse(null));
28839 tejbeer 1213
				if (employeeAttendanceOptional.orElse(null) != null) {
1214
					LOGGER.info("employeeAttendanceOptional.get().getCreateTimestamp() {}",
1215
							employeeAttendanceOptional.get().getCreateTimestamp());
28818 amit.gupta 1216
				}
1217
			}
28790 amit.gupta 1218
			if (employeeAttendanceOptional == null || employeeAttendanceOptional.orElse(null) == null
28769 amit.gupta 1219
					|| employeeAttendanceOptional.get().getCreateTimestamp().isAfter(moriningTime)) {
28819 amit.gupta 1220
				LOGGER.info("Will Send Email to {}", authUser.getFullName());
28790 amit.gupta 1221
				String body = String.format(
28806 amit.gupta 1222
						"Dear %s,\n Pls note that you haven't punched your attendance by 10:30am%s. You have been marked absent for half the day.\n\nRegards\nHR Team",
28839 tejbeer 1223
						authUser.getFullName(),
1224
						(employeeAttendanceOptional == null || employeeAttendanceOptional.orElse(null) == null) ? ""
1225
								: "(Punched at "
1226
										+ FormattingUtils.format(employeeAttendanceOptional.get().getCreateTimestamp())
1227
										+ ")");
1228
 
1229
				Utils.sendMailWithAttachments(googleMailSender, new String[] { authUser.getEmailId() },
1230
						new String[] { "jyoti.rawat@smartdukaan.com" }, "Attendance Alert", body);
1231
 
28769 amit.gupta 1232
			}
1233
		}
28790 amit.gupta 1234
 
28769 amit.gupta 1235
	}
28790 amit.gupta 1236
 
28775 amit.gupta 1237
	public void sendAttendanceEveningAlert() throws Exception {
1238
		List<AuthUser> authUsers = authRepository.selectAllActiveUser();
28790 amit.gupta 1239
		Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive())
1240
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
1241
 
28775 amit.gupta 1242
		List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
28790 amit.gupta 1243
		Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28775 amit.gupta 1244
 
28790 amit.gupta 1245
		Map<Integer, List<EmployeeAttendance>> employeeAttendancesMap = employeeAttendanceRepository
1246
				.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now()).stream()
1247
				.collect(Collectors.groupingBy(x -> x.getUserId()));
1248
 
1249
		for (AuthUser authUser : authUsers) {
28775 amit.gupta 1250
			User user = userMap.get(authUser.getEmailId());
28784 amit.gupta 1251
			String body = null;
1252
			List<EmployeeAttendance> employeeAttendances = employeeAttendancesMap.get(user.getId());
28790 amit.gupta 1253
			if (employeeAttendances == null) {
1254
				body = String.format(
28806 amit.gupta 1255
						"Dear %s,\n No attendance has been registered by you today. You have been marked absent for the day.\n\nRegards\nHR Team",
28790 amit.gupta 1256
						authUser.getFullName());
28784 amit.gupta 1257
			} else {
28790 amit.gupta 1258
				List<LocalDateTime> punchTimes = employeeAttendances.stream()
1259
						.sorted(Comparator.comparing(EmployeeAttendance::getCreateTimestamp))
1260
						.map(x -> x.getCreateTimestamp()).collect(Collectors.toList());
1261
				if (punchTimes.size() == 1) {
1262
					// body = String.format("Dear %s,\n Pls note that you haven't punched out yet.
1263
					// You have been marked absent for half the day. You may contact your manager
1264
					// and get it regularise.\n\nRegards\nHR Team", authUser.getFullName());
28784 amit.gupta 1265
				} else {
1266
					LocalDateTime firstPunch = punchTimes.get(0);
28790 amit.gupta 1267
					LocalDateTime lastPunch = punchTimes.get(punchTimes.size() - 1);
28805 amit.gupta 1268
					Duration duration = Duration.between(firstPunch, lastPunch);
28784 amit.gupta 1269
					boolean hoursCompleted = lastPunch.isAfter(firstPunch.plusHours(8).plusMinutes(30));
28790 amit.gupta 1270
					if (!hoursCompleted) {
1271
						body = String.format(
28806 amit.gupta 1272
								"Dear %s,\n Pls note that you haven't completed 8.30 Hrs (%d.%d Hrs). You have been marked absent for half the day.\n\nRegards\nHR Team",
28839 tejbeer 1273
								authUser.getFullName(), duration.toHours(),
1274
								duration.toMinutes() - duration.toHours() * 60);
28784 amit.gupta 1275
					}
1276
				}
1277
 
1278
			}
28790 amit.gupta 1279
			if (body != null) {
1280
				Utils.sendMailWithAttachments(googleMailSender, new String[] { authUser.getEmailId() },
1281
						new String[] { "jyoti.rawat@smartdukaan.com" }, "Attendance Alert", body);
28775 amit.gupta 1282
			}
1283
		}
28790 amit.gupta 1284
 
1285
		this.sendMailToHR();
1286
 
28775 amit.gupta 1287
	}
28790 amit.gupta 1288
 
1289
	private void sendMailToHR() throws Exception {
1290
		Map<String, String> map = new HashMap<>();
1291
		String reporticoDate = FormattingUtils.formatReporitcoDate(LocalDateTime.now());
1292
		map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
1293
		map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
1294
		InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO,
1295
				"employeeattendance.xml");
1296
		Attachment attachment = new Attachment("attendance-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv",
1297
				isr);
1298
		Utils.sendMailWithAttachments(googleMailSender, EMPLOYEE_ATTENDANCE_MAIL_LIST, null,
1299
				"Attendance - " + FormattingUtils.formatDate(LocalDateTime.now()), "PFA Attendance", attachment);
1300
	}
1301
 
28709 amit.gupta 1302
	public void checkPartnerActiveStore() throws Exception {
1303
 
1304
		List<FofoStore> fofoStores = fofoStoreRepository.selectByStatus(true);
1305
 
1306
		LocalDateTime currentDate = LocalDate.now().atStartOfDay();
28712 amit.gupta 1307
		if (!fofoStores.isEmpty()) {
1308
			for (FofoStore fofoStore : fofoStores) {
28709 amit.gupta 1309
 
28712 amit.gupta 1310
				if (currentDate.isBefore(fofoStore.getActiveTimeStamp())) {
28709 amit.gupta 1311
 
28712 amit.gupta 1312
					fofoStore.setActive(true);
1313
					fofoStoreRepository.persist(fofoStore);
1314
					LOGGER.info("inserted into InActiveFofoStore successfully");
28709 amit.gupta 1315
 
28712 amit.gupta 1316
				}
28709 amit.gupta 1317
 
28712 amit.gupta 1318
				else {
1319
					fofoStore.setActive(false);
1320
					fofoStore.setActiveTimeStamp(null);
1321
					fofoStoreRepository.persist(fofoStore);
1322
					LOGGER.info("inserted into InActiveFofoStore successfully");
1323
				}
28709 amit.gupta 1324
 
1325
			}
1326
		}
1327
 
1328
	}
1329
 
24697 amit.gupta 1330
	public void sendAgeingReport() throws Exception {
27210 tejbeer 1331
		sendAgeingReport("kamini.sharma@smartdukaan.com", "amit.babu@smartdukaan.com", "tarun.verma@smartdukaan.com",
28467 tejbeer 1332
				"niranjan.kala@smartdukaan.com", "manish.gupta@smartdukaan.com", "kuldeep.kumar@smartdukaan.com");
24697 amit.gupta 1333
	}
1334
 
24533 govind 1335
	public void moveImeisToPriceDropImeis() throws Exception {
24431 amit.gupta 1336
		List<PriceDrop> priceDrops = priceDropRepository.selectAll();
24533 govind 1337
		for (PriceDrop priceDrop : priceDrops) {
24431 amit.gupta 1338
			priceDropService.priceDropStatus(priceDrop.getId());
1339
		}
1340
	}
23929 amit.gupta 1341
 
24542 amit.gupta 1342
	public void walletmismatch() throws Exception {
1343
		LocalDate curDate = LocalDate.now();
24553 amit.gupta 1344
		List<PartnerDailyInvestment> pdis = partnerDailyInvestmentRepository.selectAll(curDate.minusDays(2));
24552 amit.gupta 1345
		System.out.println(pdis.size());
24542 amit.gupta 1346
		for (PartnerDailyInvestment pdi : pdis) {
24549 amit.gupta 1347
			int fofoId = pdi.getFofoId();
24542 amit.gupta 1348
			for (PartnerDailyInvestment investment : Lists
1349
					.reverse(partnerDailyInvestmentRepository.selectAll(fofoId, null, null))) {
24552 amit.gupta 1350
				float statementAmount = walletService.getOpeningTill(fofoId,
24555 amit.gupta 1351
						investment.getDate().plusDays(1).atTime(LocalTime.of(4, 0)));
24552 amit.gupta 1352
				CustomRetailer retailer = retailerService.getFofoRetailer(fofoId);
24841 govind 1353
				LOGGER.info("{}\t{}\t{}\t{}\t{}", fofoId, retailer.getBusinessName(), retailer.getMobileNumber(),
1354
						investment.getDate().toString(), investment.getWalletAmount(), statementAmount);
24551 amit.gupta 1355
 
24542 amit.gupta 1356
			}
24549 amit.gupta 1357
		}
24542 amit.gupta 1358
 
1359
	}
29160 amit.gupta 1360
 
28990 amit.gupta 1361
	@Autowired
1362
	StateRepository stateRepository;
24542 amit.gupta 1363
 
1364
	public void gst() throws Exception {
28995 amit.gupta 1365
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.of(2021, 8, 16).atStartOfDay(),
28990 amit.gupta 1366
				LocalDateTime.now());
24548 amit.gupta 1367
		for (FofoOrder fofoOrder : fofoOrders) {
1368
			int retailerAddressId = retailerRegisteredAddressRepository
1369
					.selectAddressIdByRetailerId(fofoOrder.getFofoId());
24542 amit.gupta 1370
 
1371
			Address retailerAddress = addressRepository.selectById(retailerAddressId);
1372
			CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
1373
			Integer stateId = null;
1374
			if (customerAddress.getState().equals(retailerAddress.getState())) {
1375
				try {
28990 amit.gupta 1376
					stateId = stateRepository.selectByName(customerAddress.getState()).getId();
24542 amit.gupta 1377
				} catch (Exception e) {
28990 amit.gupta 1378
					LOGGER.error("Cannot found state named {}", customerAddress.getState());
1379
					continue;
24542 amit.gupta 1380
				}
1381
			}
1382
			Map<Integer, GstRate> itemIdStateTaxRateMap = null;
1383
			Map<Integer, Float> itemIdIgstTaxRateMap = null;
24548 amit.gupta 1384
 
1385
			List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
26929 amit.gupta 1386
			List<Integer> itemIds = fofoOrderItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
24542 amit.gupta 1387
			if (stateId != null) {
26929 amit.gupta 1388
				itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(itemIds, stateId);
24542 amit.gupta 1389
			} else {
26929 amit.gupta 1390
				itemIdIgstTaxRateMap = stateGstRateRepository.getIgstTaxRate(itemIds);
24542 amit.gupta 1391
			}
1392
 
24548 amit.gupta 1393
			for (FofoOrderItem foi : fofoOrderItems) {
28990 amit.gupta 1394
				float sgstRate = foi.getSgstRate();
1395
				float cgstRate = foi.getCgstRate();
1396
				float igstRate = foi.getIgstRate();
29160 amit.gupta 1397
				if (stateId == null && igstRate == 0) {
1398
 
1399
					foi.setSgstRate(0);
1400
					foi.setCgstRate(0);
1401
					foi.setIgstRate(itemIdIgstTaxRateMap.get(foi.getItemId()));
1402
 
28993 amit.gupta 1403
					LOGGER.info("Invoice {}, Date {}", fofoOrder.getInvoiceNumber(), fofoOrder.getCreateTimestamp());
29160 amit.gupta 1404
					LOGGER.info("customerAddress.getState() {}, retailerAddress.getState() {}",
1405
							customerAddress.getState(), retailerAddress.getState());
28990 amit.gupta 1406
					LOGGER.info("Rates getIgstRate() {}", itemIdIgstTaxRateMap.get(foi.getItemId()));
29160 amit.gupta 1407
 
1408
				} else if (stateId != null && sgstRate == 0 && cgstRate == 0) {
1409
 
1410
					foi.setIgstRate(0);
1411
					foi.setCgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate());
1412
					foi.setSgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
1413
 
28993 amit.gupta 1414
					LOGGER.info("Invoice {}, Date {}", fofoOrder.getInvoiceNumber(), fofoOrder.getCreateTimestamp());
29160 amit.gupta 1415
					LOGGER.info("customerAddress.getState() {}, retailerAddress.getState() {}",
1416
							customerAddress.getState(), retailerAddress.getState());
1417
					LOGGER.info("Rates getCgstRate() {}, getSgstRate() {}",
1418
							itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate(),
1419
							itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
24542 amit.gupta 1420
				}
1421
			}
1422
		}
24548 amit.gupta 1423
 
24542 amit.gupta 1424
	}
1425
 
24580 amit.gupta 1426
	public void schemewalletmismatch() {
1427
		LocalDate dateToReconcile = LocalDate.of(2018, 4, 1);
24587 amit.gupta 1428
		while (dateToReconcile.isBefore(LocalDate.now())) {
24580 amit.gupta 1429
			reconcileSchemes(dateToReconcile);
24587 amit.gupta 1430
			// reconcileOrders(dateTime);
1431
			// reconcileRecharges(dateTime);
24580 amit.gupta 1432
			dateToReconcile = dateToReconcile.plusDays(1);
1433
		}
1434
	}
1435
 
1436
	private void reconcileSchemes(LocalDate date) {
1437
		LocalDateTime startDate = date.atStartOfDay();
1438
		LocalDateTime endDate = startDate.plusDays(1);
1439
		List<SchemeInOut> siosCreated = schemeInOutRepository.selectAllByCreateDate(startDate, endDate);
1440
		List<SchemeInOut> siosRefunded = schemeInOutRepository.selectAllByRefundDate(startDate, endDate);
24587 amit.gupta 1441
		double totalSchemeDisbursed = siosCreated.stream().mapToDouble(x -> x.getAmount()).sum();
1442
		double totalSchemeRolledback = siosRefunded.stream().mapToDouble(x -> x.getAmount()).sum();
24580 amit.gupta 1443
		double netSchemeDisbursed = totalSchemeDisbursed - totalSchemeRolledback;
24587 amit.gupta 1444
		List<WalletReferenceType> walletReferenceTypes = Arrays.asList(WalletReferenceType.SCHEME_IN,
1445
				WalletReferenceType.SCHEME_OUT);
1446
		List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByDateType(startDate, endDate,
1447
				walletReferenceTypes);
1448
		double schemeAmountWalletTotal = history.stream().mapToDouble(x -> x.getAmount()).sum();
1449
		if (Math.abs(netSchemeDisbursed - schemeAmountWalletTotal) > 10d) {
24580 amit.gupta 1450
			LOGGER.info("Scheme Amount mismatched for Date {}", date);
24587 amit.gupta 1451
 
1452
			Map<Integer, Double> inventoryItemSchemeIO = siosCreated.stream().collect(Collectors
1453
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
1454
 
1455
			Map<Integer, Double> userSchemeMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIO.keySet())
1456
					.stream().collect(Collectors.groupingBy(x -> x.getFofoId(),
1457
							Collectors.summingDouble(x -> inventoryItemSchemeIO.get(x.getId()))));
1458
 
1459
			Map<Integer, Double> inventoryItemSchemeIORefunded = siosRefunded.stream().collect(Collectors
1460
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
1461
 
1462
			Map<Integer, Double> userSchemeRefundedMap = inventoryItemRepository
1463
					.selectByIds(inventoryItemSchemeIORefunded.keySet()).stream()
1464
					.collect(Collectors.groupingBy(x -> x.getFofoId(),
1465
							Collectors.summingDouble(x -> inventoryItemSchemeIORefunded.get(x.getId()))));
1466
 
1467
			Map<Integer, Double> finalUserSchemeAmountMap = new HashMap<>();
26092 amit.gupta 1468
 
24587 amit.gupta 1469
			for (Map.Entry<Integer, Double> schemeAmount : userSchemeRefundedMap.entrySet()) {
1470
				if (!finalUserSchemeAmountMap.containsKey(schemeAmount.getKey())) {
1471
					finalUserSchemeAmountMap.put(schemeAmount.getKey(), schemeAmount.getValue());
1472
				} else {
1473
					finalUserSchemeAmountMap.put(schemeAmount.getKey(),
1474
							finalUserSchemeAmountMap.get(schemeAmount.getKey()) + schemeAmount.getValue());
1475
				}
1476
			}
24590 amit.gupta 1477
			Map<Integer, Integer> userWalletMap = userWalletRepository
1478
					.selectByRetailerIds(finalUserSchemeAmountMap.keySet()).stream()
1479
					.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1480
 
24587 amit.gupta 1481
			Map<Integer, Double> walletAmountMap = history.stream().collect(Collectors.groupingBy(
1482
					UserWalletHistory::getWalletId, Collectors.summingDouble((UserWalletHistory::getAmount))));
1483
			for (Map.Entry<Integer, Double> userAmount : walletAmountMap.entrySet()) {
1484
				double diff = Math.abs(finalUserSchemeAmountMap.get(userAmount.getKey()) - userAmount.getValue());
1485
				if (diff > 5) {
1486
					LOGGER.info("Partner scheme mismatched for Userid {}", userWalletMap.get(userAmount.getKey()));
1487
				}
1488
			}
24580 amit.gupta 1489
		}
24587 amit.gupta 1490
 
24580 amit.gupta 1491
	}
24590 amit.gupta 1492
 
24592 amit.gupta 1493
	public void dryRunSchemeReco() throws Exception {
24635 amit.gupta 1494
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1495
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1496
 
24592 amit.gupta 1497
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1498
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24635 amit.gupta 1499
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1500
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
1501
		Set<String> serialNumbersConsidered = new HashSet<>();
1502
 
25096 amit.gupta 1503
		LocalDateTime startDate = LocalDate.of(2018, 3, 1).atStartOfDay();
24635 amit.gupta 1504
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
1505
		List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
1506
 
24683 amit.gupta 1507
		Map<Integer, String> storeNameMap = fofoStoreRepository.getStoresMap();
24635 amit.gupta 1508
		purchases.stream().forEach(purchase -> {
1509
			float amountToRollback = 0;
1510
			String description = "Adjustment of Duplicate Scheme for Purchase Invoice "
1511
					+ purchase.getPurchaseReference();
1512
			Map<Integer, String> inventorySerialNumberMap = inventoryItemRepository.selectByPurchaseId(purchase.getId())
1513
					.stream().filter(ii -> ii.getSerialNumber() != null)
1514
					.collect(Collectors.toMap(InventoryItem::getId, InventoryItem::getSerialNumber));
1515
			if (inventorySerialNumberMap.size() > 0) {
1516
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1517
					String serialNumber = inventorySerialNumberEntry.getValue();
1518
					int inventoryItemId = inventorySerialNumberEntry.getKey();
1519
					if (serialNumbersConsidered.contains(serialNumber)) {
1520
						// This will rollback scheme for differenct orders for same serial
1521
						List<SchemeInOut> sios = schemeInOutRepository
1522
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
1523
								.filter(x -> x.getRolledBackTimestamp() == null
1524
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
1525
								.collect(Collectors.toList());
1526
						Collections.reverse(sios);
1527
						for (SchemeInOut sio : sios) {
1528
							sio.setRolledBackTimestamp(LocalDateTime.now());
1529
							amountToRollback += sio.getAmount();
1530
							// sio.setSchemeType(SchemeType.OUT);
1531
							sio.setSerialNumber(serialNumber);
1532
							rolledbackSios.add(sio);
1533
						}
1534
						description = description.concat(" " + serialNumber + " ");
1535
					} else {
1536
						serialNumbersConsidered.add(serialNumber);
1537
						List<Integer> schemesConsidered = new ArrayList<>();
1538
						List<SchemeInOut> sios = schemeInOutRepository
1539
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
1540
								.filter(x -> x.getRolledBackTimestamp() == null
1541
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
1542
								.collect(Collectors.toList());
1543
						Collections.reverse(sios);
1544
						for (SchemeInOut sio : sios) {
1545
							if (!schemesConsidered.contains(sio.getSchemeId())) {
1546
								schemesConsidered.add(sio.getSchemeId());
1547
								continue;
1548
							}
1549
							sio.setRolledBackTimestamp(LocalDateTime.now());
1550
							amountToRollback += sio.getAmount();
1551
							// sio.setSchemeType(SchemeType.OUT);
1552
							sio.setSerialNumber(serialNumber);
24681 amit.gupta 1553
							sio.setStoreCode(storeNameMap.get(purchase.getFofoId()));
1554
							sio.setReference(purchase.getId());
24635 amit.gupta 1555
							rolledbackSios.add(sio);
1556
						}
1557
					}
1558
 
1559
				}
1560
			}
1561
			if (amountToRollback > 0) {
24683 amit.gupta 1562
				// Address address =
1563
				// addressRepository.selectAllByRetailerId(purchase.getFofoId(), 0, 10).get(0);
24635 amit.gupta 1564
				UserWalletHistory uwh = new UserWalletHistory();
1565
				uwh.setAmount(Math.round(amountToRollback));
1566
				uwh.setDescription(description);
1567
				uwh.setTimestamp(LocalDateTime.now());
24681 amit.gupta 1568
				uwh.setReferenceType(WalletReferenceType.SCHEME_IN);
24635 amit.gupta 1569
				uwh.setReference(purchase.getId());
1570
				uwh.setWalletId(userWalletMap.get(purchase.getFofoId()));
1571
				uwh.setFofoId(purchase.getFofoId());
24681 amit.gupta 1572
				uwh.setStoreCode(storeNameMap.get(purchase.getFofoId()));
24635 amit.gupta 1573
				userWalletHistory.add(uwh);
1574
			}
1575
		});
1576
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1577
				Arrays.asList("User Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
1578
						"Timestamp"),
1579
				userWalletHistory.stream()
1580
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
1581
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
1582
						.collect(Collectors.toList()));
1583
 
1584
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
24683 amit.gupta 1585
				Arrays.asList("Scheme ID", "SchemeType", "Reference", "Store Code", "Serial Number", "Amount",
1586
						"Created", "Rolledback"),
24635 amit.gupta 1587
				rolledbackSios.stream()
24681 amit.gupta 1588
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getReference(), x.getStoreCode(),
24635 amit.gupta 1589
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1590
						.collect(Collectors.toList()));
1591
 
25043 amit.gupta 1592
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24636 amit.gupta 1593
				"Partner Excess Amount Scheme In", "PFA",
24635 amit.gupta 1594
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
24636 amit.gupta 1595
						new Attachment("SchemeInRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24635 amit.gupta 1596
 
25096 amit.gupta 1597
		throw new Exception();
24635 amit.gupta 1598
 
1599
	}
1600
 
1601
	public void dryRunOutSchemeReco() throws Exception {
1602
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1603
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24606 amit.gupta 1604
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1605
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24590 amit.gupta 1606
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1607
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
25028 amit.gupta 1608
		LocalDateTime startDate = LocalDate.of(2019, 5, 1).atStartOfDay();
24632 amit.gupta 1609
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
24631 amit.gupta 1610
		List<FofoOrder> allOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
1611
		// Collections.reverse(allOrders);
1612
		// List<FofoOrder> allOrders =
24653 govind 1613
		// List<FofoOrder> allOrders =
24631 amit.gupta 1614
		// Arrays.asList(fofoOrderRepository.selectByInvoiceNumber("UPGZ019/25"));
24625 amit.gupta 1615
		Set<String> serialNumbersConsidered = new HashSet<>();
24590 amit.gupta 1616
		allOrders.stream().forEach(fofoOrder -> {
24592 amit.gupta 1617
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
24598 amit.gupta 1618
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
24592 amit.gupta 1619
			float amountToRollback = 0;
24590 amit.gupta 1620
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1621
			orderItems.forEach(x -> {
24606 amit.gupta 1622
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
24598 amit.gupta 1623
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
24590 amit.gupta 1624
			});
24606 amit.gupta 1625
			if (inventorySerialNumberMap.size() > 0) {
24631 amit.gupta 1626
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1627
					String serialNumber = inventorySerialNumberEntry.getValue();
1628
					int inventoryItemId = inventorySerialNumberEntry.getKey();
1629
					if (serialNumbersConsidered.contains(serialNumber)) {
1630
						// This will rollback scheme for differenct orders for same serial
1631
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1632
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1633
								.filter(x -> x.getRolledBackTimestamp() == null
1634
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1635
								.collect(Collectors.toList());
1636
						Collections.reverse(sios);
1637
						for (SchemeInOut sio : sios) {
1638
							sio.setRolledBackTimestamp(LocalDateTime.now());
1639
							amountToRollback += sio.getAmount();
1640
							// sio.setSchemeType(SchemeType.OUT);
1641
							sio.setSerialNumber(serialNumber);
1642
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
24681 amit.gupta 1643
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1644
							rolledbackSios.add(sio);
24623 amit.gupta 1645
						}
24635 amit.gupta 1646
						description = description.concat(" " + serialNumber + " ");
24631 amit.gupta 1647
					} else {
1648
						serialNumbersConsidered.add(serialNumber);
1649
						List<Integer> schemesConsidered = new ArrayList<>();
1650
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1651
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1652
								.filter(x -> x.getRolledBackTimestamp() == null
1653
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1654
								.collect(Collectors.toList());
1655
						Collections.reverse(sios);
1656
						for (SchemeInOut sio : sios) {
1657
							if (!schemesConsidered.contains(sio.getSchemeId())) {
1658
								schemesConsidered.add(sio.getSchemeId());
1659
								continue;
1660
							}
1661
							sio.setRolledBackTimestamp(LocalDateTime.now());
1662
							amountToRollback += sio.getAmount();
1663
							// sio.setSchemeType(SchemeType.OUT);
24681 amit.gupta 1664
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1665
							sio.setSerialNumber(serialNumber);
1666
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1667
							rolledbackSios.add(sio);
1668
						}
24615 amit.gupta 1669
					}
24631 amit.gupta 1670
 
24604 amit.gupta 1671
				}
24590 amit.gupta 1672
			}
24631 amit.gupta 1673
			if (amountToRollback > 0) {
1674
				UserWalletHistory uwh = new UserWalletHistory();
1675
				uwh.setAmount(Math.round(amountToRollback));
1676
				uwh.setDescription(description);
1677
				uwh.setTimestamp(LocalDateTime.now());
1678
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1679
				uwh.setReference(fofoOrder.getId());
1680
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1681
				uwh.setFofoId(fofoOrder.getFofoId());
1682
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1683
				userWalletHistory.add(uwh);
1684
			}
24590 amit.gupta 1685
		});
24598 amit.gupta 1686
 
24592 amit.gupta 1687
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
24681 amit.gupta 1688
				Arrays.asList("Wallet Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
24615 amit.gupta 1689
						"Timestamp"),
1690
				userWalletHistory.stream()
1691
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
1692
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24592 amit.gupta 1693
						.collect(Collectors.toList()));
1694
 
1695
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1696
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1697
						"Rolledback"),
1698
				rolledbackSios.stream()
1699
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1700
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1701
						.collect(Collectors.toList()));
1702
 
25043 amit.gupta 1703
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24681 amit.gupta 1704
				"Partner Excess Amount Scheme Out", "PFA",
24598 amit.gupta 1705
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1706
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1707
 
25267 amit.gupta 1708
		throw new Exception();
24590 amit.gupta 1709
	}
24615 amit.gupta 1710
 
24611 amit.gupta 1711
	public void dryRunSchemeOutReco1() throws Exception {
24615 amit.gupta 1712
		List<Integer> references = Arrays.asList(6744, 7347, 8320, 8891, 9124, 9217, 9263, 9379);
24611 amit.gupta 1713
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1714
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
1715
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1716
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1717
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1718
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
1719
		references.stream().forEach(reference -> {
1720
			FofoOrder fofoOrder = null;
1721
			try {
1722
				fofoOrder = fofoOrderRepository.selectByOrderId(reference);
24615 amit.gupta 1723
			} catch (Exception e) {
1724
 
24611 amit.gupta 1725
			}
1726
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
1727
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
1728
			float amountToRollback = 0;
1729
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1730
			orderItems.forEach(x -> {
1731
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
1732
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
1733
			});
1734
			if (inventorySerialNumberMap.size() > 0) {
24615 amit.gupta 1735
				List<SchemeInOut> sios = schemeInOutRepository
1736
						.selectByInventoryItemIds(inventorySerialNumberMap.keySet()).stream()
1737
						.filter(x -> schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24611 amit.gupta 1738
						.collect(Collectors.toList());
1739
				LOGGER.info("Found {} duplicate schemeouts for Orderid {}", sios.size(), fofoOrder.getId());
1740
				UserWalletHistory uwh = new UserWalletHistory();
24615 amit.gupta 1741
				Map<Integer, List<SchemeInOut>> inventoryIdSouts = sios.stream()
1742
						.collect(Collectors.groupingBy(SchemeInOut::getInventoryItemId, Collectors.toList()));
24611 amit.gupta 1743
				for (Map.Entry<Integer, List<SchemeInOut>> inventorySioEntry : inventoryIdSouts.entrySet()) {
1744
					List<SchemeInOut> outList = inventorySioEntry.getValue();
24615 amit.gupta 1745
					if (outList.size() > 1) {
1746
 
24611 amit.gupta 1747
					}
1748
				}
1749
				uwh.setAmount(Math.round(amountToRollback));
1750
				uwh.setDescription(description);
1751
				uwh.setTimestamp(LocalDateTime.now());
1752
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1753
				uwh.setReference(fofoOrder.getId());
1754
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1755
				uwh.setFofoId(fofoOrder.getFofoId());
1756
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1757
				userWalletHistory.add(uwh);
1758
			}
1759
		});
24615 amit.gupta 1760
 
24611 amit.gupta 1761
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1762
				Arrays.asList("User Id", "Reference Type", "Reference", "Amount", "Description", "Timestamp"),
1763
				userWalletHistory.stream().map(x -> Arrays.asList(x.getWalletId(), x.getReferenceType(),
1764
						x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24615 amit.gupta 1765
						.collect(Collectors.toList()));
1766
 
24611 amit.gupta 1767
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1768
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1769
						"Rolledback"),
1770
				rolledbackSios.stream()
24615 amit.gupta 1771
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1772
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1773
						.collect(Collectors.toList()));
1774
 
24623 amit.gupta 1775
		Utils.sendMailWithAttachments(googleMailSender,
1776
				new String[] { "amit.gupta@shop2020.in", "neeraj.gupta@smartdukaan.com" }, null,
24611 amit.gupta 1777
				"Partner Excess Amount", "PFA",
1778
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1779
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1780
 
24628 amit.gupta 1781
		throw new Exception();
24615 amit.gupta 1782
 
24611 amit.gupta 1783
	}
24615 amit.gupta 1784
 
26945 amit.gupta 1785
	public void sendDailySalesNotificationToPartner(Integer fofoIdInt) throws Exception {
25927 amit.gupta 1786
 
24653 govind 1787
		LocalDateTime now = LocalDateTime.now();
25837 amit.gupta 1788
		LocalDateTime from = now.with(LocalTime.MIN);
25925 amit.gupta 1789
		String timeString = "Today %s";
25927 amit.gupta 1790
		// Send yesterday's report
27007 amit.gupta 1791
		/*
1792
		 * if (now.getHour() < 13) { timeString = "Yesterday %s"; from =
1793
		 * now.minusDays(1).; now = from.with(LocalTime.MAX);
1794
		 * 
1795
		 * }
1796
		 */
24855 amit.gupta 1797
		List<Integer> fofoIds = null;
25043 amit.gupta 1798
		if (fofoIdInt == null) {
1799
			fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId())
1800
					.collect(Collectors.toList());
24856 amit.gupta 1801
		} else {
24855 amit.gupta 1802
			fofoIds = Arrays.asList(fofoIdInt);
1803
		}
25912 amit.gupta 1804
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
24683 amit.gupta 1805
 
25865 amit.gupta 1806
		Map<Integer, Float> partnerPolicyAmountMap = insurancePolicyRepository.selectAmountSumGroupByRetailerId(now,
1807
				null);
1808
		Map<Integer, Long> partnerPolicyQtyMap = insurancePolicyRepository.selectQtyGroupByRetailerId(now, null);
26945 amit.gupta 1809
 
1810
		Map<Integer, Double> spPartnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0,
1811
				true);
1812
 
1813
		Map<Integer, Double> spPartner3DaysOrderValMap = fofoOrderItemRepository
1814
				.selectSumAmountGroupByRetailer(from.minusDays(3), now, 0, true);
26941 amit.gupta 1815
		Map<Integer, Long> spPartnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, true);
1816
 
26945 amit.gupta 1817
		Map<Integer, Double> partnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0,
1818
				false);
26941 amit.gupta 1819
		Map<Integer, Long> partnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, false);
26945 amit.gupta 1820
 
25865 amit.gupta 1821
		Map<Integer, SaleTargetReportModel> saleTargetReportModelMap = new HashMap<>();
1822
		for (int fofoId : fofoIds) {
1823
			SaleTargetReportModel model = new SaleTargetReportModel();
25927 amit.gupta 1824
			model.setInsuranceSale(
1825
					partnerPolicyAmountMap.containsKey(fofoId) ? partnerPolicyAmountMap.get(fofoId).doubleValue() : 0);
25865 amit.gupta 1826
			model.setInsruanceQty(partnerPolicyQtyMap.containsKey(fofoId) ? partnerPolicyQtyMap.get(fofoId) : 0);
26941 amit.gupta 1827
			model.setSmartphoneSale(spPartnerOrderValMap.containsKey(fofoId) ? spPartnerOrderValMap.get(fofoId) : 0);
1828
			model.setSmartphoneQty(spPartnerOrderQtyMap.containsKey(fofoId) ? spPartnerOrderQtyMap.get(fofoId) : 0);
1829
			model.setTotalSale(partnerOrderValMap.containsKey(fofoId) ? partnerOrderValMap.get(fofoId) : 0);
1830
			model.setTotalQty(partnerOrderQtyMap.containsKey(fofoId) ? partnerOrderQtyMap.get(fofoId) : 0);
26945 amit.gupta 1831
			model.setPast3daysSale(
1832
					spPartner3DaysOrderValMap.containsKey(fofoId) ? spPartner3DaysOrderValMap.get(fofoId) : 0);
25880 amit.gupta 1833
			model.setFofoId(fofoId);
25865 amit.gupta 1834
			saleTargetReportModelMap.put(fofoId, model);
1835
		}
25880 amit.gupta 1836
 
26945 amit.gupta 1837
		Map<Integer, FofoReportingModel> partnerSalesHeadersMap = this.getPartnerIdSalesHeaders();
24653 govind 1838
		for (Integer fofoId : fofoIds) {
25865 amit.gupta 1839
			SaleTargetReportModel model = saleTargetReportModelMap.get(fofoId);
25821 amit.gupta 1840
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
1841
			sendNotificationModel.setCampaignName("Sales update alert");
25884 tejbeer 1842
			sendNotificationModel.setTitle("Sale Update");
25927 amit.gupta 1843
			sendNotificationModel
1844
					.setMessage(String.format("Smartphones Rs.%.0f, Insurance Rs.%.0f, Total Rs.%.0f till %s.",
1845
							model.getSmartphoneSale(), model.getInsuranceSale(), model.getTotalSale(),
1846
							String.format(timeString, now.format(timeFormatter))));
25821 amit.gupta 1847
			sendNotificationModel.setType("url");
27206 tejbeer 1848
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25821 amit.gupta 1849
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
1850
			sendNotificationModel.setMessageType(MessageType.notification);
25872 tejbeer 1851
			int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
1852
			sendNotificationModel.setUserIds(Arrays.asList(userId));
25854 amit.gupta 1853
			notificationService.sendNotification(sendNotificationModel);
24653 govind 1854
		}
26945 amit.gupta 1855
		// String saleReport = this.getDailySalesReportHtml(partnerSalesHeadersMap,
1856
		// saleTargetReportModelMap);
1857
		String statewiseSaleReport = this.getStateWiseSales(saleTargetReportModelMap, partnerSalesHeadersMap);
27116 amit.gupta 1858
		String cc[] = { "tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com", "amit.babu@smartdukaan.com",
26945 amit.gupta 1859
				"niranjan.kala@smartdukaan.com", "up.singh@smartdukaan.com", "sm@smartdukaan.com" };
25837 amit.gupta 1860
 
25912 amit.gupta 1861
		String subject = String.format("Sale till %s", String.format(timeString, now.format(timeFormatter)));
26945 amit.gupta 1862
		// this.sendMailOfHtmlFomat("amit.gupta@smartukaan.com", saleReport, cc,
1863
		// subject);
1864
		this.sendMailOfHtmlFormat("amit.gupta@smartdukaan.com", statewiseSaleReport, cc, "Statewise" + subject);
24653 govind 1865
	}
1866
 
28377 tejbeer 1867
	public void checkRazorPayPaymentStatus() throws Exception {
28368 tejbeer 1868
		List<PendingOrder> pendingOrder = pendingOrderRepository
1869
				.selectAllByStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PENDING);
1870
 
1871
		for (PendingOrder po : pendingOrder) {
1872
			RazorPay razorPay = razorPayRepository.selectByOrdeId(po.getId());
28377 tejbeer 1873
			List<PendingOrderItem> poItems = pendingOrderItemRepository.selectByOrderId(po.getId());
28368 tejbeer 1874
 
28369 tejbeer 1875
			LOGGER.info("razorPay" + razorPay);
1876
			if (razorPay != null) {
1877
				List<Payment> payments = razorPaymentService.fetchOrderForPayment(razorPay.getRazorOrderId());
28377 tejbeer 1878
 
28369 tejbeer 1879
				if (!payments.isEmpty()) {
28377 tejbeer 1880
					List<String> statusList = new ArrayList<>();
28369 tejbeer 1881
					for (Payment payment : payments) {
28368 tejbeer 1882
 
28377 tejbeer 1883
						JSONObject jsonObj = new JSONObject(payment.toString());
1884
 
1885
						String status = jsonObj.getString("status");
1886
 
1887
						statusList.add(status);
1888
 
28369 tejbeer 1889
					}
28377 tejbeer 1890
					LOGGER.info("statusList" + statusList);
28368 tejbeer 1891
 
28377 tejbeer 1892
					if (statusList.contains("authorized") || statusList.contains("captured")) {
1893
						po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
1894
						po.setPaidAmount(po.getTotalAmount());
1895
						for (PendingOrderItem poi : poItems) {
1896
							poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
1897
						}
1898
						Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(po);
1899
 
1900
						CustomRetailer customRetailer = retailerService.getFofoRetailer(po.getFofoId());
1901
						Customer customer = customerRepository.selectById(po.getCustomerId());
1902
						String[] customerEmail = null;
1903
						if (customer.getEmailId() != null) {
1904
							customerEmail = new String[] { customer.getEmailId() };
1905
						}
1906
						List<String> bccTo = Arrays.asList("kamini.sharma@smartdukaan.com",
28467 tejbeer 1907
								"tarun.verma@smartdukaan.com", "niranjan.kala@smartdukaan.com", "sm@smartdukaan.com",
1908
								"tejbeer.kaur@shop2020.in", customRetailer.getEmail());
28377 tejbeer 1909
						List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
1910
						if (authUserEmails != null) {
1911
							authUserEmails = new ArrayList<>();
1912
						}
1913
						authUserEmails.addAll(bccTo);
1914
 
28382 tejbeer 1915
						// emailService.sendMailWithAttachments("Order Created with SmartDukaan",
1916
						// "order-confirm.vm",
1917
						// emailModel, customerEmail, null, authUserEmails.toArray(new String[0]));
28377 tejbeer 1918
 
1919
					} else if (statusList.contains("refunded") || statusList.contains("failed")) {
1920
						for (PendingOrderItem poi : poItems) {
1921
							poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
1922
						}
1923
 
1924
						po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
1925
					}
1926
 
28369 tejbeer 1927
				}
28377 tejbeer 1928
				// LOGGER.info("payment" + payments);
28369 tejbeer 1929
 
1930
			}
28368 tejbeer 1931
		}
1932
	}
1933
 
25865 amit.gupta 1934
	public static class SaleTargetReportModel {
1935
		private double totalSale;
26941 amit.gupta 1936
		private long totalQty;
26945 amit.gupta 1937
		private double past3daysSale;
25880 amit.gupta 1938
		private int fofoId;
1939
 
1940
		public int getFofoId() {
1941
			return fofoId;
1942
		}
1943
 
1944
		public void setFofoId(int fofoId) {
1945
			this.fofoId = fofoId;
1946
		}
1947
 
25865 amit.gupta 1948
		private double smartphoneSale;
1949
		private long smartphoneQty;
1950
		private double insuranceSale;
1951
		private long insruanceQty;
1952
 
26941 amit.gupta 1953
		public long getTotalQty() {
1954
			return totalQty;
1955
		}
1956
 
1957
		public void setTotalQty(long totalQty) {
1958
			this.totalQty = totalQty;
1959
		}
1960
 
26945 amit.gupta 1961
		public double getPast3daysSale() {
1962
			return past3daysSale;
1963
		}
1964
 
1965
		public void setPast3daysSale(double past3daysSale) {
1966
			this.past3daysSale = past3daysSale;
1967
		}
1968
 
25865 amit.gupta 1969
		@Override
1970
		public int hashCode() {
1971
			final int prime = 31;
1972
			int result = 1;
25880 amit.gupta 1973
			result = prime * result + fofoId;
25865 amit.gupta 1974
			result = prime * result + (int) (insruanceQty ^ (insruanceQty >>> 32));
1975
			long temp;
1976
			temp = Double.doubleToLongBits(insuranceSale);
1977
			result = prime * result + (int) (temp ^ (temp >>> 32));
1978
			result = prime * result + (int) (smartphoneQty ^ (smartphoneQty >>> 32));
1979
			temp = Double.doubleToLongBits(smartphoneSale);
1980
			result = prime * result + (int) (temp ^ (temp >>> 32));
26941 amit.gupta 1981
			result = prime * result + (int) (totalQty ^ (totalQty >>> 32));
25865 amit.gupta 1982
			temp = Double.doubleToLongBits(totalSale);
1983
			result = prime * result + (int) (temp ^ (temp >>> 32));
1984
			return result;
1985
		}
1986
 
1987
		@Override
1988
		public boolean equals(Object obj) {
1989
			if (this == obj)
1990
				return true;
1991
			if (obj == null)
1992
				return false;
1993
			if (getClass() != obj.getClass())
1994
				return false;
1995
			SaleTargetReportModel other = (SaleTargetReportModel) obj;
25880 amit.gupta 1996
			if (fofoId != other.fofoId)
1997
				return false;
25865 amit.gupta 1998
			if (insruanceQty != other.insruanceQty)
1999
				return false;
2000
			if (Double.doubleToLongBits(insuranceSale) != Double.doubleToLongBits(other.insuranceSale))
2001
				return false;
2002
			if (smartphoneQty != other.smartphoneQty)
2003
				return false;
2004
			if (Double.doubleToLongBits(smartphoneSale) != Double.doubleToLongBits(other.smartphoneSale))
2005
				return false;
26941 amit.gupta 2006
			if (totalQty != other.totalQty)
2007
				return false;
25865 amit.gupta 2008
			if (Double.doubleToLongBits(totalSale) != Double.doubleToLongBits(other.totalSale))
2009
				return false;
2010
			return true;
2011
		}
2012
 
2013
		public double getTotalSale() {
2014
			return totalSale;
2015
		}
2016
 
2017
		public void setTotalSale(double totalSale) {
2018
			this.totalSale = totalSale;
2019
		}
2020
 
2021
		public double getSmartphoneSale() {
2022
			return smartphoneSale;
2023
		}
2024
 
2025
		public void setSmartphoneSale(double smartphoneSale) {
2026
			this.smartphoneSale = smartphoneSale;
2027
		}
2028
 
2029
		public long getSmartphoneQty() {
2030
			return smartphoneQty;
2031
		}
2032
 
2033
		public void setSmartphoneQty(long smartphoneQty) {
2034
			this.smartphoneQty = smartphoneQty;
2035
		}
2036
 
2037
		public double getInsuranceSale() {
2038
			return insuranceSale;
2039
		}
2040
 
2041
		public void setInsuranceSale(double insuranceSale) {
2042
			this.insuranceSale = insuranceSale;
2043
		}
2044
 
2045
		public long getInsruanceQty() {
2046
			return insruanceQty;
2047
		}
2048
 
2049
		public void setInsruanceQty(long insruanceQty) {
2050
			this.insruanceQty = insruanceQty;
2051
		}
2052
 
2053
		@Override
2054
		public String toString() {
26945 amit.gupta 2055
			return "SaleTargetReportModel [totalSale=" + totalSale + ", totalQty=" + totalQty + ", past3daysSale="
2056
					+ past3daysSale + ", fofoId=" + fofoId + ", smartphoneSale=" + smartphoneSale + ", smartphoneQty="
2057
					+ smartphoneQty + ", insuranceSale=" + insuranceSale + ", insruanceQty=" + insruanceQty + "]";
25865 amit.gupta 2058
		}
2059
 
2060
	}
2061
 
26945 amit.gupta 2062
	private String getStateWiseSales(Map<Integer, SaleTargetReportModel> saleTargetReportModelMap,
2063
			Map<Integer, FofoReportingModel> partnerSalesHeadersMap) throws Exception {
26940 amit.gupta 2064
		List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
26945 amit.gupta 2065
		Map<String, List<Integer>> stateMap = stores.stream().collect(Collectors
2066
				.groupingBy(x -> x.getCode().substring(0, 2), Collectors.mapping(x -> x.getId(), Collectors.toList())));
26940 amit.gupta 2067
		List<List<Serializable>> stateWiseSales = new ArrayList<>();
2068
		for (Map.Entry<String, List<Integer>> stateMapEntry : stateMap.entrySet()) {
26945 amit.gupta 2069
			long totalQty = stateMapEntry.getValue().stream()
2070
					.collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getTotalQty()));
2071
			double totalSale = stateMapEntry.getValue().stream()
2072
					.collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getTotalSale()));
2073
			long smartPhoneQty = stateMapEntry.getValue().stream()
2074
					.collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getSmartphoneQty()));
2075
			double smartPhoneSale = stateMapEntry.getValue().stream()
2076
					.collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getSmartphoneSale()));
2077
			stateWiseSales
2078
					.add(Arrays.asList(stateMapEntry.getKey(), smartPhoneQty, smartPhoneSale, totalQty, totalSale));
26940 amit.gupta 2079
		}
2080
		StringBuilder sb = new StringBuilder();
26945 amit.gupta 2081
		sb.append("<html><body>");
2082
		sb.append("<p>Statewise Sale Report:</p><br/><table style='border:1px solid black';cellspacing=0>");
26940 amit.gupta 2083
		sb.append("<tbody>\n" + "	    <tr>"
2084
				+ "	    					<th style='border:1px solid black;padding: 5px'>State</th>"
26941 amit.gupta 2085
				+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Qty</th>"
2086
				+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Value</th>"
2087
				+ "	    					<th style='border:1px solid black;padding: 5px'>Total Qty</th>"
2088
				+ "	    					<th style='border:1px solid black;padding: 5px'>Total Value</th>"
26940 amit.gupta 2089
				+ "	    				</tr>");
2090
		for (List<Serializable> stateSale : stateWiseSales) {
2091
			sb.append("<tr>");
2092
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(0) + "</td>");
2093
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(1) + "</td>");
2094
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(2) + "</td>");
26941 amit.gupta 2095
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(3) + "</td>");
2096
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(4) + "</td>");
26940 amit.gupta 2097
			sb.append("</tr>");
2098
		}
26945 amit.gupta 2099
		sb.append("</tbody></table><br><br>");
25872 tejbeer 2100
 
26945 amit.gupta 2101
		sb.append("<p>Sale Report:</p><br/><table style='border:1px solid black';cellspacing=0>");
24653 govind 2102
		sb.append("<tbody>\n" + "	    				<tr>\n"
26945 amit.gupta 2103
				+ "	    					<th style='border:1px solid black;padding: 5px'>Code</th>"
2104
				+ "	    					<th style='border:1px solid black;padding: 5px'>Business Name</th>"
2105
				+ "	    					<th style='border:1px solid black;padding: 5px'>Regional Manager</th>"
2106
				+ "	    					<th style='border:1px solid black;padding: 5px'>Territory Manager</th>"
2107
				+ "	    					<th style='border:1px solid black;padding: 5px'>Sale</th>"
2108
				+ "	    					<th style='border:1px solid black;padding: 5px'>Smartphone Sale</th>"
2109
				+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Qty</th>"
24653 govind 2110
				+ "	    				</tr>");
26945 amit.gupta 2111
 
2112
		List<Integer> sortedPartnerSalesHeaders = partnerSalesHeadersMap.values().stream()
26947 amit.gupta 2113
				.sorted(Comparator.comparing(FofoReportingModel::getCode)
2114
						.thenComparing(FofoReportingModel::getRegionalManager)
26948 amit.gupta 2115
						.thenComparing(FofoReportingModel::getTerritoryManager))
26945 amit.gupta 2116
				.map(FofoReportingModel::getFofoId).collect(Collectors.toList());
25927 amit.gupta 2117
		for (Integer fofoId : sortedPartnerSalesHeaders) {
27007 amit.gupta 2118
			if (saleTargetReportModelMap.get(fofoId).getPast3daysSale() == 0) {
26947 amit.gupta 2119
				sb.append("<tr style='background-color:red'>");
2120
			} else {
26945 amit.gupta 2121
				sb.append("<tr>");
2122
			}
2123
			sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getCode()
25880 amit.gupta 2124
					+ "</td>");
2125
			sb.append("<td style='border:1px solid black;padding: 5px'>"
27007 amit.gupta 2126
					+ partnerSalesHeadersMap.get(fofoId).getBusinessName() + "</td>");
2127
			sb.append("<td style='border:1px solid black;padding: 5px'>"
2128
					+ partnerSalesHeadersMap.get(fofoId).getRegionalManager() + "</td>");
2129
			sb.append("<td style='border:1px solid black;padding: 5px'>"
2130
					+ partnerSalesHeadersMap.get(fofoId).getTerritoryManager() + "</td>");
2131
			sb.append("<td style='border:1px solid black;padding: 5px'>"
26945 amit.gupta 2132
					+ saleTargetReportModelMap.get(fofoId).getTotalSale() + "</td>");
25880 amit.gupta 2133
			sb.append("<td style='border:1px solid black;padding: 5px'>"
26945 amit.gupta 2134
					+ saleTargetReportModelMap.get(fofoId).getSmartphoneSale() + "</td>");
25880 amit.gupta 2135
			sb.append("<td style='border:1px solid black;padding: 5px'>"
26945 amit.gupta 2136
					+ saleTargetReportModelMap.get(fofoId).getSmartphoneQty() + "</td>");
25865 amit.gupta 2137
			sb.append("</tr>");
24653 govind 2138
		}
24683 amit.gupta 2139
 
26945 amit.gupta 2140
		sb.append("</tr>");
2141
 
2142
		sb.append("</body></html>");
2143
 
2144
		return sb.toString();
24653 govind 2145
	}
24841 govind 2146
 
26945 amit.gupta 2147
	private void sendMailOfHtmlFormat(String email, String body, String cc[], String subject)
24841 govind 2148
			throws MessagingException, ProfitMandiBusinessException, IOException {
2149
		MimeMessage message = mailSender.createMimeMessage();
2150
		MimeMessageHelper helper = new MimeMessageHelper(message);
2151
		helper.setSubject(subject);
2152
		helper.setText(body, true);
2153
		helper.setTo(email);
2154
		if (cc != null) {
2155
			helper.setCc(cc);
2156
		}
2157
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
2158
		helper.setFrom(senderAddress);
2159
		mailSender.send(message);
2160
	}
25300 tejbeer 2161
 
25351 tejbeer 2162
	public void sendNotification() throws Exception {
25300 tejbeer 2163
		List<PushNotifications> pushNotifications = pushNotificationRepository.selectAllByTimestamp();
2164
		if (!pushNotifications.isEmpty()) {
2165
			for (PushNotifications pushNotification : pushNotifications) {
25351 tejbeer 2166
				Device device = deviceRepository.selectById(pushNotification.getDeviceId());
25300 tejbeer 2167
				NotificationCampaign notificationCampaign = notificationCampaignRepository
2168
						.selectById(pushNotification.getNotificationCampaignid());
2169
				SimpleCampaignParams scp = gson.fromJson(notificationCampaign.getImplementationParams(),
2170
						SimpleCampaignParams.class);
2171
				Campaign campaign = new SimpleCampaign(scp);
25351 tejbeer 2172
				String result_url = campaign.getUrl() + "&user_id=" + device.getUser_id();
25300 tejbeer 2173
				JSONObject json = new JSONObject();
25351 tejbeer 2174
				json.put("to", device.getFcmId());
25300 tejbeer 2175
				JSONObject jsonObj = new JSONObject();
2176
				jsonObj.put("message", campaign.getMessage());
2177
				jsonObj.put("title", campaign.getTitle());
2178
				jsonObj.put("type", campaign.getType());
2179
				jsonObj.put("url", result_url);
2180
				jsonObj.put("time_to_live", campaign.getExpireTimestamp());
2181
				jsonObj.put("image", campaign.getImageUrl());
2182
				jsonObj.put("largeIcon", "large_icon");
2183
				jsonObj.put("smallIcon", "small_icon");
2184
				jsonObj.put("vibrate", 1);
2185
				jsonObj.put("pid", pushNotification.getId());
2186
				jsonObj.put("sound", 1);
2187
				jsonObj.put("priority", "high");
2188
				json.put("data", jsonObj);
25351 tejbeer 2189
				try {
2190
					CloseableHttpClient client = HttpClients.createDefault();
2191
					HttpPost httpPost = new HttpPost(FCM_URL);
25300 tejbeer 2192
 
25351 tejbeer 2193
					httpPost.setHeader("Content-Type", "application/json; utf-8");
2194
					httpPost.setHeader("authorization", "key=" + FCM_API_KEY);
2195
					StringEntity entity = new StringEntity(json.toString());
2196
					httpPost.setEntity(entity);
2197
					CloseableHttpResponse response = client.execute(httpPost);
25300 tejbeer 2198
 
25351 tejbeer 2199
					if (response.getStatusLine().getStatusCode() == 200) {
2200
						pushNotification.setSentTimestamp(LocalDateTime.now());
2201
					} else {
25356 tejbeer 2202
						pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
25778 amit.gupta 2203
						LOGGER.info("message" + "not sent");
26945 amit.gupta 2204
						response.toString();
25351 tejbeer 2205
					}
25300 tejbeer 2206
 
25351 tejbeer 2207
				} catch (Exception e) {
2208
					e.printStackTrace();
26443 amit.gupta 2209
					pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
26436 amit.gupta 2210
					LOGGER.info("message " + "not sent " + e.getMessage());
25300 tejbeer 2211
				}
2212
			}
2213
		}
2214
	}
2215
 
25553 amit.gupta 2216
	public void grouping() throws Exception {
25609 amit.gupta 2217
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yyyy hh:mm");
2218
		List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByStatus(PriceDropImeiStatus.APPROVED);
2219
		System.out.println(String.join("\t",
2220
				Arrays.asList("IMEI", "ItemId", "Brand", "Model Name", "Model Number", "Franchise Id", "Franchise Name",
25694 amit.gupta 2221
						"Grn On", "Price Dropped On", "Approved On", "Returned On", "Price Drop Paid", "Is Doa")));
26963 amit.gupta 2222
		Map<Integer, CustomRetailer> retailersMap = retailerService.getFofoRetailers(false);
25609 amit.gupta 2223
		for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
25694 amit.gupta 2224
			if (priceDropIMEI.getPartnerId() == 0)
2225
				continue;
25609 amit.gupta 2226
			HashSet<String> imeis = new HashSet<>();
2227
			PriceDrop priceDrop = priceDropRepository.selectById(priceDropIMEI.getPriceDropId());
2228
			imeis.add(priceDropIMEI.getImei());
2229
			List<InventoryItem> inventoryItems = inventoryItemRepository
2230
					.selectByFofoIdSerialNumbers(priceDropIMEI.getPartnerId(), imeis, false);
25694 amit.gupta 2231
			if (inventoryItems.size() == 0) {
2232
				LOGGER.info("Need to investigate partnerId - {} imeis - {}", priceDropIMEI.getPartnerId(), imeis);
25613 amit.gupta 2233
				continue;
25612 amit.gupta 2234
			}
25609 amit.gupta 2235
			InventoryItem inventoryItem = inventoryItems.get(0);
2236
			CustomRetailer customRetailer = retailersMap.get(inventoryItem.getFofoId());
2237
			if (inventoryItem.getLastScanType().equals(ScanType.DOA_OUT)
2238
					|| inventoryItem.getLastScanType().equals(ScanType.PURCHASE_RET)) {
2239
				// check if pricedrop has been rolled out
2240
				List<UserWalletHistory> uwh = walletService.getAllByReference(inventoryItem.getFofoId(),
2241
						priceDropIMEI.getPriceDropId(), WalletReferenceType.PRICE_DROP);
2242
				if (uwh.size() > 0) {
25615 amit.gupta 2243
					Item item = itemRepository.selectById(inventoryItem.getItemId());
26945 amit.gupta 2244
					System.out.println(String.join("\t", Arrays.asList(priceDropIMEI.getImei(),
2245
							inventoryItem.getItemId() + "", item.getBrand(), item.getModelName(), item.getModelNumber(),
2246
							inventoryItem.getFofoId() + "", customRetailer.getBusinessName(),
2247
							inventoryItem.getCreateTimestamp().format(dtf), priceDrop.getAffectedOn().format(dtf),
2248
							priceDropIMEI.getUpdateTimestamp().format(dtf),
2249
							inventoryItem.getUpdateTimestamp().format(dtf), priceDrop.getAutoPartnerPayout() + "",
2250
							inventoryItem.getLastScanType().equals(ScanType.DOA_OUT) + "")));
25609 amit.gupta 2251
				}
2252
			}
2253
		}
25503 amit.gupta 2254
	}
25694 amit.gupta 2255
 
27686 amit.gupta 2256
	public void attachToffeeInvoices() throws Exception {
28205 tejbeer 2257
		/*
2258
		 * LOGGER.info("Insurance Sum Summary --- {}",
2259
		 * insurancePolicyRepository.selectAmountSumGroupByRetailerId(LocalDateTime.MIN,
2260
		 * LocalDateTime.MAX)); LOGGER.info("Insurance Qty Summary --- {}",
2261
		 * insurancePolicyRepository.selectQtyGroupByRetailerId(LocalDateTime.MIN,
2262
		 * LocalDateTime.MAX)); LOGGER.info("SmartPhone Amount Summary --- {}",
2263
		 * fofoOrderItemRepository.selectSumAmountGroupByRetailer(LocalDateTime.MIN,
2264
		 * LocalDateTime.MAX, 0, true)); LOGGER.info("Smartphone Qty Summary --- {}",
2265
		 * fofoOrderItemRepository.selectQtyGroupByRetailer(LocalDateTime.MIN,
2266
		 * LocalDateTime.MAX, 0, true));
2267
		 */
2268
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(3,
2269
				Optional.of(false));
2270
		for (InsurancePolicy insurancePolicy : insurancePolicies) {
27678 amit.gupta 2271
			String invoiceNumber = insurancePolicy.getInvoiceNumber();
2272
			FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2273
			PdfModel pdfModel = orderService.getInvoicePdfModel(fofoOrder.getId());
2274
			java.io.ByteArrayOutputStream byteArrayOutputStream = new java.io.ByteArrayOutputStream();
2275
			PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
28205 tejbeer 2276
			String pdfInvoiceString = "data:application/pdf;base64,"
2277
					+ Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());
2278
			boolean attached = toffeeService.attachInvoice(insurancePolicy.getPolicyNumber().split("#")[1],
2279
					pdfInvoiceString);
2280
			if (attached) {
27678 amit.gupta 2281
				insurancePolicy.setPosted(true);
2282
			}
2283
		}
25694 amit.gupta 2284
	}
2285
 
2286
	public void schemeRollback(List<String> schemeIds) throws Exception {
2287
		List<Integer> schemeIdsInt = schemeIds.stream().map(x -> Integer.parseInt(x)).collect(Collectors.toList());
25708 amit.gupta 2288
		Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIdsInt, 0, schemeIds.size()).stream()
25694 amit.gupta 2289
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
2290
		List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectBySchemeIds(new HashSet<>(schemeIdsInt));
2291
		for (SchemeInOut sio : schemeInOuts) {
2292
			Scheme scheme = schemesMap.get(sio.getSchemeId());
2293
			if (scheme.getType().equals(SchemeType.IN)) {
2294
 
2295
			} else if (scheme.getType().equals(SchemeType.OUT)) {
2296
				InventoryItem inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
2297
				List<ScanRecord> sr = scanRecordRepository.selectByInventoryItemId(sio.getInventoryItemId());
2298
				ScanRecord scanRecord = sr.stream().filter(x -> x.getType().equals(ScanType.SALE))
2299
						.max((x1, x2) -> x1.getCreateTimestamp().compareTo(x2.getCreateTimestamp())).get();
2300
				if (scanRecord.getCreateTimestamp().isAfter(scheme.getEndDateTime())
2301
						|| scanRecord.getCreateTimestamp().isBefore(scheme.getStartDateTime())) {
2302
					sio.setRolledBackTimestamp(LocalDateTime.now());
2303
					FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(scanRecord.getOrderId());
25709 amit.gupta 2304
					String rollbackReason = "Scheme reversed for "
2305
							+ itemRepository.selectById(inventoryItem.getItemId()).getItemDescription() + "/Inv - "
25694 amit.gupta 2306
							+ fofoOrder.getInvoiceNumber();
2307
					walletService.rollbackAmountFromWallet(scanRecord.getFofoId(), sio.getAmount(),
26945 amit.gupta 2308
							scanRecord.getOrderId(), WalletReferenceType.SCHEME_OUT, rollbackReason,
2309
							LocalDateTime.now());
25694 amit.gupta 2310
					System.out.printf("Amount %f,SchemeId %d,Reason %s\n", sio.getAmount(), sio.getSchemeId(),
2311
							rollbackReason);
2312
				}
2313
			}
2314
		}
25721 tejbeer 2315
		// throw new Exception();
25694 amit.gupta 2316
	}
25721 tejbeer 2317
 
2318
	public void checkfocusedModelInPartnerStock() throws Exception {
2319
 
2320
		List<Integer> fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId())
2321
				.collect(Collectors.toList());
27212 tejbeer 2322
		Map<Integer, Map<Integer, List<SaholicCIS>>> warehouseItemAvailabilityMap = saholicInventoryService
2323
				.getSaholicStock();
27213 tejbeer 2324
		Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
2325
		Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = this.getPartnerIdSalesHeaders();
27212 tejbeer 2326
 
2327
		Map<Integer, Map<Integer, List<SaholicPOItem>>> warehousePoItemAvailabilityMap = saholicInventoryService
2328
				.getSaholicPOItems();
25721 tejbeer 2329
		Map<Integer, List<FocusedModelShortageModel>> focusedModelShortageReportMap = new HashMap<>();
2330
		for (Integer fofoId : fofoIds) {
27102 amit.gupta 2331
			List<FocusedModelShortageModel> focusedModelShortageList = new ArrayList<>();
2332
			focusedModelShortageReportMap.put(fofoId, focusedModelShortageList);
25721 tejbeer 2333
			CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
2334
			Map<Integer, Integer> processingOrderMap = null;
2335
			Map<Integer, Integer> catalogIdAndQtyMap = null;
2336
			Map<Integer, Integer> grnPendingOrdersMap = null;
2337
 
2338
			Map<Integer, Integer> currentInventorySnapshot = currentInventorySnapshotRepository.selectByFofoId(fofoId)
2339
					.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
2340
 
2341
			if (!currentInventorySnapshot.isEmpty()) {
2342
				catalogIdAndQtyMap = itemRepository.selectByIds(currentInventorySnapshot.keySet()).stream()
2343
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2344
								Collectors.summingInt(x -> currentInventorySnapshot.get(x.getId()))));
2345
 
2346
			}
2347
 
2348
			Map<Integer, Integer> grnPendingOrders = orderRepository.selectPendingGrnOrders(fofoId).stream()
2349
					.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
2350
							Collectors.summingInt(x -> x.getLineItem().getQuantity())));
2351
			if (!grnPendingOrders.isEmpty()) {
2352
				grnPendingOrdersMap = itemRepository.selectByIds(grnPendingOrders.keySet()).stream()
2353
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2354
								Collectors.summingInt(x -> grnPendingOrders.get(x.getId()))));
2355
 
2356
			}
2357
 
2358
			Map<Integer, Integer> processingOrder = orderRepository.selectOrders(fofoId, orderStatusList).stream()
2359
					.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
2360
							Collectors.summingInt(x -> x.getLineItem().getQuantity())));
2361
			if (!processingOrder.isEmpty()) {
2362
				processingOrderMap = itemRepository.selectByIds(processingOrder.keySet()).stream()
2363
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2364
								Collectors.summingInt(x -> processingOrder.get(x.getId()))));
2365
 
2366
			}
2367
 
25800 tejbeer 2368
			List<String> brands = mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name"))
2369
					.collect(Collectors.toList());
2370
 
27088 tejbeer 2371
			List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId())
2372
					.collect(Collectors.toList());
27095 tejbeer 2373
			LOGGER.info("regionIds" + regionIds);
27102 amit.gupta 2374
			if (regionIds.size() == 0) {
2375
				LOGGER.info("No region found for partner {}", fofoId);
2376
				continue;
2377
			}
27100 amit.gupta 2378
			Map<Integer, Optional<Integer>> focusedCatalogIdAndQtyMap = focusedModelRepository
27102 amit.gupta 2379
					.selectAllByRegionIds(regionIds).stream().collect(Collectors.groupingBy(FocusedModel::getCatalogId,
2380
							Collectors.mapping(FocusedModel::getMinimumQty, Collectors.maxBy(Integer::compareTo))));
25800 tejbeer 2381
 
25721 tejbeer 2382
			LOGGER.info("focusedCatalogIdAndQtyMap" + focusedCatalogIdAndQtyMap);
2383
 
27100 amit.gupta 2384
			for (Map.Entry<Integer, Optional<Integer>> entry : focusedCatalogIdAndQtyMap.entrySet()) {
2385
				int minQty = entry.getValue().get();
25721 tejbeer 2386
				int inStockQty = 0;
2387
				int processingQty = 0;
2388
				int grnPendingQty = 0;
27208 tejbeer 2389
				int allColorNetAvailability = 0;
27253 tejbeer 2390
				int allColorPoAvailability = 0;
25721 tejbeer 2391
				if (processingOrderMap != null) {
2392
					processingQty = (processingOrderMap.get(entry.getKey()) == null) ? 0
2393
							: processingOrderMap.get(entry.getKey());
2394
 
2395
				}
2396
				if (grnPendingOrdersMap != null) {
2397
					grnPendingQty = (grnPendingOrdersMap.get(entry.getKey()) == null) ? 0
2398
							: grnPendingOrdersMap.get(entry.getKey());
2399
 
2400
				}
2401
				if (catalogIdAndQtyMap != null) {
2402
					inStockQty = (catalogIdAndQtyMap.get(entry.getKey()) == null) ? 0
2403
							: catalogIdAndQtyMap.get(entry.getKey());
2404
 
2405
				}
28526 tejbeer 2406
 
2407
				int grnStockQty = grnPendingQty + inStockQty;
25721 tejbeer 2408
				int totalQty = processingQty + grnPendingQty + inStockQty;
2409
 
27100 amit.gupta 2410
				if (totalQty < minQty) {
25721 tejbeer 2411
 
27100 amit.gupta 2412
					int shortageQty = minQty - totalQty;
25721 tejbeer 2413
					List<Item> item = itemRepository.selectAllByCatalogItemId(entry.getKey());
27212 tejbeer 2414
					FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
27213 tejbeer 2415
 
27212 tejbeer 2416
					Map<Integer, List<SaholicCIS>> itemAvailabilityMap = warehouseItemAvailabilityMap
2417
							.get(fofoStore.getWarehouseId());
25721 tejbeer 2418
 
27212 tejbeer 2419
					Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = warehousePoItemAvailabilityMap
2420
							.get(fofoStore.getWarehouseId());
27208 tejbeer 2421
 
2422
					for (Item it : item) {
28527 tejbeer 2423
						List<SaholicCIS> currentAvailability = null;
28528 tejbeer 2424
						List<SaholicPOItem> poItemAvailability = null;
28527 tejbeer 2425
						if (itemAvailabilityMap != null) {
2426
							currentAvailability = itemAvailabilityMap.get(it.getId());
2427
						}
28528 tejbeer 2428
 
2429
						if (poItemAvailabilityMap != null) {
2430
							poItemAvailability = poItemAvailabilityMap.get(it.getId());
2431
						}
27208 tejbeer 2432
						if (currentAvailability != null) {
2433
							allColorNetAvailability += currentAvailability.stream()
2434
									.collect(Collectors.summingInt(SaholicCIS::getNetavailability));
2435
						}
27253 tejbeer 2436
 
27208 tejbeer 2437
						if (poItemAvailability != null) {
27253 tejbeer 2438
							allColorPoAvailability += poItemAvailability.stream()
27208 tejbeer 2439
									.collect(Collectors.summingInt(SaholicPOItem::getUnfulfilledQty));
2440
						}
27253 tejbeer 2441
 
27208 tejbeer 2442
					}
2443
 
25721 tejbeer 2444
					FocusedModelShortageModel fm = new FocusedModelShortageModel();
2445
					fm.setFofoId(fofoId);
27212 tejbeer 2446
					fm.setStoreCode(fofoStore.getCode());
25721 tejbeer 2447
					fm.setStoreName(customRetailer.getBusinessName());
27208 tejbeer 2448
					fm.setBrandName(item.get(0).getBrand());
2449
					fm.setModelName(item.get(0).getModelName());
2450
					fm.setModelNumber(item.get(0).getModelNumber());
28526 tejbeer 2451
					fm.setGrnStockQty(grnStockQty);
2452
					fm.setPendingIndentQty(processingQty);
25721 tejbeer 2453
					fm.setShortageQty(shortageQty);
27253 tejbeer 2454
					fm.setPoAvailabitiy(allColorPoAvailability);
27208 tejbeer 2455
					fm.setWarehouseName(warehouseMap.get(customRetailer.getWarehouseId()));
27213 tejbeer 2456
					fm.setStateManager(partnerIdSalesHeadersMap.get(fofoId).getRegionalManager());
2457
					fm.setTerritoryManager(partnerIdSalesHeadersMap.get(fofoId).getTerritoryManager());
27246 tejbeer 2458
					fm.setItemName(item.get(0).getBrand() + item.get(0).getModelNumber() + item.get(0).getModelName());
27208 tejbeer 2459
					fm.setAvailabitiy(allColorNetAvailability);
25721 tejbeer 2460
 
27102 amit.gupta 2461
					focusedModelShortageList.add(fm);
25721 tejbeer 2462
				}
2463
 
2464
			}
27233 tejbeer 2465
 
28529 tejbeer 2466
			if (!focusedModelShortageList.isEmpty()) {
2467
				String subject = "Stock Alert";
2468
				String messageText = this.getMessage(focusedModelShortageList);
27233 tejbeer 2469
 
28529 tejbeer 2470
				this.sendMailWithAttachments(subject, messageText, customRetailer.getEmail());
2471
				String notificationMessage = this.getNotificationMessage(focusedModelShortageList);
2472
 
2473
				LOGGER.info("notificationMessage" + notificationMessage);
2474
 
2475
				SendNotificationModel sendNotificationModel = new SendNotificationModel();
2476
				sendNotificationModel.setCampaignName("Stock Alert");
2477
				sendNotificationModel.setTitle("Alert");
2478
				sendNotificationModel.setMessage(notificationMessage);
2479
				sendNotificationModel.setType("url");
2480
				sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
2481
				sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2482
				sendNotificationModel.setMessageType(MessageType.notification);
2483
				int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
2484
				sendNotificationModel.setUserIds(Arrays.asList(userId));
2485
				notificationService.sendNotification(sendNotificationModel);
2486
 
2487
			}
2488
 
25721 tejbeer 2489
		}
27102 amit.gupta 2490
		if (!focusedModelShortageReportMap.isEmpty()) {
25800 tejbeer 2491
			String fileName = "Stock Alert-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
2492
			Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
25837 amit.gupta 2493
			Map<String, List<List<?>>> emailRowsMap = new HashMap<>();
25721 tejbeer 2494
 
25800 tejbeer 2495
			focusedModelShortageReportMap.entrySet().forEach(x -> {
2496
				storeGuyMap.entrySet().forEach(y -> {
2497
 
2498
					if (y.getValue().contains(x.getKey())) {
2499
						if (!emailRowsMap.containsKey(y.getKey())) {
2500
							emailRowsMap.put(y.getKey(), new ArrayList<>());
2501
						}
27208 tejbeer 2502
						List<List<? extends Serializable>> fms = x.getValue().stream()
2503
								.map(r -> Arrays.asList(r.getStoreCode(), r.getStoreName(), r.getBrandName(),
27213 tejbeer 2504
										r.getModelName(), r.getModelNumber(), r.getWarehouseName(), r.getStateManager(),
28526 tejbeer 2505
										r.getTerritoryManager(), r.getPendingIndentQty(), r.getGrnStockQty(),
2506
										r.getShortageQty(), r.getAvailabitiy()))
25800 tejbeer 2507
								.collect(Collectors.toList());
2508
						emailRowsMap.get(y.getKey()).addAll(fms);
2509
 
25721 tejbeer 2510
					}
2511
 
25800 tejbeer 2512
				});
25721 tejbeer 2513
 
2514
			});
2515
 
27212 tejbeer 2516
			List<String> headers = Arrays.asList("Store Code", "Store Name", "Brand", "Model Name", "Model Number",
28526 tejbeer 2517
					"Warehouse Name", "State Manager", "Territory Manager", "Pending Indent", "InStock", "Shortage Qty",
2518
					"Availability");
25837 amit.gupta 2519
			emailRowsMap.entrySet().forEach(entry -> {
25721 tejbeer 2520
 
25800 tejbeer 2521
				ByteArrayOutputStream baos = null;
2522
				try {
25837 amit.gupta 2523
					baos = FileUtil.getCSVByteStream(headers, entry.getValue());
25800 tejbeer 2524
				} catch (Exception e2) {
2525
					e2.printStackTrace();
2526
				}
28529 tejbeer 2527
				String[] sendToArray = new String[] { entry.getKey() };
28526 tejbeer 2528
 
25800 tejbeer 2529
				try {
2530
					Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Stock Alert", "PFA", fileName,
2531
							new ByteArrayResource(baos.toByteArray()));
2532
				} catch (Exception e1) { // TODO Auto-generated catch block
2533
					e1.printStackTrace();
2534
				}
25721 tejbeer 2535
 
25800 tejbeer 2536
			});
2537
		}
25721 tejbeer 2538
	}
2539
 
2540
	private String getNotificationMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2541
		StringBuilder sb = new StringBuilder();
2542
		sb.append("Focused Model Shortage in Your Stock : \n");
2543
		for (FocusedModelShortageModel entry : focusedModelShortageModel) {
2544
 
2545
			sb.append(entry.getItemName() + "-" + entry.getShortageQty());
2546
			sb.append(String.format("%n", ""));
2547
		}
2548
		return sb.toString();
2549
	}
2550
 
2551
	private void sendMailWithAttachments(String subject, String messageText, String email) throws Exception {
2552
		MimeMessage message = mailSender.createMimeMessage();
2553
		MimeMessageHelper helper = new MimeMessageHelper(message, true);
2554
 
2555
		helper.setSubject(subject);
2556
		helper.setText(messageText, true);
2557
		helper.setTo(email);
27116 amit.gupta 2558
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
25721 tejbeer 2559
		helper.setFrom(senderAddress);
2560
		mailSender.send(message);
2561
 
2562
	}
2563
 
2564
	private String getMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2565
		StringBuilder sb = new StringBuilder();
2566
		sb.append("<html><body><p>Alert</p><p>Focused Model Shortage in Your Stock:-</p>"
2567
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
2568
		sb.append("<tbody>\n" + "	    				<tr>\n"
2569
				+ "	    					<th style='border:1px solid black;padding: 5px'>Item</th>\n"
2570
				+ "	    					<th style='border:1px solid black;padding: 5px'>Shortage Qty</th>\n"
2571
				+ "	    				</tr>");
2572
		for (FocusedModelShortageModel entry : focusedModelShortageModel) {
2573
 
2574
			sb.append("<tr>");
2575
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getItemName() + "</td>");
2576
 
2577
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getShortageQty() + "</td>");
2578
 
2579
			sb.append("</tr>");
2580
 
2581
		}
2582
 
2583
		sb.append("</tbody></table></body></html>");
2584
 
2585
		return sb.toString();
2586
	}
2587
 
25927 amit.gupta 2588
	public void notifyLead() throws Exception {
29443 amit.gupta 2589
		List<Lead> leadsToNotify = leadRepository.selectLeadsScheduledBetweenDate(null, LocalDateTime.now().minusDays(15),
25927 amit.gupta 2590
				LocalDateTime.now().plusHours(4));
2591
		Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream()
2592
				.collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
27477 amit.gupta 2593
		LOGGER.info("authUserEmailMap {}", authUserEmailMap);
25927 amit.gupta 2594
		Map<String, Integer> dtrEmailMap = dtrUserRepository
2595
				.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream()
2596
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
25936 amit.gupta 2597
 
27477 amit.gupta 2598
		LOGGER.info("dtrEmailMap {}", dtrEmailMap);
26790 tejbeer 2599
 
25927 amit.gupta 2600
		Map<Integer, Integer> authUserKeyMap = new HashMap<>();
2601
 
2602
		for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2603
			int authId = authUserEmail.getKey();
2604
			String email = authUserEmail.getValue();
2605
			authUserKeyMap.put(authId, dtrEmailMap.get(email));
2606
		}
27477 amit.gupta 2607
		LOGGER.info("authUserKeyMap", authUserKeyMap);
2608
		LOGGER.info("leadsToNotify {}", leadsToNotify);
26790 tejbeer 2609
 
29308 tejbeer 2610
		String templateMessage = "Lead followup for %s %s, %s, %s is due by %s";
25927 amit.gupta 2611
		for (Lead lead : leadsToNotify) {
27217 amit.gupta 2612
			if (authUserKeyMap.get(lead.getAssignTo()) == null) {
2613
				LOGGER.info("Assignee no longer part of system {}", lead.getAssignTo());
25927 amit.gupta 2614
				continue;
2615
			}
2616
			String notificationMessage = String.format(templateMessage, lead.getFirstName(), lead.getLastName(),
29308 tejbeer 2617
					lead.getAddress(), lead.getLeadMobile(), leadTimeFormatter.format(lead.getScheduledTimestamp()));
25927 amit.gupta 2618
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
2619
			sendNotificationModel.setCampaignName("Lead Reminder");
2620
			sendNotificationModel.setTitle("Leads followup Reminder");
2621
			sendNotificationModel.setMessage(notificationMessage);
2622
			sendNotificationModel.setType("url");
29317 tejbeer 2623
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/leadUpdate?leadId=" + lead.getId());
25927 amit.gupta 2624
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2625
			sendNotificationModel.setMessageType(MessageType.reminder);
26320 tejbeer 2626
			sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(lead.getAssignTo())));
25929 amit.gupta 2627
			System.out.println(sendNotificationModel);
25927 amit.gupta 2628
			notificationService.sendNotification(sendNotificationModel);
2629
		}
2630
	}
26945 amit.gupta 2631
 
25927 amit.gupta 2632
	public void notifyVisits() throws Exception {
26945 amit.gupta 2633
		List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository
2634
				.selectVisitsScheduledBetweenDate(LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
25927 amit.gupta 2635
		Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream()
2636
				.collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
2637
		Map<String, Integer> dtrEmailMap = dtrUserRepository
2638
				.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream()
2639
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
2640
		Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26945 amit.gupta 2641
 
25927 amit.gupta 2642
		for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2643
			int authId = authUserEmail.getKey();
2644
			String email = authUserEmail.getValue();
2645
			authUserKeyMap.put(authId, dtrEmailMap.get(email));
2646
		}
2647
		String visitTemplate = "Planned visit to franchisee %s is due by %s";
2648
		String followupTemplate = "Lead followup for franchisee %s is due by %s";
2649
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("MMM 7, EEEE h:m a");
2650
		for (FranchiseeVisit visit : franchiseeVisits) {
2651
			if (authUserKeyMap.containsKey(visit.getAuthId())) {
2652
				continue;
2653
			}
2654
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
2655
			String message = null;
26945 amit.gupta 2656
			if (visit.getFranchiseActivityId() == 0) {
2657
				message = String.format(visitTemplate, visit.getPartnerName(),
2658
						timeFormatter.format(visit.getSchelduleTimestamp()));
2659
				sendNotificationModel.setCampaignName("Franchisee visit Reminder");
25927 amit.gupta 2660
			} else {
26945 amit.gupta 2661
				message = String.format(followupTemplate, visit.getPartnerName(),
2662
						timeFormatter.format(visit.getSchelduleTimestamp()));
25927 amit.gupta 2663
				sendNotificationModel.setCampaignName("Franchisee followup Reminder");
2664
			}
2665
			sendNotificationModel.setMessage(message);
2666
			sendNotificationModel.setType("url");
26482 tejbeer 2667
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25927 amit.gupta 2668
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2669
			sendNotificationModel.setMessageType(MessageType.reminder);
2670
			sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(visit.getAuthId())));
2671
			notificationService.sendNotification(sendNotificationModel);
2672
		}
25910 amit.gupta 2673
	}
25982 amit.gupta 2674
 
26283 tejbeer 2675
	public void ticketClosed() throws Exception {
2676
 
2677
		List<Ticket> tickets = ticketRepository.selectAllNotClosedTicketsWithStatus(ActivityType.RESOLVED);
2678
		for (Ticket ticket : tickets) {
2679
			if (ticket.getUpdateTimestamp().toLocalDate().isBefore(LocalDate.now().minusDays(7))) {
2680
				ticket.setCloseTimestamp(LocalDateTime.now());
2681
				ticket.setLastActivity(ActivityType.RESOLVED_ACCEPTED);
2682
				ticket.setUpdateTimestamp(LocalDateTime.now());
2683
				ticketRepository.persist(ticket);
2684
			}
2685
		}
2686
 
2687
	}
2688
 
26790 tejbeer 2689
	public void checkValidateReferral() throws Exception {
2690
 
2691
		List<Refferal> referrals = refferalRepository.selectByStatus(RefferalStatus.pending);
26791 tejbeer 2692
		LOGGER.info("referrals" + referrals);
26790 tejbeer 2693
		if (!referrals.isEmpty()) {
2694
			String subject = "Referral Request";
2695
			String messageText = this.getMessageForReferral(referrals);
2696
 
26792 tejbeer 2697
			MimeMessage message = mailSender.createMimeMessage();
2698
			MimeMessageHelper helper = new MimeMessageHelper(message, true);
2699
			String[] email = { "kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com" };
2700
			helper.setSubject(subject);
2701
			helper.setText(messageText, true);
2702
			helper.setTo(email);
2703
			InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
2704
			helper.setFrom(senderAddress);
2705
			mailSender.send(message);
2706
 
26790 tejbeer 2707
		}
2708
	}
2709
 
2710
	private String getMessageForReferral(List<Refferal> referrals) {
2711
		StringBuilder sb = new StringBuilder();
2712
		sb.append("<html><body><p>Alert</p><p>Pending Referrals:-</p>"
2713
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
2714
		sb.append("<tbody>\n" + "	    				<tr>\n"
2715
				+ "	    					<th style='border:1px solid black;padding: 5px'>RefereeName</th>\n"
2716
				+ "	    					<th style='border:1px solid black;padding: 5px'>Referee Email</th>\n"
2717
				+ "	    					<th style='border:1px solid black;padding: 5px'>Referral Name</th>\n"
2718
				+ "	    					<th style='border:1px solid black;padding: 5px'>Refferal Mobile</th>\n"
2719
				+ "	    					<th style='border:1px solid black;padding: 5px'>city</th>\n"
2720
				+ "	    					<th style='border:1px solid black;padding: 5px'>state</th>\n"
2721
				+ "	    				</tr>");
2722
		for (Refferal entry : referrals) {
2723
 
2724
			sb.append("<tr>");
2725
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeName() + "</td>");
2726
 
2727
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeEmail() + "</td>");
2728
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getFirstName() + "</td>");
2729
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMobile() + "</td>");
2730
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCity() + "</td>");
2731
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getState() + "</td>");
2732
 
2733
			sb.append("</tr>");
2734
 
2735
		}
2736
 
2737
		sb.append("</tbody></table></body></html>");
2738
 
2739
		return sb.toString();
2740
	}
2741
 
27271 amit.gupta 2742
	public void reverseWallet() throws Exception {
2743
		LocalDate localDate = LocalDate.of(2020, 10, 28);
28205 tejbeer 2744
		List<UserWalletHistory> uwhList = userWalletHistoryRepository.selectAllByDateType(localDate.atStartOfDay(),
2745
				localDate.plusDays(1).atStartOfDay(),
27271 amit.gupta 2746
				Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
2747
		for (UserWalletHistory uwh : uwhList) {
28205 tejbeer 2748
			if (uwh.getBusinessTimestamp().getMonth().equals(Month.SEPTEMBER)) {
27275 amit.gupta 2749
				UserWallet uw = userWalletRepository.selectById(uwh.getWalletId());
28205 tejbeer 2750
				// LOGGER.info("UWH - {}", uwh);
2751
				// amount += uwh.getAmount();
2752
				// System.out.println("Amount is - " + amount);
2753
				// walletService.rollbackAmountFromWallet(uw.getUserId(), uwh.getAmount(),
2754
				// uwh.getReference(), uwh.getReferenceType(), "Margin reversal for error prone
2755
				// run", uwh.getBusinessTimestamp());
27313 amit.gupta 2756
				int orderId = uwh.getReference();
2757
				FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
2758
				int inventoryItemId = 0;
28205 tejbeer 2759
				// fofoOrderRepository.delete(fofoOrder);
27313 amit.gupta 2760
				List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
28205 tejbeer 2761
				/*
2762
				 * List<PaymentOptionTransaction> paymentOptionTransactions =
2763
				 * paymentOptionTransactionRepository.selectByReferenceIdAndType(fofoOrder.getId
2764
				 * (), PaymentOptionReferenceType.ORDER); for(PaymentOptionTransaction
2765
				 * paymentOptionTransaction : paymentOptionTransactions) {
2766
				 * //paymentOptionTransactionRepository.delete(paymentOptionTransaction); }
2767
				 */
2768
				for (FofoOrderItem foi : fofoOrderItems) {
2769
					// fofoOrderItemRepository.delete(foi);
27313 amit.gupta 2770
					List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(foi.getId());
28205 tejbeer 2771
					for (FofoLineItem fli : flis) {
2772
						// fofoLineItemRepository.delete(fli);
27313 amit.gupta 2773
						inventoryItemId = fli.getInventoryItemId();
2774
					}
2775
				}
28205 tejbeer 2776
				List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(
2777
						java.util.stream.Stream.of(inventoryItemId).collect(Collectors.toSet()));
2778
				for (SchemeInOut sio : schemeInOuts) {
2779
					if (sio.getCreateTimestamp().toLocalDate().equals(localDate)) {
27314 amit.gupta 2780
						LOGGER.info("SIO - {}", sio);
27315 amit.gupta 2781
						sio.setRolledBackTimestamp(LocalDateTime.now());
27313 amit.gupta 2782
					}
2783
				}
28205 tejbeer 2784
 
27271 amit.gupta 2785
			}
2786
		}
28205 tejbeer 2787
 
27271 amit.gupta 2788
	}
28205 tejbeer 2789
 
2790
	public void partnerProblemAlert() throws Exception {
2791
		LocalDateTime curDate = LocalDate.now().atStartOfDay();
2792
		Map<Integer, Double> lmtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
2793
				curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1), 0, false);
2794
		Map<Integer, Double> mtdSales = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate.withDayOfMonth(1),
2795
				curDate.with(LocalTime.MAX), 0, false);
2796
		Map<Integer, PartnerDailyInvestment> pdi = partnerDailyInvestmentRepository.selectAll(LocalDate.now()).stream()
2797
				.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
2798
 
2799
		for (Entry<Integer, Double> ls : lmtdSale.entrySet()) {
2800
 
2801
			double lmtdTwentyPercentSale = ls.getValue() * 0.2;
28208 tejbeer 2802
 
2803
			LOGGER.info("lmtdTwentyPercentSale" + lmtdTwentyPercentSale);
2804
 
28211 tejbeer 2805
			double mtdSale = mtdSales.get(ls.getKey()) == null ? 0 : mtdSales.get(ls.getKey());
28208 tejbeer 2806
 
2807
			LOGGER.info("mtdSale" + mtdSale);
2808
 
28209 tejbeer 2809
			double totalSixtyPercentInvestment = pdi.get(ls.getKey()) == null ? 0
2810
					: pdi.get(ls.getKey()).getTotalInvestment() * 0.6;
28205 tejbeer 2811
 
28208 tejbeer 2812
			LOGGER.info("totalSixtyPercentInvestment" + totalSixtyPercentInvestment);
2813
 
28209 tejbeer 2814
			double stockInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getInStockAmount();
28208 tejbeer 2815
 
2816
			LOGGER.info("stockInvestment" + stockInvestment);
2817
 
28205 tejbeer 2818
			boolean Investmentvalue = partnerInvestmentService.isInvestmentBelow(ls.getKey(), 25);
2819
 
2820
			PartnerProblem partnerProblem = partnerProblemRepository.selectByFofoId(ls.getKey());
2821
 
28210 tejbeer 2822
			if (partnerProblem == null) {
28205 tejbeer 2823
				partnerProblem = new PartnerProblem();
2824
				partnerProblem.setFofoId(ls.getKey());
2825
				if (mtdSale < lmtdTwentyPercentSale) {
2826
					partnerProblem.setMtd(1);
2827
				}
2828
				if (Investmentvalue) {
2829
					partnerProblem.setInvestment(1);
2830
				}
2831
 
2832
				if (stockInvestment < totalSixtyPercentInvestment) {
2833
					partnerProblem.setInvestment(1);
2834
				}
2835
 
2836
				partnerProblemRepository.persist(partnerProblem);
2837
			} else {
2838
				if (mtdSale < lmtdTwentyPercentSale) {
2839
					partnerProblem.setMtd(partnerProblem.getMtd() + 1);
2840
 
2841
				} else {
2842
					partnerProblem.setMtd(0);
2843
 
2844
				}
2845
				if (Investmentvalue) {
2846
					partnerProblem.setInvestment(partnerProblem.getInvestment() + 1);
2847
				} else {
2848
					partnerProblem.setInvestment(0);
2849
 
2850
				}
2851
				if (stockInvestment < totalSixtyPercentInvestment) {
2852
					partnerProblem.setStockInvestment(partnerProblem.getStockInvestment() + 1);
2853
				} else {
2854
					partnerProblem.setStockInvestment(0);
2855
				}
2856
 
2857
			}
2858
 
2859
		}
2860
 
28213 tejbeer 2861
		List<PartnerProblem> partnerProblems = partnerProblemRepository.selectAll().stream()
2862
				.filter(x -> x.getMtd() + x.getInvestment() + x.getStockInvestment() > 0).collect(Collectors.toList());
2863
 
28223 tejbeer 2864
		partnerProblems = partnerProblems.stream().sorted((x1, x2) -> {
28224 tejbeer 2865
			return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment()
28223 tejbeer 2866
					+ x2.getStockInvestment() ? 1 : -1;
2867
		}).collect(Collectors.toList());
28227 tejbeer 2868
 
2869
		Map<Integer, PartnerProblem> partnerProblemMap = partnerProblems.stream().sorted((x1, x2) -> {
2870
			return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment()
2871
					+ x2.getStockInvestment() ? 1 : -1;
2872
		}).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
2873
 
28212 tejbeer 2874
		Map<Integer, CustomRetailer> customRetailers = retailerService.getAllFofoRetailers();
28213 tejbeer 2875
 
28467 tejbeer 2876
		List<Integer> assignTo = Arrays.asList(15, 9, 54, 53);
28213 tejbeer 2877
 
2878
		Map<Integer, AuthUser> assignAuthUserMap = authRepository.selectAllAuthUserByIds(assignTo).stream()
2879
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
2880
 
28286 tejbeer 2881
		List<String> sendTo = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com",
28467 tejbeer 2882
				"niranjan.kala@smartdukaan.com", "sm@smartdukaan.com", "tejbeer.kaur@shop2020.in");
28208 tejbeer 2883
		LOGGER.info("partnerProblem" + partnerProblems);
28205 tejbeer 2884
		StringBuilder sb = new StringBuilder();
28218 tejbeer 2885
		sb.append("<htl><body>");
28222 tejbeer 2886
		sb.append(
2887
				"<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 2888
		sb.append("<tbody>\n" + "	    <tr>"
2889
				+ "	    					<th style='border:1px solid black;padding: 5px'>Partner Name</th>"
2890
				+ "                         <th style='border:1px solid black;padding: 5px'>Assign TO</th>"
2891
				+ "	    					<th style='border:1px solid black;padding: 5px'>Mtd</th>"
2892
				+ "	    					<th style='border:1px solid black;padding: 5px'>Investment</th>"
2893
				+ "	    					<th style='border:1px solid black;padding: 5px'>Stock</th>"
2894
				+ "	    					<th style='border:1px solid black;padding: 5px'>Manager</th>"
2895
 
2896
				+ "	    				</tr>");
2897
 
2898
		for (PartnerProblem pp : partnerProblems) {
28467 tejbeer 2899
			int value = pp.getFofoId() % 4;
28205 tejbeer 2900
 
2901
			Map<EscalationType, AuthUser> authUserMap = csService.getAuthUserAndEsclationByPartnerId(pp.getFofoId());
28217 tejbeer 2902
			LOGGER.info("authUserMap" + authUserMap);
28205 tejbeer 2903
			sb.append("<tr>");
2904
			sb.append("<td style='border:1px solid black;padding: 5px'>"
2905
					+ customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
28213 tejbeer 2906
			sb.append("<td style='border:1px solid black;padding: 5px'>"
2907
					+ assignAuthUserMap.get(assignTo.get(value)).getName() + "</td>");
28205 tejbeer 2908
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
2909
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
2910
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
28216 tejbeer 2911
			sb.append("<td style='border:1px solid black;padding: 5px'>"
28224 tejbeer 2912
					+ (authUserMap.get(EscalationType.L1) == null ? "N/A"
28216 tejbeer 2913
							: authUserMap.get(EscalationType.L1).getFirstName())
28224 tejbeer 2914
					+ " ," + (authUserMap.get(EscalationType.L2) == null ? "N/A"
28218 tejbeer 2915
							: authUserMap.get(EscalationType.L2).getFirstName())
28216 tejbeer 2916
					+ "</td>");
28205 tejbeer 2917
 
2918
			sb.append("</tr>");
2919
		}
2920
		sb.append("</tbody></table><br><br>");
2921
		String subject = "Partner Problem Alert!";
2922
		String[] email = sendTo.toArray(new String[sendTo.size()]);
2923
 
28222 tejbeer 2924
		this.sendMailHtmlFormat(email, sb.toString(), null, subject);
2925
 
28218 tejbeer 2926
		Map<Integer, List<Integer>> authUserPartnerMapping = csService.getAuthUserIdPartnerIdMapping();
2927
 
2928
		for (Entry<Integer, List<Integer>> authUserPartner : authUserPartnerMapping.entrySet()) {
28222 tejbeer 2929
			AuthUser authUser = authRepository.selectById(authUserPartner.getKey());
28227 tejbeer 2930
			for (Integer patnerId : authUserPartner.getValue()) {
2931
				if (partnerProblemMap.get(patnerId) != null) {
28218 tejbeer 2932
 
28227 tejbeer 2933
					StringBuilder sbbuilder = new StringBuilder();
2934
					sbbuilder.append("<hml><body>");
2935
					sb.append(
2936
							"<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>");
2937
					sbbuilder.append("<tbody>\n" + "	    <tr>"
2938
							+ "	    					<th style='border:1px solid black;padding: 5px'>Partner Name</th>"
2939
							+ "	    					<th style='border:1px solid black;padding: 5px'>Mtd</th>"
2940
							+ "	    					<th style='border:1px solid black;padding: 5px'>Investment</th>"
2941
							+ "	    					<th style='border:1px solid black;padding: 5px'>Stock</th>"
28218 tejbeer 2942
 
28227 tejbeer 2943
							+ "	    				</tr>");
28218 tejbeer 2944
 
28227 tejbeer 2945
					for (Integer partnerId : authUserPartner.getValue()) {
2946
						if (partnerProblemMap.get(partnerId) != null) {
2947
							PartnerProblem pp = partnerProblemMap.get(partnerId);
2948
							sbbuilder.append("<tr>");
2949
							sbbuilder.append("<td style='border:1px solid black;padding: 5px'>"
2950
									+ customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
2951
							sbbuilder
2952
									.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
2953
							sbbuilder.append(
2954
									"<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
2955
							sbbuilder.append("<td style='border:1px solid black;padding: 5px'>"
2956
									+ pp.getStockInvestment() + "</td>");
2957
 
2958
							sbbuilder.append("</tr>");
2959
						}
2960
 
28224 tejbeer 2961
					}
28227 tejbeer 2962
					sbbuilder.append("</tbody></table><br><br>");
28224 tejbeer 2963
 
28286 tejbeer 2964
					this.sendMailOfHtmlFormat(authUser.getEmailId(), sbbuilder.toString(), null, subject);
28230 tejbeer 2965
					break;
28218 tejbeer 2966
				}
28230 tejbeer 2967
 
28223 tejbeer 2968
			}
28222 tejbeer 2969
		}
2970
	}
28218 tejbeer 2971
 
28222 tejbeer 2972
	private void sendMailHtmlFormat(String email[], String body, String cc[], String subject)
2973
			throws MessagingException, ProfitMandiBusinessException, IOException {
2974
		MimeMessage message = mailSender.createMimeMessage();
2975
		MimeMessageHelper helper = new MimeMessageHelper(message);
2976
		helper.setSubject(subject);
2977
		helper.setText(body, true);
2978
		helper.setTo(email);
2979
		if (cc != null) {
2980
			helper.setCc(cc);
28218 tejbeer 2981
		}
28222 tejbeer 2982
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
2983
		helper.setFrom(senderAddress);
2984
		mailSender.send(message);
28205 tejbeer 2985
	}
2986
 
28775 amit.gupta 2987
	@Autowired
2988
	WarehouseRepository warehouseRepository;
28790 amit.gupta 2989
 
28775 amit.gupta 2990
	public void getVendorWarehouses(int warehouseId) {
28778 amit.gupta 2991
		LOGGER.info("Warehouses - {}", warehouseRepository.getVendorWarehouses().get(warehouseId));
28790 amit.gupta 2992
 
28775 amit.gupta 2993
	}
2994
 
29252 amit.gupta 2995
	public void checkCancellationMargin() throws Exception {
2996
		LocalDateTime startDate = LocalDate.of(2021, 4, 1).atStartOfDay();
2997
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectCancelledBetweenSaleDate(startDate, LocalDateTime.now());
2998
		LOGGER.info("Total Orders =  {}", fofoOrders.size());
29308 tejbeer 2999
		for (FofoOrder fofoOrder : fofoOrders) {
3000
			List<UserWalletHistory> history = userWalletHistoryRepository
3001
					.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.SCHEME_OUT);
3002
			history.addAll(userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(),
3003
					WalletReferenceType.ACTIVATION_SCHEME));
3004
			int walletSum = history.stream().mapToInt(x -> x.getAmount()).sum();
3005
			if (Math.abs(walletSum) > 1) {
3006
				// LOGGER.info("Cancelled invoice {}, Order Id = {}, = havent rolledback, Value
3007
				// = {}", fofoOrder.getInvoiceNumber(), fofoOrder.getId(), walletSum);
29252 amit.gupta 3008
				List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
3009
				List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(fofoOrderItems.get(0).getId());
3010
				FofoLineItem fli = flis.get(0);
29308 tejbeer 3011
				if (StringUtils.isEmpty(fli.getSerialNumber()))
3012
					continue;
3013
				List<SchemeInOut> schemeInOuts = schemeInOutRepository
3014
						.selectByInventoryItemIds(new HashSet<>(Arrays.asList(fli.getInventoryItemId())));
29252 amit.gupta 3015
				InventoryItem inventoryItem = inventoryItemRepository.selectById(fli.getInventoryItemId());
29308 tejbeer 3016
				double schemeSum = schemeInOuts.stream().filter(x -> x.getRolledBackTimestamp() == null)
3017
						.mapToDouble(x -> x.getAmount()).sum();
3018
				/*
3019
				 * if(inventoryItem.getGoodQuantity()==1) {
3020
				 * LOGGER.info("GoodQty, Serial Number {}, InventoryItem = {}, Billed on {}",
3021
				 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3022
				 * inventoryItem.getUpdateTimestamp()); } else
3023
				 * if(inventoryItem.getBadQuantity()==1){
3024
				 * LOGGER.info("Bad Qty, Serial Number {}, InventoryItem = {}, Billed on {}",
3025
				 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3026
				 * inventoryItem.getUpdateTimestamp()); } else if
3027
				 * (inventoryItem.getLastScanType().equals(ScanType.SALE)) { LOGGER.
3028
				 * info("Problem Sold, Serial Number {}, InventoryItem = {}, Billed on {}",
3029
				 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3030
				 * inventoryItem.getUpdateTimestamp()); }
3031
				 */
3032
				if (inventoryItem.getLastScanType().equals(ScanType.SALE)
3033
						|| inventoryItem.getLastScanType().equals(ScanType.SALE_RET)) {
3034
					Map<String, Double> map = schemeInOuts.stream()
3035
							.collect(
3036
									Collectors.groupingBy(
3037
											x -> DateTimeFormatter.ofPattern("yyyyMMddHH")
3038
													.format(x.getCreateTimestamp()) + "- " + x.getSchemeId(),
3039
											Collectors.summingDouble(x -> x.getAmount())));
3040
					for (Map.Entry<String, Double> entry : map.entrySet()) {
3041
						LOGGER.info("{} = {}", entry.getKey(), entry.getValue());
29252 amit.gupta 3042
					}
29308 tejbeer 3043
					LOGGER.info("id- {}, imei- {}, lastScan = {}, Scheme sum - {}", inventoryItem.getId(),
3044
							inventoryItem.getSerialNumber(), inventoryItem.getLastScanType(), schemeSum);
29252 amit.gupta 3045
				}
3046
			}
3047
		}
29308 tejbeer 3048
 
29252 amit.gupta 3049
	}
3050
 
29308 tejbeer 3051
	public void markDelhiveryOrderDelivered() throws ProfitMandiBusinessException, IOException {
3052
		List<Order> orders = orderRepository.selectOrderByProviderIdAndStatus(ProfitMandiConstants.DELHIVERY_PROVIDERID,
3053
				OrderStatus.SHIPPED_FROM_WH);
3054
 
3055
		if (!orders.isEmpty()) {
29441 tejbeer 3056
			Set<String> airwayBill = orders.stream().map(x -> x.getAirwayBillNumber()).collect(Collectors.toSet());
29308 tejbeer 3057
 
29441 tejbeer 3058
			int arraylength = airwayBill.size();
3059
 
3060
			if (arraylength >= 75) {
3061
 
3062
				airwayBill = airwayBill.stream().limit(74).collect(Collectors.toSet());
3063
			}
29308 tejbeer 3064
			LOGGER.info("airwayBill" + airwayBill);
3065
			String url = "https://track.delhivery.com/api/v1/packages/json/";
3066
 
3067
			OkHttpClient client = new OkHttpClient();
3068
 
3069
			Request request1 = new Request.Builder()
3070
					.url(url + "?waybill=" + String.join(",", airwayBill) + "&token=" + token).get().build();
3071
 
3072
			LOGGER.info("request1" + request1);
3073
 
3074
			Response response = client.newCall(request1).execute();
3075
 
3076
			LOGGER.info("jsonbj" + response.body());
3077
 
3078
			JSONObject jsonObj = new JSONObject(response.body().string());
3079
 
3080
			LOGGER.info("jsonObj" + jsonObj);
3081
 
29403 tejbeer 3082
			JSONArray shipmentData = jsonObj.getJSONArray("ShipmentData");
29308 tejbeer 3083
			Set<String> airwaybillStatus = new HashSet<>();
29403 tejbeer 3084
			for (int i = 0; i < shipmentData.length(); i++) {
3085
				JSONObject jsonObject = shipmentData.getJSONObject(i);
29308 tejbeer 3086
				JSONObject shipment = jsonObject.getJSONObject("Shipment");
3087
 
3088
				LOGGER.info("shipment" + shipment);
3089
				JSONObject statusDescription = shipment.getJSONObject("Status");
3090
				String awb = shipment.getString("AWB");
3091
 
3092
				String status = statusDescription.getString("Status");
3093
				LOGGER.info("status" + status);
3094
 
3095
				LOGGER.info("awb" + awb);
3096
				if (status.equals("Delivered")) {
3097
					airwaybillStatus.add(awb);
3098
				}
3099
 
3100
			}
3101
			if (!airwaybillStatus.isEmpty()) {
3102
				for (String aws : airwaybillStatus) {
3103
 
3104
					List<Order> deliverdOrders = orderRepository.selectByAirwayBillNumber(aws);
3105
					for (Order dlo : deliverdOrders) {
3106
						dlo.setStatus(OrderStatus.DELIVERY_SUCCESS);
29403 tejbeer 3107
						dlo.setStatusDescription("Order Delivered");
29308 tejbeer 3108
						dlo.setDeliveryTimestamp(LocalDateTime.now());
3109
					}
3110
 
3111
					SendNotificationModel sendNotificationModel = new SendNotificationModel();
3112
					sendNotificationModel.setCampaignName("Order Delivered");
3113
					sendNotificationModel.setTitle("Order Delivered");
3114
					sendNotificationModel.setMessage(String.format("Dear partner, your SmartDukaan ORDER " + aws
29336 tejbeer 3115
							+ "has been delivered to you in a safe sealed bag" + "."));
29308 tejbeer 3116
					sendNotificationModel.setType("url");
3117
					sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
3118
					sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
3119
					sendNotificationModel.setMessageType(MessageType.notification);
3120
					int userId = userAccountRepository.selectUserIdByRetailerId(orders.get(0).getRetailerId());
3121
					sendNotificationModel.setUserIds(Arrays.asList(userId));
3122
					notificationService.sendNotification(sendNotificationModel);
3123
 
3124
				}
3125
			}
3126
 
3127
		}
3128
	}
3129
 
26418 tejbeer 3130
}
27438 amit.gupta 3131
//2284