Subversion Repositories SmartDukaan

Rev

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