Subversion Repositories SmartDukaan

Rev

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