Subversion Repositories SmartDukaan

Rev

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