Subversion Repositories SmartDukaan

Rev

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