Subversion Repositories SmartDukaan

Rev

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