Subversion Repositories SmartDukaan

Rev

Rev 32147 | Rev 32169 | 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
 
32161 tejbeer 1137
    @Autowired
1138
    StandAlone standAlone;
32147 amit.gupta 1139
 
32063 amit.gupta 1140
    public void test() throws Exception {
1141
        try {
32147 amit.gupta 1142
            standAlone.checkOppoImeiStatus();
32063 amit.gupta 1143
        } catch (Throwable e) {
1144
            throw new Exception(e);
1145
        }
32062 amit.gupta 1146
 
31697 amit.gupta 1147
        //this.sendMailForSamsungRebilling();
31918 amit.gupta 1148
        /*List<PurchaseReturnItem> purchaseReturnItems = purchaseReturnItemRepository.selectPurchaseReturnByStatuses(Arrays.asList(PurchaseReturnStatus.DEBIT_NOTE_CREATED));
31746 amit.gupta 1149
        Map<Integer, List<PurchaseReturnItem>> inventoryItemsMap = purchaseReturnItems.stream().collect(Collectors.groupingBy(x -> x.getDebitNoteId()));
1150
        for (Map.Entry<Integer, List<PurchaseReturnItem>> debitNotePurcahseReturnMap : inventoryItemsMap.entrySet()) {
1151
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectAllByIds(debitNotePurcahseReturnMap.getValue().stream().map(x -> x.getInventoryItemId()).collect(Collectors.toList()));
1152
            offerService.reverseAdditionalSelloutSchemes(debitNotePurcahseReturnMap.getValue().get(0).getFofoId(), inventoryItems);
31918 amit.gupta 1153
        }*/
1154
        //this.sendMailForAgeingAlert();
32003 amit.gupta 1155
        //this.sendMailForAgeingAlert();
31918 amit.gupta 1156
        //System.out.println(brandRegionMappingRepository.getAvailabilityToVendorWarehouse(Arrays.asList(33353), 7720));
31746 amit.gupta 1157
 
31697 amit.gupta 1158
    }
32048 tejbeer 1159
 
32009 amit.gupta 1160
    public void test1() throws Exception {
1161
        System.out.println("Starting test");
32048 tejbeer 1162
        processScheme(LocalDate.of(2023, 05, 06).atStartOfDay(), LocalDate.of(2023, 05, 9).atStartOfDay(), false);
32009 amit.gupta 1163
        /*partnerTypeChangeService.getTypeOnDate(175139287, LocalDate.of(2023,02, 01));
1164
        partnerTypeChangeService.getTypeOnDate(175139287, LocalDate.of(2023,03, 01));
1165
        partnerTypeChangeService.getTypeOnDate(175139287, LocalDate.of(2023,04, 01));
1166
        FofoStore fs = fofoStoreRepository.selectByRetailerId(175139287);
1167
        this.rolloutMarginForStoreOnMonth(fs, LocalDate.of(2023, 2, 1));
1168
        this.rolloutMarginForStoreOnMonth(fs, LocalDate.of(2023, 3, 1));*/
25598 amit.gupta 1169
 
32009 amit.gupta 1170
        //this.sendMailForSamsungRebilling();
1171
        /*List<PurchaseReturnItem> purchaseReturnItems = purchaseReturnItemRepository.selectPurchaseReturnByStatuses(Arrays.asList(PurchaseReturnStatus.DEBIT_NOTE_CREATED));
1172
        Map<Integer, List<PurchaseReturnItem>> inventoryItemsMap = purchaseReturnItems.stream().collect(Collectors.groupingBy(x -> x.getDebitNoteId()));
1173
        for (Map.Entry<Integer, List<PurchaseReturnItem>> debitNotePurcahseReturnMap : inventoryItemsMap.entrySet()) {
1174
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectAllByIds(debitNotePurcahseReturnMap.getValue().stream().map(x -> x.getInventoryItemId()).collect(Collectors.toList()));
1175
            offerService.reverseAdditionalSelloutSchemes(debitNotePurcahseReturnMap.getValue().get(0).getFofoId(), inventoryItems);
1176
        }*/
1177
        //this.sendMailForAgeingAlert();
1178
        //this.sendMailForAgeingAlert();
1179
        //System.out.println(brandRegionMappingRepository.getAvailabilityToVendorWarehouse(Arrays.asList(33353), 7720));
1180
 
1181
    }
1182
 
31697 amit.gupta 1183
    public void sendMailForSamsungRebilling() throws Exception {
1184
        List<BilledImeiModel> samsungModels = warehouseInventoryItemRepository.findByBillingDateBrand(LocalDate.now(), "Samsung");
1185
        LOGGER.info("SamsungModels {}", samsungModels);
1186
        samsungModels = samsungModels.stream().sorted(Comparator.comparing(x -> x.getPcmDate() == null ? -1 : 1)).collect(Collectors.toList());
1187
        if (samsungModels.size() > 0) {
1188
            List<String> headers = Arrays.asList("Partner Id", "Code", "Name", "City", "Brand", "Model Name", "Model Number", "Color", "Serial Number", "Remarks");
1189
            List<List<?>> rows = new ArrayList<>();
1190
            for (BilledImeiModel billedImeiModel : samsungModels) {
31886 tejbeer 1191
                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 1192
                rows.add(row);
1193
            }
1194
            ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
1195
            String[] sendToArray = new String[]{"kamini.sharma@smartdukaan.com", "praveen.sharma@smartdukaan.com"};
1196
            String fileName = "Imeis need Rebilling -" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
31886 tejbeer 1197
            Utils.sendMailWithAttachment(googleMailSender, sendToArray, new String[]{"tarun.verma@smartdukaan.com"}, "Samsung Rebilling IMEI Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
31697 amit.gupta 1198
        }
1199
    }
24002 amit.gupta 1200
 
31697 amit.gupta 1201
    public void sendPartnerInvestmentDetails(List<String> sendTo) throws Exception {
1202
        LocalDate yesterDay = LocalDate.now().minusDays(1);
1203
        List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
31886 tejbeer 1204
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
25312 amit.gupta 1205
 
31886 tejbeer 1206
        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 1207
        List<List<?>> rows = new ArrayList<>();
1208
        Map<Integer, List<?>> partnerRowsMap = new HashMap<>();
25598 amit.gupta 1209
 
31697 amit.gupta 1210
        Map<Integer, FofoReportingModel> partnerIdSalesHeaderMap = this.getPartnerIdSalesHeaders();
25312 amit.gupta 1211
 
31886 tejbeer 1212
        Map<Integer, Integer> shortDaysMap = partnerDailyInvestmentRepository.selectAll(LocalDate.now().withDayOfMonth(1), LocalDate.now()).stream().collect(groupingBy(
1213
                x -> x.getFofoId(), Collectors.summingInt(x -> x.getShortPercentage() > 10 ? 1 : 0)));
24271 amit.gupta 1214
 
31697 amit.gupta 1215
        for (FofoStore fofoStore : fofoStores) {
1216
            LOGGER.info("Fofo Store {},  {}", fofoStore.getId(), fofoStore.getCode());
1217
            int fofoId = fofoStore.getId();
1218
            PartnerDailyInvestment partnerDailyInvestment = partnerInvestmentService.getInvestment(fofoId, 1);
1219
            partnerDailyInvestment.setDate(yesterDay);
24177 govind 1220
 
31697 amit.gupta 1221
            try {
1222
                partnerDailyInvestmentRepository.persist(partnerDailyInvestment);
31886 tejbeer 1223
                shortDaysMap.put(fofoId, shortDaysMap.get(fofoId) + (partnerDailyInvestment.getShortPercentage() > 10 ? 1 : 0));
31697 amit.gupta 1224
            } catch (Exception e) {
1225
                // ignore the exceptions during persist
1226
            }
25598 amit.gupta 1227
 
31697 amit.gupta 1228
            CustomRetailer retailer = customRetailerMap.get(fofoStore.getId());
1229
            if (retailer == null || partnerIdSalesHeaderMap.get(fofoStore.getId()) == null) {
1230
                LOGGER.info("Could not find retailer with retailer Id {}", fofoStore.getId());
1231
                continue;
1232
            }
1233
            FofoReportingModel reportingModel = partnerIdSalesHeaderMap.get(fofoStore.getId());
1234
            List<Serializable> row = new ArrayList<>();
31886 tejbeer 1235
            row.addAll(Arrays.asList(reportingModel.getCode(), reportingModel.getBusinessName(), reportingModel.getRegionalManager(), reportingModel.getTerritoryManager()));
31697 amit.gupta 1236
            row.addAll(
31886 tejbeer 1237
                    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 1238
            partnerRowsMap.put(fofoStore.getId(), row);
1239
            rows.add(row);
25837 amit.gupta 1240
 
31697 amit.gupta 1241
        }
25837 amit.gupta 1242
 
31697 amit.gupta 1243
        String fileName = "InvestmentSummary-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
25837 amit.gupta 1244
 
31697 amit.gupta 1245
        if (sendTo == null) {
1246
            for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMapping().entrySet()) {
31886 tejbeer 1247
                List<List<?>> filteredRows = storeGuyEntry.getValue().stream().map(x -> partnerRowsMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
31697 amit.gupta 1248
                ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, filteredRows);
1249
                String[] sendToArray = new String[]{storeGuyEntry.getKey()};
31886 tejbeer 1250
                Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
31697 amit.gupta 1251
            }
31886 tejbeer 1252
            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 1253
        }
25837 amit.gupta 1254
 
31697 amit.gupta 1255
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
1256
        String[] sendToArray = sendTo.toArray(new String[sendTo.size()]);
31886 tejbeer 1257
        Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
25837 amit.gupta 1258
 
31697 amit.gupta 1259
    }
25598 amit.gupta 1260
 
31697 amit.gupta 1261
    private Map<Integer, FofoReportingModel> getPartnerIdSalesHeaders() {
1262
        Map<String, SaleRoles> partnerEmailSalesMap = new HashMap<>();
1263
        Map<String, SaleRoles> partnerEmailRBMMap = new HashMap<>();
24271 amit.gupta 1264
 
31886 tejbeer 1265
        List<Position> positions = positionRepository.selectPositionByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_RBM));
1266
        Map<Integer, AuthUser> authUsersMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
31697 amit.gupta 1267
        Map<Integer, List<CustomRetailer>> positionIdRetailerMap = csService.getPositionCustomRetailerMap(positions);
1268
        for (Position position : positions) {
1269
            List<CustomRetailer> crList = positionIdRetailerMap.get(position.getId());
1270
            if (crList == null)
1271
                continue;
1272
            if (position.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_SALES) {
1273
                for (CustomRetailer cr : crList) {
1274
                    if (!partnerEmailSalesMap.containsKey(cr.getEmail())) {
1275
                        partnerEmailSalesMap.put(cr.getEmail(), new SaleRoles());
1276
                    }
1277
                    SaleRoles saleRoles = partnerEmailSalesMap.get(cr.getEmail());
1278
                    AuthUser authUser = authUsersMap.get(position.getAuthUserId());
1279
                    if (authUser == null) {
1280
                        continue;
1281
                    }
1282
                    String name = authUser.getFirstName() + " " + authUser.getLastName();
1283
                    if (position.getEscalationType().equals(EscalationType.L1)) {
1284
                        saleRoles.getL1().add(name);
1285
                    } else if (position.getEscalationType().equals(EscalationType.L2)) {
1286
                        saleRoles.getL2().add(name);
1287
                    }
1288
                }
1289
            }
1290
            if (position.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_RBM) {
1291
                for (CustomRetailer cr : crList) {
1292
                    if (!partnerEmailRBMMap.containsKey(cr.getEmail())) {
1293
                        partnerEmailRBMMap.put(cr.getEmail(), new SaleRoles());
1294
                    }
1295
                    SaleRoles saleRoles = partnerEmailRBMMap.get(cr.getEmail());
1296
                    AuthUser authUser = authUsersMap.get(position.getAuthUserId());
1297
                    if (authUser == null) {
1298
                        continue;
1299
                    }
1300
                    String name = authUser.getFirstName() + " " + authUser.getLastName();
1301
                    if (position.getEscalationType().equals(EscalationType.L1) || position.getEscalationType().equals(EscalationType.L1)) {
1302
                        saleRoles.getL1().add(name);
1303
                    }
1304
                    /*else if (position.getEscalationType().equals(EscalationType.L2)) {
1305
                        saleRoles.getL2().add(name);
1306
                    }*/
1307
                }
1308
            }
24692 amit.gupta 1309
 
31697 amit.gupta 1310
        }
25418 amit.gupta 1311
 
31697 amit.gupta 1312
        Set<CustomRetailer> allCrList = new HashSet<>();
1313
        for (List<CustomRetailer> cr : positionIdRetailerMap.values()) {
1314
            allCrList.addAll(cr);
1315
        }
25609 amit.gupta 1316
 
31886 tejbeer 1317
        Map<Integer, FofoStore> fofoStoresMap = fofoStoreRepository.selectActiveStores().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
25503 amit.gupta 1318
 
31697 amit.gupta 1319
        Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = new HashMap<>();
25503 amit.gupta 1320
 
31697 amit.gupta 1321
        for (CustomRetailer cr : allCrList) {
1322
            FofoStore fofoStore = fofoStoresMap.get(cr.getPartnerId());
1323
            if (fofoStore == null) {
1324
                LOGGER.info("Could not find Store {} in active Store", cr.getBusinessName());
1325
                continue;
1326
            }
1327
            String code = fofoStore.getCode();
1328
            // String storeName = "SmartDukaan-" +
1329
            // fofoStore.getCode().replaceAll("[a-zA-Z]", "");
1330
            String businessName = cr.getBusinessName();
1331
            try {
1332
                String stateManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL2(), ", ");
1333
                String territoryManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL1(), ", ");
1334
                String bdm = StringUtils.join(partnerEmailRBMMap.get(cr.getEmail()).getL1(), ", ");
1335
                FofoReportingModel reportingModel = new FofoReportingModel();
1336
                reportingModel.setBusinessName(businessName);
1337
                reportingModel.setCode(code);
1338
                reportingModel.setFofoId(fofoStore.getId());
1339
                reportingModel.setRegionalManager(stateManager);
1340
                reportingModel.setTerritoryManager(territoryManager);
1341
                reportingModel.setBusinessManager(bdm);
1342
                partnerIdSalesHeadersMap.put(fofoStore.getId(), reportingModel);
1343
            } catch (Exception e) {
1344
                LOGGER.warn("Could not find partner with email - {}", cr.getEmail());
1345
            }
1346
        }
1347
        return partnerIdSalesHeadersMap;
24533 govind 1348
 
31697 amit.gupta 1349
    }
28709 amit.gupta 1350
 
31697 amit.gupta 1351
    public void sendPartnerInvestmentDetails() throws Exception {
1352
        this.sendPartnerInvestmentDetails(null);
1353
    }
28709 amit.gupta 1354
 
31697 amit.gupta 1355
    public void sendAgeingReport(String... sendTo) throws Exception {
28790 amit.gupta 1356
 
31886 tejbeer 1357
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.WAREHOUSENEW, "itemstockageing.xml");
1358
        InputStreamSource isr1 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "ItemwiseOverallPendingIndent.xml");
31697 amit.gupta 1359
        Attachment attachment = new Attachment(
1360
                "ageing-report-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr);
1361
        Attachment attachment1 = new Attachment(
1362
                "pending-indent-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr1);
28790 amit.gupta 1363
 
31886 tejbeer 1364
        Utils.sendMailWithAttachments(googleMailSender, STOCK_AGEING_MAIL_LIST, null, "Stock Ageing Report", "PFA", attachment);
1365
        Utils.sendMailWithAttachments(googleMailSender, ITEMWISE_PENDING_INDENT_MAIL_LIST, null, "Itemwise Pending indent", "PFA", attachment1);
28790 amit.gupta 1366
 
31697 amit.gupta 1367
        // Reports to be sent to mapped partners
1368
        Map<String, Set<String>> storeGuysMap = csService.getAuthUserPartnerEmailMapping();
28790 amit.gupta 1369
 
31697 amit.gupta 1370
        for (Map.Entry<String, Set<String>> storeGuyEntry : storeGuysMap.entrySet()) {
1371
            Map<String, String> params = new HashMap<>();
1372
            if (storeGuyEntry.getValue().size() == 0)
1373
                continue;
1374
            params.put("MANUAL_email", String.join(",", storeGuyEntry.getValue()));
31886 tejbeer 1375
            InputStreamSource isr3 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "focostockreport.xml", params);
31697 amit.gupta 1376
            Attachment attache = new Attachment(
1377
                    "Franchise-stock-report" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr3);
1378
            System.out.println(storeGuyEntry.getValue());
31886 tejbeer 1379
            Utils.sendMailWithAttachments(googleMailSender, new String[]{storeGuyEntry.getKey()}, null, "Franchise Stock Report", "PFA", attache);
31697 amit.gupta 1380
        }
28839 tejbeer 1381
 
31697 amit.gupta 1382
    }
28839 tejbeer 1383
 
31697 amit.gupta 1384
    public void sendIndentTertiary() throws Exception {
28790 amit.gupta 1385
 
31886 tejbeer 1386
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "indentandtertiary.xml");
31697 amit.gupta 1387
        Attachment attachment = new Attachment(
1388
                "indentandtertiary-report-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr);
31886 tejbeer 1389
        Utils.sendMailWithAttachments(googleMailSender, INDENT_TERTIARY_MAIL_LIST, null, "Indent Tertiary Report", "PFA", attachment);
28790 amit.gupta 1390
 
31697 amit.gupta 1391
    }
28790 amit.gupta 1392
 
31697 amit.gupta 1393
    public void sendAttendanceMorningAlert() throws Exception {
1394
        LocalDateTime moriningTime = LocalDate.now().atTime(10, 31);
1395
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
31886 tejbeer 1396
        Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28775 amit.gupta 1397
 
31697 amit.gupta 1398
        List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
1399
        Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28790 amit.gupta 1400
 
31886 tejbeer 1401
        List<EmployeeAttendance> employeeAttendances = employeeAttendanceRepository.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now());
28784 amit.gupta 1402
 
31886 tejbeer 1403
        Map<Integer, Optional<EmployeeAttendance>> employeeMorningAttendance = employeeAttendances.stream().collect(groupingBy(EmployeeAttendance::getUserId, Collectors.minBy(Comparator.comparing(EmployeeAttendance::getCreateTimestamp))));
31697 amit.gupta 1404
        for (AuthUser authUser : authUsers) {
1405
            User user = userMap.get(authUser.getEmailId());
1406
            Optional<EmployeeAttendance> employeeAttendanceOptional = employeeMorningAttendance.get(user.getId());
1407
            LOGGER.info("AuthUser - {}, employeeAttendanceOptional {}", authUser.getName(), employeeAttendanceOptional);
1408
            if (employeeAttendanceOptional != null) {
1409
                LOGGER.info("employeeAttendanceOptional.orElse {}", employeeAttendanceOptional.orElse(null));
1410
                if (employeeAttendanceOptional.orElse(null) != null) {
31886 tejbeer 1411
                    LOGGER.info("employeeAttendanceOptional.get().getCreateTimestamp() {}", employeeAttendanceOptional.get().getCreateTimestamp());
31697 amit.gupta 1412
                }
1413
            }
31886 tejbeer 1414
            if (employeeAttendanceOptional == null || employeeAttendanceOptional.orElse(null) == null || employeeAttendanceOptional.get().getCreateTimestamp().isAfter(moriningTime)) {
31697 amit.gupta 1415
                LOGGER.info("Will Send Email to {}", authUser.getFullName());
1416
                String body = String.format(
31886 tejbeer 1417
                        "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 1418
 
31886 tejbeer 1419
                Utils.sendMailWithAttachments(googleMailSender, new String[]{authUser.getEmailId()}, new String[]{"kangan.monga@smartdukaan.com"}, "Attendance Alert", body);
28790 amit.gupta 1420
 
31697 amit.gupta 1421
            }
1422
        }
28790 amit.gupta 1423
 
31697 amit.gupta 1424
    }
28790 amit.gupta 1425
 
31697 amit.gupta 1426
    public void sendAttendanceEveningAlert() throws Exception {
1427
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
31886 tejbeer 1428
        Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28709 amit.gupta 1429
 
31697 amit.gupta 1430
        List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
1431
        Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28709 amit.gupta 1432
 
31886 tejbeer 1433
        Map<Integer, List<EmployeeAttendance>> employeeAttendancesMap = employeeAttendanceRepository.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now()).stream().collect(groupingBy(x -> x.getUserId()));
28709 amit.gupta 1434
 
31697 amit.gupta 1435
        for (AuthUser authUser : authUsers) {
1436
            User user = userMap.get(authUser.getEmailId());
1437
            String body = null;
1438
            List<EmployeeAttendance> employeeAttendances = employeeAttendancesMap.get(user.getId());
1439
            if (employeeAttendances == null) {
1440
                body = String.format(
31886 tejbeer 1441
                        "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 1442
            } else {
31886 tejbeer 1443
                List<LocalDateTime> punchTimes = employeeAttendances.stream().sorted(Comparator.comparing(EmployeeAttendance::getCreateTimestamp)).map(x -> x.getCreateTimestamp()).collect(Collectors.toList());
31697 amit.gupta 1444
                if (punchTimes.size() == 1) {
1445
                    // body = String.format("Dear %s,\n Pls note that you haven't punched out yet.
1446
                    // You have been marked absent for half the day. You may contact your manager
1447
                    // and get it regularise.\n\nRegards\nHR Team", authUser.getFullName());
1448
                } else {
1449
                    LocalDateTime firstPunch = punchTimes.get(0);
1450
                    LocalDateTime lastPunch = punchTimes.get(punchTimes.size() - 1);
1451
                    Duration duration = Duration.between(firstPunch, lastPunch);
1452
                    boolean hoursCompleted = lastPunch.isAfter(firstPunch.plusHours(8).plusMinutes(30));
1453
                    if (!hoursCompleted) {
1454
                        body = String.format(
31886 tejbeer 1455
                                "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 1456
                    }
1457
                }
28709 amit.gupta 1458
 
31697 amit.gupta 1459
            }
1460
            if (body != null) {
31886 tejbeer 1461
                Utils.sendMailWithAttachments(googleMailSender, new String[]{authUser.getEmailId()}, new String[]{"kangan.monga@smartdukaan.com"}, "Attendance Alert", body);
31697 amit.gupta 1462
            }
1463
        }
28709 amit.gupta 1464
 
31697 amit.gupta 1465
        this.sendMailToHR();
28709 amit.gupta 1466
 
31697 amit.gupta 1467
    }
28709 amit.gupta 1468
 
31697 amit.gupta 1469
    private void sendMailToHR() throws Exception {
1470
        Map<String, String> map = new HashMap<>();
1471
        String reporticoDate = FormattingUtils.formatReporitcoDate(LocalDateTime.now());
1472
        map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
1473
        map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
31886 tejbeer 1474
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "employeeattendance.xml");
1475
        Attachment attachment = new Attachment("attendance-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr);
1476
        Utils.sendMailWithAttachments(googleMailSender, EMPLOYEE_ATTENDANCE_MAIL_LIST, null, "Attendance - " + FormattingUtils.formatDate(LocalDateTime.now()), "PFA Attendance", attachment);
31697 amit.gupta 1477
    }
28709 amit.gupta 1478
 
31697 amit.gupta 1479
    public void checkPartnerActiveStore() throws Exception {
24697 amit.gupta 1480
 
31697 amit.gupta 1481
        List<FofoStore> fofoStores = fofoStoreRepository.selectByStatus(true);
23929 amit.gupta 1482
 
31697 amit.gupta 1483
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
1484
        if (!fofoStores.isEmpty()) {
1485
            for (FofoStore fofoStore : fofoStores) {
24551 amit.gupta 1486
 
31697 amit.gupta 1487
                if (currentDate.isBefore(fofoStore.getActiveTimeStamp())) {
24542 amit.gupta 1488
 
31697 amit.gupta 1489
                    fofoStore.setActive(true);
1490
                    fofoStoreRepository.persist(fofoStore);
1491
                    LOGGER.info("inserted into InActiveFofoStore successfully");
29160 amit.gupta 1492
 
31697 amit.gupta 1493
                } else {
1494
                    fofoStore.setActive(false);
1495
                    fofoStore.setActiveTimeStamp(null);
1496
                    fofoStoreRepository.persist(fofoStore);
1497
                    LOGGER.info("inserted into InActiveFofoStore successfully");
1498
                }
24542 amit.gupta 1499
 
31697 amit.gupta 1500
            }
1501
        }
24542 amit.gupta 1502
 
31697 amit.gupta 1503
    }
24548 amit.gupta 1504
 
31697 amit.gupta 1505
    public void sendAgeingReport() throws Exception {
31886 tejbeer 1506
        sendAgeingReport("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com", "niranjan.kala@smartdukaan.com", "manish.gupta@smartdukaan.com", "kuldeep.kumar@smartdukaan.com");
31697 amit.gupta 1507
    }
24542 amit.gupta 1508
 
31697 amit.gupta 1509
    public void moveImeisToPriceDropImeis() throws Exception {
1510
        List<PriceDrop> priceDrops = priceDropRepository.selectAll();
1511
        for (PriceDrop priceDrop : priceDrops) {
1512
            priceDropService.priceDropStatus(priceDrop.getId());
1513
        }
1514
    }
29160 amit.gupta 1515
 
31697 amit.gupta 1516
    public void walletmismatch() throws Exception {
1517
        LocalDate curDate = LocalDate.now();
1518
        List<PartnerDailyInvestment> pdis = partnerDailyInvestmentRepository.selectAll(curDate.minusDays(2));
1519
        System.out.println(pdis.size());
1520
        for (PartnerDailyInvestment pdi : pdis) {
1521
            int fofoId = pdi.getFofoId();
31886 tejbeer 1522
            for (PartnerDailyInvestment investment : Lists.reverse(partnerDailyInvestmentRepository.selectAll(fofoId, null, null))) {
1523
                float statementAmount = walletService.getOpeningTill(fofoId, investment.getDate().plusDays(1).atTime(LocalTime.of(4, 0)));
31697 amit.gupta 1524
                CustomRetailer retailer = retailerService.getFofoRetailer(fofoId);
31886 tejbeer 1525
                LOGGER.info("{}\t{}\t{}\t{}\t{}", fofoId, retailer.getBusinessName(), retailer.getMobileNumber(), investment.getDate().toString(), investment.getWalletAmount(), statementAmount);
29160 amit.gupta 1526
 
31697 amit.gupta 1527
            }
1528
        }
29160 amit.gupta 1529
 
31697 amit.gupta 1530
    }
29160 amit.gupta 1531
 
31697 amit.gupta 1532
    @Autowired
1533
    StateRepository stateRepository;
29160 amit.gupta 1534
 
31697 amit.gupta 1535
    public void gst() throws Exception {
31886 tejbeer 1536
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.of(2021, 8, 16).atStartOfDay(), LocalDateTime.now());
31697 amit.gupta 1537
        for (FofoOrder fofoOrder : fofoOrders) {
31886 tejbeer 1538
            int retailerAddressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoOrder.getFofoId());
24548 amit.gupta 1539
 
31697 amit.gupta 1540
            Address retailerAddress = addressRepository.selectById(retailerAddressId);
1541
            CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
1542
            Integer stateId = null;
1543
            if (customerAddress.getState().equals(retailerAddress.getState())) {
1544
                try {
1545
                    stateId = stateRepository.selectByName(customerAddress.getState()).getId();
1546
                } catch (Exception e) {
1547
                    LOGGER.error("Cannot found state named {}", customerAddress.getState());
1548
                    continue;
1549
                }
1550
            }
1551
            Map<Integer, GstRate> itemIdStateTaxRateMap = null;
24542 amit.gupta 1552
 
31697 amit.gupta 1553
            List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1554
            List<Integer> itemIds = fofoOrderItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
1555
            if (stateId != null) {
1556
                itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(itemIds, stateId);
1557
            } else {
32145 tejbeer 1558
                itemIdStateTaxRateMap = stateGstRateRepository.getIgstTaxRate(itemIds);
31697 amit.gupta 1559
            }
24580 amit.gupta 1560
 
31697 amit.gupta 1561
            for (FofoOrderItem foi : fofoOrderItems) {
1562
                float sgstRate = foi.getSgstRate();
1563
                float cgstRate = foi.getCgstRate();
1564
                float igstRate = foi.getIgstRate();
32145 tejbeer 1565
                foi.setCgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate());
1566
                foi.setSgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
1567
                foi.setIgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getIgstRate());
24587 amit.gupta 1568
 
32145 tejbeer 1569
                LOGGER.info("Invoice {}, Date {}", fofoOrder.getInvoiceNumber(), fofoOrder.getCreateTimestamp());
1570
                LOGGER.info("customerAddress.getState() {}, retailerAddress.getState() {}", customerAddress.getState(), retailerAddress.getState());
1571
                LOGGER.info("Rates getIgstRate() {}", itemIdStateTaxRateMap.get(foi.getItemId()).getIgstRate());
1572
                LOGGER.info("Rates getCgstRate() {}, getSgstRate() {}", itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate(), itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
24587 amit.gupta 1573
 
1574
 
31697 amit.gupta 1575
            }
1576
        }
26092 amit.gupta 1577
 
31697 amit.gupta 1578
    }
24590 amit.gupta 1579
 
31697 amit.gupta 1580
    public void schemewalletmismatch() {
1581
        LocalDate dateToReconcile = LocalDate.of(2018, 4, 1);
1582
        while (dateToReconcile.isBefore(LocalDate.now())) {
1583
            reconcileSchemes(dateToReconcile);
1584
            // reconcileOrders(dateTime);
1585
            // reconcileRecharges(dateTime);
1586
            dateToReconcile = dateToReconcile.plusDays(1);
1587
        }
1588
    }
24587 amit.gupta 1589
 
31697 amit.gupta 1590
    private void reconcileSchemes(LocalDate date) {
1591
        LocalDateTime startDate = date.atStartOfDay();
1592
        LocalDateTime endDate = startDate.plusDays(1);
1593
        List<SchemeInOut> siosCreated = schemeInOutRepository.selectAllByCreateDate(startDate, endDate);
1594
        List<SchemeInOut> siosRefunded = schemeInOutRepository.selectAllByRefundDate(startDate, endDate);
1595
        double totalSchemeDisbursed = siosCreated.stream().mapToDouble(x -> x.getAmount()).sum();
1596
        double totalSchemeRolledback = siosRefunded.stream().mapToDouble(x -> x.getAmount()).sum();
1597
        double netSchemeDisbursed = totalSchemeDisbursed - totalSchemeRolledback;
31886 tejbeer 1598
        List<WalletReferenceType> walletReferenceTypes = Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT);
1599
        List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByDateType(startDate, endDate, walletReferenceTypes);
31697 amit.gupta 1600
        double schemeAmountWalletTotal = history.stream().mapToDouble(x -> x.getAmount()).sum();
1601
        if (Math.abs(netSchemeDisbursed - schemeAmountWalletTotal) > 10d) {
1602
            LOGGER.info("Scheme Amount mismatched for Date {}", date);
24590 amit.gupta 1603
 
31724 amit.gupta 1604
            Map<Integer, Double> inventoryItemSchemeIO = siosCreated.stream().collect(groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
24635 amit.gupta 1605
 
31886 tejbeer 1606
            Map<Integer, Double> userSchemeMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIO.keySet()).stream().collect(groupingBy(x -> x.getFofoId(), Collectors.summingDouble(x -> inventoryItemSchemeIO.get(x.getId()))));
24635 amit.gupta 1607
 
31724 amit.gupta 1608
            Map<Integer, Double> inventoryItemSchemeIORefunded = siosRefunded.stream().collect(groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
24635 amit.gupta 1609
 
31886 tejbeer 1610
            Map<Integer, Double> userSchemeRefundedMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIORefunded.keySet()).stream().collect(groupingBy(x -> x.getFofoId(), Collectors.summingDouble(x -> inventoryItemSchemeIORefunded.get(x.getId()))));
24635 amit.gupta 1611
 
31697 amit.gupta 1612
            Map<Integer, Double> finalUserSchemeAmountMap = new HashMap<>();
24635 amit.gupta 1613
 
31697 amit.gupta 1614
            for (Map.Entry<Integer, Double> schemeAmount : userSchemeRefundedMap.entrySet()) {
1615
                if (!finalUserSchemeAmountMap.containsKey(schemeAmount.getKey())) {
1616
                    finalUserSchemeAmountMap.put(schemeAmount.getKey(), schemeAmount.getValue());
1617
                } else {
31886 tejbeer 1618
                    finalUserSchemeAmountMap.put(schemeAmount.getKey(), finalUserSchemeAmountMap.get(schemeAmount.getKey()) + schemeAmount.getValue());
31697 amit.gupta 1619
                }
1620
            }
31886 tejbeer 1621
            Map<Integer, Integer> userWalletMap = userWalletRepository.selectByRetailerIds(finalUserSchemeAmountMap.keySet()).stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24635 amit.gupta 1622
 
31724 amit.gupta 1623
            Map<Integer, Double> walletAmountMap = history.stream().collect(groupingBy(
31697 amit.gupta 1624
                    UserWalletHistory::getWalletId, Collectors.summingDouble((UserWalletHistory::getAmount))));
1625
            for (Map.Entry<Integer, Double> userAmount : walletAmountMap.entrySet()) {
1626
                double diff = Math.abs(finalUserSchemeAmountMap.get(userAmount.getKey()) - userAmount.getValue());
1627
                if (diff > 5) {
1628
                    LOGGER.info("Partner scheme mismatched for Userid {}", userWalletMap.get(userAmount.getKey()));
1629
                }
1630
            }
1631
        }
24635 amit.gupta 1632
 
31697 amit.gupta 1633
    }
24635 amit.gupta 1634
 
31697 amit.gupta 1635
    public void dryRunSchemeReco() throws Exception {
31886 tejbeer 1636
        Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24635 amit.gupta 1637
 
31697 amit.gupta 1638
        List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1639
        List<SchemeInOut> rolledbackSios = new ArrayList<>();
31886 tejbeer 1640
        Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream().collect(Collectors.toMap(Scheme::getId, Scheme::getType));
31697 amit.gupta 1641
        Set<String> serialNumbersConsidered = new HashSet<>();
24631 amit.gupta 1642
 
31697 amit.gupta 1643
        LocalDateTime startDate = LocalDate.of(2018, 3, 1).atStartOfDay();
1644
        LocalDateTime endDate = LocalDate.now().atStartOfDay();
1645
        List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
24598 amit.gupta 1646
 
31697 amit.gupta 1647
        Map<Integer, String> storeNameMap = fofoStoreRepository.getStoresMap();
1648
        purchases.stream().forEach(purchase -> {
1649
            float amountToRollback = 0;
31886 tejbeer 1650
            String description = "Adjustment of Duplicate Scheme for Purchase Invoice " + purchase.getPurchaseReference();
1651
            Map<Integer, String> inventorySerialNumberMap = inventoryItemRepository.selectByPurchaseId(purchase.getId()).stream().filter(ii -> ii.getSerialNumber() != null).collect(Collectors.toMap(InventoryItem::getId, InventoryItem::getSerialNumber));
31697 amit.gupta 1652
            if (inventorySerialNumberMap.size() > 0) {
1653
                for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1654
                    String serialNumber = inventorySerialNumberEntry.getValue();
1655
                    int inventoryItemId = inventorySerialNumberEntry.getKey();
1656
                    if (serialNumbersConsidered.contains(serialNumber)) {
1657
                        // This will rollback scheme for differenct orders for same serial
31886 tejbeer 1658
                        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 1659
                        Collections.reverse(sios);
1660
                        for (SchemeInOut sio : sios) {
1661
                            sio.setRolledBackTimestamp(LocalDateTime.now());
1662
                            amountToRollback += sio.getAmount();
1663
                            // sio.setSchemeType(SchemeType.OUT);
1664
                            sio.setSerialNumber(serialNumber);
1665
                            rolledbackSios.add(sio);
1666
                        }
1667
                        description = description.concat(" " + serialNumber + " ");
1668
                    } else {
1669
                        serialNumbersConsidered.add(serialNumber);
1670
                        List<Integer> schemesConsidered = new ArrayList<>();
31886 tejbeer 1671
                        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 1672
                        Collections.reverse(sios);
1673
                        for (SchemeInOut sio : sios) {
1674
                            if (!schemesConsidered.contains(sio.getSchemeId())) {
1675
                                schemesConsidered.add(sio.getSchemeId());
1676
                                continue;
1677
                            }
1678
                            sio.setRolledBackTimestamp(LocalDateTime.now());
1679
                            amountToRollback += sio.getAmount();
1680
                            // sio.setSchemeType(SchemeType.OUT);
1681
                            sio.setSerialNumber(serialNumber);
1682
                            sio.setStoreCode(storeNameMap.get(purchase.getFofoId()));
1683
                            sio.setReference(purchase.getId());
1684
                            rolledbackSios.add(sio);
1685
                        }
1686
                    }
24592 amit.gupta 1687
 
31697 amit.gupta 1688
                }
1689
            }
1690
            if (amountToRollback > 0) {
1691
                // Address address =
1692
                // addressRepository.selectAllByRetailerId(purchase.getFofoId(), 0, 10).get(0);
1693
                UserWalletHistory uwh = new UserWalletHistory();
1694
                uwh.setAmount(Math.round(amountToRollback));
1695
                uwh.setDescription(description);
1696
                uwh.setTimestamp(LocalDateTime.now());
1697
                uwh.setReferenceType(WalletReferenceType.SCHEME_IN);
1698
                uwh.setReference(purchase.getId());
1699
                uwh.setWalletId(userWalletMap.get(purchase.getFofoId()));
1700
                uwh.setFofoId(purchase.getFofoId());
1701
                uwh.setStoreCode(storeNameMap.get(purchase.getFofoId()));
1702
                userWalletHistory.add(uwh);
1703
            }
1704
        });
1705
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
31886 tejbeer 1706
                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 1707
 
31697 amit.gupta 1708
        ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
31886 tejbeer 1709
                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 1710
 
31886 tejbeer 1711
        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 1712
 
31697 amit.gupta 1713
        throw new Exception();
24615 amit.gupta 1714
 
31697 amit.gupta 1715
    }
24615 amit.gupta 1716
 
31697 amit.gupta 1717
    public void dryRunOutSchemeReco() throws Exception {
1718
        List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1719
        List<SchemeInOut> rolledbackSios = new ArrayList<>();
31886 tejbeer 1720
        Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1721
        Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream().collect(Collectors.toMap(Scheme::getId, Scheme::getType));
31697 amit.gupta 1722
        LocalDateTime startDate = LocalDate.of(2019, 5, 1).atStartOfDay();
1723
        LocalDateTime endDate = LocalDate.now().atStartOfDay();
1724
        List<FofoOrder> allOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
1725
        // Collections.reverse(allOrders);
1726
        // List<FofoOrder> allOrders =
1727
        // List<FofoOrder> allOrders =
1728
        // Arrays.asList(fofoOrderRepository.selectByInvoiceNumber("UPGZ019/25"));
1729
        Set<String> serialNumbersConsidered = new HashSet<>();
1730
        allOrders.stream().forEach(fofoOrder -> {
1731
            String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
1732
            Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
1733
            float amountToRollback = 0;
1734
            List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1735
            orderItems.forEach(x -> {
31886 tejbeer 1736
                inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null).collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
31697 amit.gupta 1737
            });
1738
            if (inventorySerialNumberMap.size() > 0) {
1739
                for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1740
                    String serialNumber = inventorySerialNumberEntry.getValue();
1741
                    int inventoryItemId = inventorySerialNumberEntry.getKey();
1742
                    if (serialNumbersConsidered.contains(serialNumber)) {
1743
                        // This will rollback scheme for differenct orders for same serial
31886 tejbeer 1744
                        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 1745
                        Collections.reverse(sios);
1746
                        for (SchemeInOut sio : sios) {
1747
                            sio.setRolledBackTimestamp(LocalDateTime.now());
1748
                            amountToRollback += sio.getAmount();
1749
                            // sio.setSchemeType(SchemeType.OUT);
1750
                            sio.setSerialNumber(serialNumber);
1751
                            sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1752
                            sio.setReference(fofoOrder.getId());
1753
                            rolledbackSios.add(sio);
1754
                        }
1755
                        description = description.concat(" " + serialNumber + " ");
1756
                    } else {
1757
                        serialNumbersConsidered.add(serialNumber);
1758
                        List<Integer> schemesConsidered = new ArrayList<>();
31886 tejbeer 1759
                        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 1760
                        Collections.reverse(sios);
1761
                        for (SchemeInOut sio : sios) {
1762
                            if (!schemesConsidered.contains(sio.getSchemeId())) {
1763
                                schemesConsidered.add(sio.getSchemeId());
1764
                                continue;
1765
                            }
1766
                            sio.setRolledBackTimestamp(LocalDateTime.now());
1767
                            amountToRollback += sio.getAmount();
1768
                            // sio.setSchemeType(SchemeType.OUT);
1769
                            sio.setReference(fofoOrder.getId());
1770
                            sio.setSerialNumber(serialNumber);
1771
                            sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1772
                            rolledbackSios.add(sio);
1773
                        }
1774
                    }
24615 amit.gupta 1775
 
31697 amit.gupta 1776
                }
1777
            }
1778
            if (amountToRollback > 0) {
1779
                UserWalletHistory uwh = new UserWalletHistory();
1780
                uwh.setAmount(Math.round(amountToRollback));
1781
                uwh.setDescription(description);
1782
                uwh.setTimestamp(LocalDateTime.now());
1783
                uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1784
                uwh.setReference(fofoOrder.getId());
1785
                uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1786
                uwh.setFofoId(fofoOrder.getFofoId());
1787
                uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1788
                userWalletHistory.add(uwh);
1789
            }
1790
        });
24615 amit.gupta 1791
 
31697 amit.gupta 1792
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
31886 tejbeer 1793
                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 1794
 
31697 amit.gupta 1795
        ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
31886 tejbeer 1796
                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 1797
 
31886 tejbeer 1798
        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 1799
 
31697 amit.gupta 1800
        throw new Exception();
1801
    }
24615 amit.gupta 1802
 
31697 amit.gupta 1803
    public void dryRunSchemeOutReco1() throws Exception {
1804
        List<Integer> references = Arrays.asList(6744, 7347, 8320, 8891, 9124, 9217, 9263, 9379);
1805
        List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1806
        List<SchemeInOut> rolledbackSios = new ArrayList<>();
31886 tejbeer 1807
        Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1808
        Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream().collect(Collectors.toMap(Scheme::getId, Scheme::getType));
31697 amit.gupta 1809
        references.stream().forEach(reference -> {
1810
            FofoOrder fofoOrder = null;
1811
            try {
1812
                fofoOrder = fofoOrderRepository.selectByOrderId(reference);
1813
            } catch (Exception e) {
25927 amit.gupta 1814
 
31697 amit.gupta 1815
            }
1816
            String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
1817
            Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
1818
            float amountToRollback = 0;
1819
            List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1820
            orderItems.forEach(x -> {
31886 tejbeer 1821
                inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null).collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
31697 amit.gupta 1822
            });
1823
            if (inventorySerialNumberMap.size() > 0) {
31886 tejbeer 1824
                List<SchemeInOut> sios = schemeInOutRepository.selectByInventoryItemIds(inventorySerialNumberMap.keySet()).stream().filter(x -> schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT)).collect(Collectors.toList());
31697 amit.gupta 1825
                LOGGER.info("Found {} duplicate schemeouts for Orderid {}", sios.size(), fofoOrder.getId());
1826
                UserWalletHistory uwh = new UserWalletHistory();
31886 tejbeer 1827
                Map<Integer, List<SchemeInOut>> inventoryIdSouts = sios.stream().collect(groupingBy(SchemeInOut::getInventoryItemId, Collectors.toList()));
31697 amit.gupta 1828
                for (Map.Entry<Integer, List<SchemeInOut>> inventorySioEntry : inventoryIdSouts.entrySet()) {
1829
                    List<SchemeInOut> outList = inventorySioEntry.getValue();
1830
                    if (outList.size() > 1) {
24683 amit.gupta 1831
 
31697 amit.gupta 1832
                    }
1833
                }
1834
                uwh.setAmount(Math.round(amountToRollback));
1835
                uwh.setDescription(description);
1836
                uwh.setTimestamp(LocalDateTime.now());
1837
                uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1838
                uwh.setReference(fofoOrder.getId());
1839
                uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1840
                uwh.setFofoId(fofoOrder.getFofoId());
1841
                uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1842
                userWalletHistory.add(uwh);
1843
            }
1844
        });
26945 amit.gupta 1845
 
31697 amit.gupta 1846
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
31886 tejbeer 1847
                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 1848
 
31697 amit.gupta 1849
        ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
31886 tejbeer 1850
                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 1851
 
31886 tejbeer 1852
        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 1853
 
31697 amit.gupta 1854
        throw new Exception();
25880 amit.gupta 1855
 
31697 amit.gupta 1856
    }
30982 tejbeer 1857
 
31697 amit.gupta 1858
    public void sendDailySalesNotificationToPartner(Integer fofoIdInt) throws Exception {
30982 tejbeer 1859
 
31697 amit.gupta 1860
        LocalDateTime now = LocalDateTime.now();
1861
        LocalDateTime from = now.with(LocalTime.MIN);
1862
        String timeString = "Today %s";
1863
        // Send yesterday's report
1864
        /*
1865
         * if (now.getHour() < 13) { timeString = "Yesterday %s"; from =
1866
         * now.minusDays(1).; now = from.with(LocalTime.MAX);
1867
         *
1868
         * }
1869
         */
30982 tejbeer 1870
 
31697 amit.gupta 1871
        List<Integer> fofoIds = null;
31886 tejbeer 1872
        Map<Integer, FofoStore> fofoStoreMap = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getId(), x -> x));
30982 tejbeer 1873
 
24653 govind 1874
 
31697 amit.gupta 1875
        if (fofoIdInt == null) {
1876
            fofoIds = new ArrayList<>(fofoStoreMap.keySet());
1877
        } else {
1878
            fofoIds = Arrays.asList(fofoIdInt);
1879
        }
1880
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
28368 tejbeer 1881
 
31886 tejbeer 1882
        Map<Integer, Float> partnerPolicyAmountMap = insurancePolicyRepository.selectAmountSumGroupByRetailerId(now, null);
31697 amit.gupta 1883
        Map<Integer, Long> partnerPolicyQtyMap = insurancePolicyRepository.selectQtyGroupByRetailerId(now, null);
28368 tejbeer 1884
 
31886 tejbeer 1885
        Map<Integer, Double> spPartnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0, true);
28377 tejbeer 1886
 
31886 tejbeer 1887
        Map<Integer, Double> spPartner3DaysOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from.minusDays(3), now, 0, true);
31697 amit.gupta 1888
        Map<Integer, Long> spPartnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, true);
28368 tejbeer 1889
 
31886 tejbeer 1890
        Map<Integer, Double> partnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0, false);
31697 amit.gupta 1891
        Map<Integer, Long> partnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, false);
28377 tejbeer 1892
 
31697 amit.gupta 1893
        //4 days + current day running
1894
        Map<Integer, Double> partnerBilledValueMap = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(from.minusDays(4), now);
28377 tejbeer 1895
 
31697 amit.gupta 1896
        Map<Integer, SaleTargetReportModel> saleTargetReportModelMap = new HashMap<>();
1897
        for (int fofoId : fofoIds) {
1898
            SaleTargetReportModel model = new SaleTargetReportModel();
1899
            model.setInsuranceSale(
1900
                    partnerPolicyAmountMap.containsKey(fofoId) ? partnerPolicyAmountMap.get(fofoId).doubleValue() : 0);
1901
            model.setInsruanceQty(partnerPolicyQtyMap.containsKey(fofoId) ? partnerPolicyQtyMap.get(fofoId) : 0);
1902
            model.setSecondary(partnerBilledValueMap.containsKey(fofoId) ? partnerBilledValueMap.get(fofoId) : 0);
1903
            model.setSmartphoneSale(spPartnerOrderValMap.containsKey(fofoId) ? spPartnerOrderValMap.get(fofoId) : 0);
1904
            model.setSmartphoneQty(spPartnerOrderQtyMap.containsKey(fofoId) ? spPartnerOrderQtyMap.get(fofoId) : 0);
1905
            model.setTotalSale(partnerOrderValMap.containsKey(fofoId) ? partnerOrderValMap.get(fofoId) : 0);
1906
            model.setTotalQty(partnerOrderQtyMap.containsKey(fofoId) ? partnerOrderQtyMap.get(fofoId) : 0);
1907
            model.setPast3daysSale(
1908
                    spPartner3DaysOrderValMap.containsKey(fofoId) ? spPartner3DaysOrderValMap.get(fofoId) : 0);
1909
            model.setFofoId(fofoId);
1910
            model.setCode(fofoStoreMap.get(fofoId).getCode());
31724 amit.gupta 1911
            model.setActivationType(fofoStoreMap.get(fofoId).getActivationType());
31697 amit.gupta 1912
            saleTargetReportModelMap.put(fofoId, model);
1913
        }
28377 tejbeer 1914
 
31697 amit.gupta 1915
        Map<Integer, FofoReportingModel> partnerSalesHeadersMap = this.getPartnerIdSalesHeaders();
1916
        for (Integer fofoId : fofoIds) {
1917
            SaleTargetReportModel model = saleTargetReportModelMap.get(fofoId);
28368 tejbeer 1918
 
31697 amit.gupta 1919
            // com.spice.profitmandi.dao.entity.user.User user =
1920
            // userUserRepository.selectById(fofoId);
28377 tejbeer 1921
 
31697 amit.gupta 1922
            // Address address = addressRepository.selectById(user.getAddressId());
28377 tejbeer 1923
 
31697 amit.gupta 1924
            String title = "Sale Update";
31886 tejbeer 1925
            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 1926
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
1927
            sendNotificationModel.setCampaignName("Sales update alert");
1928
            sendNotificationModel.setTitle(title);
1929
            sendNotificationModel.setMessage(messageTemplate);
1930
            sendNotificationModel.setType("url");
1931
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
1932
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
1933
            sendNotificationModel.setMessageType(MessageType.notification);
1934
            int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
1935
            sendNotificationModel.setUserIds(Arrays.asList(userId));
1936
            notificationService.sendNotification(sendNotificationModel);
1937
            String whatsappMessageTemplate = String.format(
31886 tejbeer 1938
                    "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 1939
            // notificationService.sendWhatsappMessage(whatsappMessageTemplate, title,
1940
            // address.getPhoneNumber());
28377 tejbeer 1941
 
31697 amit.gupta 1942
        }
1943
        // String saleReport = this.getDailySalesReportHtml(partnerSalesHeadersMap,
1944
        // saleTargetReportModelMap);
1945
        this.getStateWiseSales(saleTargetReportModelMap, partnerSalesHeadersMap);
1946
    }
28377 tejbeer 1947
 
31697 amit.gupta 1948
    public void checkRazorPayPaymentStatus() throws Exception {
31886 tejbeer 1949
        List<PendingOrder> pendingOrder = pendingOrderRepository.selectAllByStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PENDING);
28377 tejbeer 1950
 
31697 amit.gupta 1951
        for (PendingOrder po : pendingOrder) {
1952
            RazorPay razorPay = razorPayRepository.selectByOrdeId(po.getId());
1953
            List<PendingOrderItem> poItems = pendingOrderItemRepository.selectByOrderId(po.getId());
28369 tejbeer 1954
 
31697 amit.gupta 1955
            LOGGER.info("razorPay" + razorPay);
1956
            if (razorPay != null) {
1957
                List<Payment> payments = razorPaymentService.fetchOrderForPayment(razorPay.getRazorOrderId());
28368 tejbeer 1958
 
31697 amit.gupta 1959
                if (!payments.isEmpty()) {
1960
                    List<String> statusList = new ArrayList<>();
1961
                    for (Payment payment : payments) {
25880 amit.gupta 1962
 
31697 amit.gupta 1963
                        JSONObject jsonObj = new JSONObject(payment.toString());
25880 amit.gupta 1964
 
31697 amit.gupta 1965
                        String status = jsonObj.getString("status");
25880 amit.gupta 1966
 
31697 amit.gupta 1967
                        statusList.add(status);
25865 amit.gupta 1968
 
31697 amit.gupta 1969
                    }
1970
                    LOGGER.info("statusList" + statusList);
26941 amit.gupta 1971
 
31697 amit.gupta 1972
                    if (statusList.contains("authorized") || statusList.contains("captured")) {
1973
                        po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
1974
                        po.setPaidAmount(po.getTotalAmount());
1975
                        for (PendingOrderItem poi : poItems) {
1976
                            poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
1977
                        }
1978
                        Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(po);
26941 amit.gupta 1979
 
31697 amit.gupta 1980
                        CustomRetailer customRetailer = retailerService.getFofoRetailer(po.getFofoId());
1981
                        Customer customer = customerRepository.selectById(po.getCustomerId());
1982
                        String[] customerEmail = null;
1983
                        if (customer.getEmailId() != null) {
1984
                            customerEmail = new String[]{customer.getEmailId()};
1985
                        }
31886 tejbeer 1986
                        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 1987
                        List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
1988
                        if (authUserEmails != null) {
1989
                            authUserEmails = new ArrayList<>();
1990
                        }
1991
                        authUserEmails.addAll(bccTo);
26945 amit.gupta 1992
 
31697 amit.gupta 1993
                        // emailService.sendMailWithAttachments("Order Created with SmartDukaan",
1994
                        // "order-confirm.vm",
1995
                        // emailModel, customerEmail, null, authUserEmails.toArray(new String[0]));
26945 amit.gupta 1996
 
31697 amit.gupta 1997
                    } else if (statusList.contains("refunded") || statusList.contains("failed")) {
1998
                        for (PendingOrderItem poi : poItems) {
1999
                            poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
2000
                        }
25865 amit.gupta 2001
 
31697 amit.gupta 2002
                        po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
2003
                    }
25865 amit.gupta 2004
 
31697 amit.gupta 2005
                }
2006
                // LOGGER.info("payment" + payments);
25865 amit.gupta 2007
 
31697 amit.gupta 2008
            }
2009
        }
2010
    }
25865 amit.gupta 2011
 
31697 amit.gupta 2012
    public static class SaleTargetReportModel {
2013
        private double totalSale;
2014
        private long totalQty;
2015
        private double past3daysSale;
2016
        private int fofoId;
2017
        private String code;
31724 amit.gupta 2018
        private ActivationType activationType;
25865 amit.gupta 2019
 
31724 amit.gupta 2020
 
2021
        @Override
2022
        public boolean equals(Object o) {
2023
            if (this == o) return true;
2024
            if (o == null || getClass() != o.getClass()) return false;
2025
            SaleTargetReportModel that = (SaleTargetReportModel) o;
2026
            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;
2027
        }
2028
 
2029
        @Override
2030
        public int hashCode() {
2031
            return Objects.hash(totalSale, totalQty, past3daysSale, fofoId, code, activationType, secondary, smartphoneSale, smartphoneQty, insuranceSale, insruanceQty);
2032
        }
2033
 
2034
        public ActivationType getActivationType() {
2035
            return activationType;
2036
        }
2037
 
2038
        public void setActivationType(ActivationType activationType) {
2039
            this.activationType = activationType;
2040
        }
2041
 
31697 amit.gupta 2042
        public double getSecondary() {
2043
            return secondary;
2044
        }
25865 amit.gupta 2045
 
31697 amit.gupta 2046
        public void setSecondary(double secondary) {
2047
            this.secondary = secondary;
2048
        }
25865 amit.gupta 2049
 
31697 amit.gupta 2050
        private double secondary;
25865 amit.gupta 2051
 
31697 amit.gupta 2052
        public int getFofoId() {
2053
            return fofoId;
2054
        }
25865 amit.gupta 2055
 
31697 amit.gupta 2056
        @Override
2057
        public String toString() {
31886 tejbeer 2058
            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 2059
        }
25865 amit.gupta 2060
 
31697 amit.gupta 2061
        public String getCode() {
2062
            return code;
2063
        }
25865 amit.gupta 2064
 
31697 amit.gupta 2065
        public void setCode(String code) {
2066
            this.code = code;
2067
        }
25865 amit.gupta 2068
 
31697 amit.gupta 2069
        public void setFofoId(int fofoId) {
2070
            this.fofoId = fofoId;
2071
        }
25872 tejbeer 2072
 
31697 amit.gupta 2073
        private double smartphoneSale;
2074
        private long smartphoneQty;
2075
        private double insuranceSale;
2076
        private long insruanceQty;
26945 amit.gupta 2077
 
31697 amit.gupta 2078
        public long getTotalQty() {
2079
            return totalQty;
2080
        }
30765 tejbeer 2081
 
31697 amit.gupta 2082
        public void setTotalQty(long totalQty) {
2083
            this.totalQty = totalQty;
2084
        }
2085
 
2086
        public double getPast3daysSale() {
2087
            return past3daysSale;
2088
        }
2089
 
2090
        public void setPast3daysSale(double past3daysSale) {
2091
            this.past3daysSale = past3daysSale;
2092
        }
2093
 
2094
        public double getTotalSale() {
2095
            return totalSale;
2096
        }
2097
 
2098
        public void setTotalSale(double totalSale) {
2099
            this.totalSale = totalSale;
2100
        }
2101
 
2102
        public double getSmartphoneSale() {
2103
            return smartphoneSale;
2104
        }
2105
 
2106
        public void setSmartphoneSale(double smartphoneSale) {
2107
            this.smartphoneSale = smartphoneSale;
2108
        }
2109
 
2110
        public long getSmartphoneQty() {
2111
            return smartphoneQty;
2112
        }
2113
 
2114
        public void setSmartphoneQty(long smartphoneQty) {
2115
            this.smartphoneQty = smartphoneQty;
2116
        }
2117
 
2118
        public double getInsuranceSale() {
2119
            return insuranceSale;
2120
        }
2121
 
2122
        public void setInsuranceSale(double insuranceSale) {
2123
            this.insuranceSale = insuranceSale;
2124
        }
2125
 
2126
        public long getInsruanceQty() {
2127
            return insruanceQty;
2128
        }
2129
 
2130
        public void setInsruanceQty(long insruanceQty) {
2131
            this.insruanceQty = insruanceQty;
2132
        }
2133
 
2134
    }
2135
 
31886 tejbeer 2136
    private void getStateWiseSales(Map<Integer, SaleTargetReportModel> saleTargetReportModelMap, Map<Integer, FofoReportingModel> partnerSalesHeadersMap) throws Exception {
31697 amit.gupta 2137
        String timeString = "Today %s";
2138
        LocalDateTime now = LocalDateTime.now();
2139
 
2140
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
31886 tejbeer 2141
        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 2142
 
2143
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false);
2144
 
31746 amit.gupta 2145
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
2146
            String email = storeGuyEntry.getKey();
2147
            Set<Integer> fofoIds = storeGuyEntry.getValue();
2148
            LOGGER.info("fofoIds {}", fofoIds);
24683 amit.gupta 2149
 
31746 amit.gupta 2150
            if (!fofoIds.isEmpty()) {
31886 tejbeer 2151
                List<FofoStore> stores = fofoStoreRepository.selectActivePartnersByRetailerIds(new ArrayList<>(fofoIds));
26945 amit.gupta 2152
 
31724 amit.gupta 2153
                Map<String, List<Integer>> stateMap = stores.stream().collect(groupingBy(
2154
                        x -> x.getCode().substring(0, 2), mapping(x -> x.getId(), Collectors.toList())));
31697 amit.gupta 2155
                List<List<Serializable>> stateWiseSales = new ArrayList<>();
2156
                for (Map.Entry<String, List<Integer>> stateMapEntry : stateMap.entrySet()) {
31886 tejbeer 2157
                    long totalQty = stateMapEntry.getValue().stream().collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getTotalQty()));
2158
                    double totalSale = stateMapEntry.getValue().stream().collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getTotalSale()));
2159
                    long smartPhoneQty = stateMapEntry.getValue().stream().collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getSmartphoneQty()));
31697 amit.gupta 2160
                    double smartPhoneSale = stateMapEntry.getValue().stream().collect(
2161
                            Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getSmartphoneSale()));
2162
                    stateWiseSales.add(
2163
                            Arrays.asList(stateMapEntry.getKey(), smartPhoneQty, smartPhoneSale, totalQty, totalSale));
2164
                }
2165
                StringBuilder sb = new StringBuilder();
2166
                sb.append("<html><body>");
2167
                sb.append("<p>Statewise Sale Report:</p><br/><table style=\"border-collapse: collapse;\">");
31886 tejbeer 2168
                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 2169
                for (List<Serializable> stateSale : stateWiseSales) {
2170
                    sb.append("<tr>");
2171
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(0) + "</td>");
2172
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(1) + "</td>");
2173
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(2) + "</td>");
2174
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(3) + "</td>");
2175
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(4) + "</td>");
2176
                    sb.append("</tr>");
2177
                }
2178
                sb.append("</tbody></table><br><br>");
26945 amit.gupta 2179
 
31697 amit.gupta 2180
                sb.append("<p>Partnerwise Report:</p><br/><table style=\"border-collapse: collapse;\">");
31886 tejbeer 2181
                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 2182
 
2183
 
31886 tejbeer 2184
                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 2185
 
31697 amit.gupta 2186
                String subject = String.format("Sale till %s", String.format(timeString, now.format(timeFormatter)));
31169 tejbeer 2187
 
31886 tejbeer 2188
                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 2189
                List<List<?>> rows = new ArrayList<>();
2190
                for (Integer fofoId : sortedSaleTargetReport) {
2191
                    FofoReportingModel fofoReportingModel = partnerSalesHeadersMap.get(fofoId);
31886 tejbeer 2192
                    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 2193
                    ));
31169 tejbeer 2194
 
31724 amit.gupta 2195
                    //Now try to populate html rows
2196
                    if (!saleTargetReportModelMap.get(fofoId).getActivationType().equals(ActivationType.ACTIVE)) {
31697 amit.gupta 2197
                        continue;
2198
                    }
2199
                    if (saleTargetReportModelMap.get(fofoId).getSecondary() == 0) {
2200
                        sb.append("<tr style='background-color:#D21F3C;color:white'>");
2201
                    } else {
2202
                        sb.append("<tr>");
2203
                    }
31886 tejbeer 2204
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getCode() + "</td>");
2205
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getBusinessName() + "</td>");
2206
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getBusinessManager() + "</td>");
2207
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getRegionalManager() + "</td>");
2208
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getTerritoryManager() + "</td>");
2209
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSecondary() + "</td>");
2210
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getTotalSale() + "</td>");
2211
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSmartphoneSale() + "</td>");
2212
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSmartphoneQty() + "</td>");
31697 amit.gupta 2213
                    sb.append("</tr>");
24841 govind 2214
 
25300 tejbeer 2215
 
31697 amit.gupta 2216
                }
2217
                sb.append("</tr>");
2218
                sb.append("</body></html>");
2219
                String statewiseSaleReport = sb.toString();
25300 tejbeer 2220
 
2221
 
31697 amit.gupta 2222
                ByteArrayOutputStream baos = null;
2223
                try {
2224
                    baos = FileUtil.getCSVByteStream(headers, rows);
2225
                } catch (Exception e2) {
2226
                    e2.printStackTrace();
2227
                }
2228
                Attachment attachment = new Attachment("PartnerSalePerformance.csv", new ByteArrayResource(baos.toByteArray()));
2229
                Utils.sendHtmlMailWithAttachments(googleMailSender, new String[]{email}, null, "Statewise " + subject, statewiseSaleReport, attachment);
2230
            }
2231
        }
2232
    }
29668 tejbeer 2233
 
31886 tejbeer 2234
    private void sendMailOfHtmlFormat(String email, String body, String cc[], String subject) throws MessagingException, ProfitMandiBusinessException, IOException {
31697 amit.gupta 2235
        MimeMessage message = mailSender.createMimeMessage();
2236
        MimeMessageHelper helper = new MimeMessageHelper(message);
2237
        helper.setSubject(subject);
2238
        helper.setText(body, true);
2239
        helper.setTo(email);
2240
        if (cc != null) {
2241
            helper.setCc(cc);
2242
        }
2243
        InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
2244
        helper.setFrom(senderAddress);
2245
        mailSender.send(message);
2246
    }
25694 amit.gupta 2247
 
31697 amit.gupta 2248
    public void sendNotification() throws Exception {
2249
        List<PushNotifications> pushNotifications = pushNotificationRepository.selectAllByTimestamp();
2250
        if (!pushNotifications.isEmpty()) {
2251
            for (PushNotifications pushNotification : pushNotifications) {
2252
                Device device = deviceRepository.selectById(pushNotification.getDeviceId());
31886 tejbeer 2253
                NotificationCampaign notificationCampaign = notificationCampaignRepository.selectById(pushNotification.getNotificationCampaignid());
2254
                SimpleCampaignParams scp = gson.fromJson(notificationCampaign.getImplementationParams(), SimpleCampaignParams.class);
31697 amit.gupta 2255
                Campaign campaign = new SimpleCampaign(scp);
2256
                String result_url = campaign.getUrl() + "&user_id=" + device.getUser_id();
2257
                JSONObject json = new JSONObject();
2258
                json.put("to", device.getFcmId());
2259
                JSONObject jsonObj = new JSONObject();
2260
                jsonObj.put("message", campaign.getMessage());
2261
                jsonObj.put("title", campaign.getTitle());
2262
                jsonObj.put("type", campaign.getType());
2263
                jsonObj.put("url", result_url);
2264
                jsonObj.put("time_to_live", campaign.getExpireTimestamp());
2265
                jsonObj.put("image", campaign.getImageUrl());
2266
                jsonObj.put("largeIcon", "large_icon");
2267
                jsonObj.put("smallIcon", "small_icon");
2268
                jsonObj.put("vibrate", 1);
2269
                jsonObj.put("pid", pushNotification.getId());
2270
                jsonObj.put("sound", 1);
2271
                jsonObj.put("priority", "high");
2272
                json.put("data", jsonObj);
2273
                try {
2274
                    CloseableHttpClient client = HttpClients.createDefault();
2275
                    HttpPost httpPost = new HttpPost(FCM_URL);
25694 amit.gupta 2276
 
31697 amit.gupta 2277
                    httpPost.setHeader("Content-Type", "application/json; utf-8");
2278
                    httpPost.setHeader("authorization", "key=" + FCM_API_KEY);
2279
                    StringEntity entity = new StringEntity(json.toString());
2280
                    httpPost.setEntity(entity);
2281
                    CloseableHttpResponse response = client.execute(httpPost);
30858 amit.gupta 2282
 
31697 amit.gupta 2283
                    if (response.getStatusLine().getStatusCode() == 200) {
2284
                        pushNotification.setSentTimestamp(LocalDateTime.now());
2285
                    } else {
2286
                        pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
2287
                        LOGGER.info("message" + "not sent");
2288
                        response.toString();
2289
                    }
25694 amit.gupta 2290
 
31697 amit.gupta 2291
                } catch (Exception e) {
2292
                    e.printStackTrace();
2293
                    pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
2294
                    LOGGER.info("message " + "not sent " + e.getMessage());
2295
                }
2296
            }
2297
        }
2298
    }
25721 tejbeer 2299
 
31697 amit.gupta 2300
    public void grouping() throws Exception {
2301
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yyyy hh:mm");
2302
        List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByStatus(PriceDropImeiStatus.APPROVED);
31886 tejbeer 2303
        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 2304
        Map<Integer, CustomRetailer> retailersMap = retailerService.getFofoRetailers(false);
2305
        for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
2306
            if (priceDropIMEI.getPartnerId() == 0)
2307
                continue;
2308
            HashSet<String> imeis = new HashSet<>();
2309
            PriceDrop priceDrop = priceDropRepository.selectById(priceDropIMEI.getPriceDropId());
2310
            imeis.add(priceDropIMEI.getImei());
31886 tejbeer 2311
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(priceDropIMEI.getPartnerId(), imeis, false);
31697 amit.gupta 2312
            if (inventoryItems.size() == 0) {
2313
                LOGGER.info("Need to investigate partnerId - {} imeis - {}", priceDropIMEI.getPartnerId(), imeis);
2314
                continue;
2315
            }
2316
            InventoryItem inventoryItem = inventoryItems.get(0);
2317
            CustomRetailer customRetailer = retailersMap.get(inventoryItem.getFofoId());
31886 tejbeer 2318
            if (inventoryItem.getLastScanType().equals(ScanType.DOA_OUT) || inventoryItem.getLastScanType().equals(ScanType.PURCHASE_RET)) {
31697 amit.gupta 2319
                // check if pricedrop has been rolled out
31886 tejbeer 2320
                List<UserWalletHistory> uwh = walletService.getAllByReference(inventoryItem.getFofoId(), priceDropIMEI.getPriceDropId(), WalletReferenceType.PRICE_DROP);
31697 amit.gupta 2321
                if (uwh.size() > 0) {
2322
                    Item item = itemRepository.selectById(inventoryItem.getItemId());
31886 tejbeer 2323
                    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 2324
                }
2325
            }
2326
        }
2327
    }
25721 tejbeer 2328
 
31697 amit.gupta 2329
    public void toffeeRollback() throws Exception {
2330
        toffeeService.cancelPolicyCopy("110143521986");
2331
        toffeeService.getOrderId("110143521986");
2332
    }
27212 tejbeer 2333
 
31697 amit.gupta 2334
    public void attachToffeeInvoices() throws Exception {
31886 tejbeer 2335
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(3, Optional.of(false));
31697 amit.gupta 2336
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
2337
            String invoiceNumber = insurancePolicy.getInvoiceNumber();
2338
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2339
            InvoicePdfModel pdfModel = orderService.getInvoicePdfModel(fofoOrder.getId());
2340
            java.io.ByteArrayOutputStream byteArrayOutputStream = new java.io.ByteArrayOutputStream();
2341
            PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
31886 tejbeer 2342
            String pdfInvoiceString = "data:application/pdf;base64," + Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());
2343
            boolean attached = toffeeService.attachInvoice(insurancePolicy.getPolicyNumber().split("#")[1], pdfInvoiceString);
31697 amit.gupta 2344
            if (attached) {
2345
                insurancePolicy.setPosted(true);
2346
            }
2347
        }
2348
    }
25721 tejbeer 2349
 
31697 amit.gupta 2350
    public void sendBAGPendingPolicies() throws Exception {
31886 tejbeer 2351
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(4, Optional.of(false));
31697 amit.gupta 2352
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
2353
            String invoiceNumber = insurancePolicy.getInvoiceNumber();
2354
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2355
            FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId()).get(0);
2356
            CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
2357
            Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
2358
            BAGInsuranceModel bagInsuranceModel = new BAGInsuranceModel();
2359
            // bagInsuranceModel.setModelId();
2360
            bagInsuranceModel.setAddressLine1(customerAddress.getLine1());
2361
            bagInsuranceModel.setAddressLine2(customerAddress.getLine2());
2362
            bagInsuranceModel.setCity(customerAddress.getCity());
2363
            bagInsuranceModel.setBrandWarranty("1 Year");
2364
            Item item = itemRepository.selectById(fofoOrderItem.getId());
2365
            bagInsuranceModel.setModelName(item.getItemDescription());
2366
            bagInsuranceModel.setDateOfPurchase(fofoOrder.getFormattedDate());
2367
            bagInsuranceModel.setEmail(customer.getEmailId());
2368
            bagInsuranceModel.setImei1(insurancePolicy.getSerialNumber());
2369
            bagInsuranceModel.setFirstName(customer.getFirstName());
2370
            bagInsuranceModel.setLastName(customer.getLastName());
2371
            bagInsuranceModel.setMobileNumber(customer.getMobileNumber());
2372
            bagInsuranceModel.setPlanId("");
2373
            insurancePolicy.setPosted(true);
2374
        }
2375
    }
25721 tejbeer 2376
 
31697 amit.gupta 2377
    public void schemeRollback(List<String> schemeIds) throws Exception {
2378
        List<Integer> schemeIdsInt = schemeIds.stream().map(x -> Integer.parseInt(x)).collect(Collectors.toList());
31886 tejbeer 2379
        Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIdsInt, 0, schemeIds.size()).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
31697 amit.gupta 2380
        List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectBySchemeIds(new HashSet<>(schemeIdsInt));
2381
        for (SchemeInOut sio : schemeInOuts) {
2382
            Scheme scheme = schemesMap.get(sio.getSchemeId());
2383
            if (scheme.getType().equals(SchemeType.IN)) {
25721 tejbeer 2384
 
31697 amit.gupta 2385
            } else if (scheme.getType().equals(SchemeType.OUT)) {
2386
                InventoryItem inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
2387
                List<ScanRecord> sr = scanRecordRepository.selectByInventoryItemId(sio.getInventoryItemId());
31886 tejbeer 2388
                ScanRecord scanRecord = sr.stream().filter(x -> x.getType().equals(ScanType.SALE)).max((x1, x2) -> x1.getCreateTimestamp().compareTo(x2.getCreateTimestamp())).get();
2389
                if (scanRecord.getCreateTimestamp().isAfter(scheme.getEndDateTime()) || scanRecord.getCreateTimestamp().isBefore(scheme.getStartDateTime())) {
31697 amit.gupta 2390
                    sio.setRolledBackTimestamp(LocalDateTime.now());
2391
                    FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(scanRecord.getOrderId());
31886 tejbeer 2392
                    String rollbackReason = "Scheme reversed for " + itemRepository.selectById(inventoryItem.getItemId()).getItemDescription() + "/Inv - " + fofoOrder.getInvoiceNumber();
2393
                    walletService.rollbackAmountFromWallet(scanRecord.getFofoId(), sio.getAmount(), scanRecord.getOrderId(), WalletReferenceType.SCHEME_OUT, rollbackReason, LocalDateTime.now());
2394
                    System.out.printf("Amount %f,SchemeId %d,Reason %s\n", sio.getAmount(), sio.getSchemeId(), rollbackReason);
31697 amit.gupta 2395
                }
2396
            }
2397
        }
2398
        // throw new Exception();
2399
    }
25721 tejbeer 2400
 
31697 amit.gupta 2401
    public void checkfocusedModelInPartnerStock() throws Exception {
25721 tejbeer 2402
 
31886 tejbeer 2403
        List<Integer> fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
2404
        Map<Integer, Map<Integer, List<SaholicCIS>>> warehouseItemAvailabilityMap = saholicInventoryService.getSaholicStock();
31697 amit.gupta 2405
        Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
2406
        Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = this.getPartnerIdSalesHeaders();
25721 tejbeer 2407
 
31886 tejbeer 2408
        Map<Integer, Map<Integer, List<SaholicPOItem>>> warehousePoItemAvailabilityMap = saholicInventoryService.getSaholicPOItems();
31697 amit.gupta 2409
        Map<Integer, List<FocusedModelShortageModel>> focusedModelShortageReportMap = new HashMap<>();
2410
        for (Integer fofoId : fofoIds) {
2411
            List<FocusedModelShortageModel> focusedModelShortageList = new ArrayList<>();
2412
            focusedModelShortageReportMap.put(fofoId, focusedModelShortageList);
2413
            CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
2414
            Map<Integer, Integer> processingOrderMap = null;
2415
            Map<Integer, Integer> catalogIdAndQtyMap = null;
2416
            Map<Integer, Integer> grnPendingOrdersMap = null;
25721 tejbeer 2417
 
31886 tejbeer 2418
            Map<Integer, Integer> currentInventorySnapshot = currentInventorySnapshotRepository.selectByFofoId(fofoId).stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
25721 tejbeer 2419
 
31697 amit.gupta 2420
            if (!currentInventorySnapshot.isEmpty()) {
31886 tejbeer 2421
                catalogIdAndQtyMap = itemRepository.selectByIds(currentInventorySnapshot.keySet()).stream().collect(groupingBy(x -> x.getCatalogItemId(), Collectors.summingInt(x -> currentInventorySnapshot.get(x.getId()))));
25800 tejbeer 2422
 
31697 amit.gupta 2423
            }
25800 tejbeer 2424
 
31886 tejbeer 2425
            Map<Integer, Integer> grnPendingOrders = orderRepository.selectPendingGrnOrders(fofoId).stream().collect(groupingBy(x -> x.getLineItem().getItemId(), Collectors.summingInt(x -> x.getLineItem().getQuantity())));
31697 amit.gupta 2426
            if (!grnPendingOrders.isEmpty()) {
31886 tejbeer 2427
                grnPendingOrdersMap = itemRepository.selectByIds(grnPendingOrders.keySet()).stream().collect(groupingBy(x -> x.getCatalogItemId(), Collectors.summingInt(x -> grnPendingOrders.get(x.getId()))));
25721 tejbeer 2428
 
31697 amit.gupta 2429
            }
25721 tejbeer 2430
 
31886 tejbeer 2431
            Map<Integer, Integer> processingOrder = orderRepository.selectOrders(fofoId, orderStatusList).stream().collect(groupingBy(x -> x.getLineItem().getItemId(), Collectors.summingInt(x -> x.getLineItem().getQuantity())));
31697 amit.gupta 2432
            if (!processingOrder.isEmpty()) {
31886 tejbeer 2433
                processingOrderMap = itemRepository.selectByIds(processingOrder.keySet()).stream().collect(groupingBy(x -> x.getCatalogItemId(), Collectors.summingInt(x -> processingOrder.get(x.getId()))));
25721 tejbeer 2434
 
31697 amit.gupta 2435
            }
25721 tejbeer 2436
 
31886 tejbeer 2437
            List<String> brands = mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name")).collect(Collectors.toList());
28526 tejbeer 2438
 
31886 tejbeer 2439
            List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId()).collect(Collectors.toList());
31697 amit.gupta 2440
            LOGGER.info("regionIds" + regionIds);
2441
            if (regionIds.size() == 0) {
2442
                LOGGER.info("No region found for partner {}", fofoId);
2443
                continue;
2444
            }
31886 tejbeer 2445
            Map<Integer, Optional<Integer>> focusedCatalogIdAndQtyMap = focusedModelRepository.selectAllByRegionIds(regionIds).stream().collect(groupingBy(FocusedModel::getCatalogId, mapping(FocusedModel::getObsMinimumQty, Collectors.maxBy(Integer::compareTo))));
25721 tejbeer 2446
 
31697 amit.gupta 2447
            LOGGER.info("focusedCatalogIdAndQtyMap" + focusedCatalogIdAndQtyMap);
32060 amit.gupta 2448
 
32048 tejbeer 2449
            Map<String, RetailerBlockBrands> retailerBlockBrands = retailerBlockBrandsRepository.selectAllByRetailer(fofoId).stream().collect(Collectors.toMap(x -> x.getBlockBrands(), x -> x));
31388 amit.gupta 2450
 
32048 tejbeer 2451
 
31697 amit.gupta 2452
            for (Map.Entry<Integer, Optional<Integer>> entry : focusedCatalogIdAndQtyMap.entrySet()) {
2453
                int minQty = entry.getValue().get();
2454
                int inStockQty = 0;
2455
                int processingQty = 0;
2456
                int grnPendingQty = 0;
2457
                int allColorNetAvailability = 0;
2458
                int allColorPoAvailability = 0;
2459
                if (processingOrderMap != null) {
31886 tejbeer 2460
                    processingQty = (processingOrderMap.get(entry.getKey()) == null) ? 0 : processingOrderMap.get(entry.getKey());
31388 amit.gupta 2461
 
31697 amit.gupta 2462
                }
2463
                if (grnPendingOrdersMap != null) {
31886 tejbeer 2464
                    grnPendingQty = (grnPendingOrdersMap.get(entry.getKey()) == null) ? 0 : grnPendingOrdersMap.get(entry.getKey());
25721 tejbeer 2465
 
31697 amit.gupta 2466
                }
2467
                if (catalogIdAndQtyMap != null) {
31886 tejbeer 2468
                    inStockQty = (catalogIdAndQtyMap.get(entry.getKey()) == null) ? 0 : catalogIdAndQtyMap.get(entry.getKey());
27213 tejbeer 2469
 
31697 amit.gupta 2470
                }
25721 tejbeer 2471
 
31697 amit.gupta 2472
                int grnStockQty = grnPendingQty + inStockQty;
2473
                int totalQty = processingQty + grnPendingQty + inStockQty;
27208 tejbeer 2474
 
31697 amit.gupta 2475
                int shortageQty = minQty - totalQty;
2476
                List<Item> items = itemRepository.selectAllByCatalogItemId(entry.getKey());
28528 tejbeer 2477
 
31697 amit.gupta 2478
                TagListing tagListing = tagListingRepository.selectByCatalogId(entry.getKey());
27208 tejbeer 2479
 
31697 amit.gupta 2480
                FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
25721 tejbeer 2481
 
31886 tejbeer 2482
                Map<Integer, List<SaholicCIS>> itemAvailabilityMap = warehouseItemAvailabilityMap.get(fofoStore.getWarehouseId());
27233 tejbeer 2483
 
31886 tejbeer 2484
                Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = warehousePoItemAvailabilityMap.get(fofoStore.getWarehouseId());
29801 manish 2485
 
31697 amit.gupta 2486
                for (Item item : items) {
2487
                    List<SaholicCIS> currentAvailability = null;
2488
                    List<SaholicPOItem> poItemAvailability = null;
2489
                    if (itemAvailabilityMap != null) {
2490
                        currentAvailability = itemAvailabilityMap.get(item.getId());
2491
                    }
25721 tejbeer 2492
 
31697 amit.gupta 2493
                    if (poItemAvailabilityMap != null) {
2494
                        poItemAvailability = poItemAvailabilityMap.get(item.getId());
2495
                    }
2496
                    if (currentAvailability != null) {
31886 tejbeer 2497
                        allColorNetAvailability += currentAvailability.stream().collect(Collectors.summingInt(SaholicCIS::getNetavailability));
31697 amit.gupta 2498
                    }
25800 tejbeer 2499
 
31697 amit.gupta 2500
                    if (poItemAvailability != null) {
31886 tejbeer 2501
                        allColorPoAvailability += poItemAvailability.stream().collect(Collectors.summingInt(SaholicPOItem::getUnfulfilledQty));
31697 amit.gupta 2502
                    }
25800 tejbeer 2503
 
31697 amit.gupta 2504
                }
25721 tejbeer 2505
 
31697 amit.gupta 2506
                FocusedModelShortageModel fm = new FocusedModelShortageModel();
2507
                fm.setFofoId(fofoId);
2508
                fm.setStoreCode(fofoStore.getCode());
2509
                fm.setStoreName(customRetailer.getBusinessName());
2510
                fm.setBrandName(items.get(0).getBrand());
2511
                fm.setModelName(items.get(0).getModelName());
2512
                fm.setModelNumber(items.get(0).getModelNumber());
2513
                fm.setGrnStockQty(grnStockQty);
2514
                fm.setPendingIndentQty(processingQty);
2515
                fm.setShortageQty(shortageQty);
2516
                fm.setPoAvailability(allColorPoAvailability);
2517
                fm.setDp(tagListing.getSellingPrice());
2518
                fm.setWarehouseName(warehouseMap.get(customRetailer.getWarehouseId()));
2519
                fm.setStateManager(partnerIdSalesHeadersMap.get(fofoId).getRegionalManager());
2520
                fm.setTerritoryManager(partnerIdSalesHeadersMap.get(fofoId).getTerritoryManager());
2521
                fm.setItemName(items.get(0).getBrand() + items.get(0).getModelNumber() + items.get(0).getModelName());
2522
                fm.setAvailability(allColorNetAvailability);
25721 tejbeer 2523
 
31697 amit.gupta 2524
                focusedModelShortageList.add(fm);
2525
            }
25721 tejbeer 2526
 
31697 amit.gupta 2527
        }
2528
        if (!focusedModelShortageReportMap.isEmpty()) {
2529
            String fileName = "Stock Alert-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
2530
            Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
2531
            Map<String, List<List<?>>> emailRowsMap = new HashMap<>();
25721 tejbeer 2532
 
31697 amit.gupta 2533
            focusedModelShortageReportMap.entrySet().forEach(x -> {
2534
                storeGuyMap.entrySet().forEach(y -> {
28526 tejbeer 2535
 
31697 amit.gupta 2536
                    if (y.getValue().contains(x.getKey())) {
2537
                        if (!emailRowsMap.containsKey(y.getKey())) {
2538
                            emailRowsMap.put(y.getKey(), new ArrayList<>());
2539
                        }
31886 tejbeer 2540
                        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 2541
                        emailRowsMap.get(y.getKey()).addAll(fms);
29995 tejbeer 2542
 
31697 amit.gupta 2543
                    }
29995 tejbeer 2544
 
31697 amit.gupta 2545
                });
25721 tejbeer 2546
 
31697 amit.gupta 2547
            });
25721 tejbeer 2548
 
31886 tejbeer 2549
            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 2550
            emailRowsMap.entrySet().forEach(entry -> {
25721 tejbeer 2551
 
31697 amit.gupta 2552
                ByteArrayOutputStream baos = null;
2553
                try {
2554
                    baos = FileUtil.getCSVByteStream(headers, entry.getValue());
2555
                } catch (Exception e2) {
2556
                    e2.printStackTrace();
2557
                }
2558
                String[] sendToArray = new String[]{
25721 tejbeer 2559
 
31886 tejbeer 2560
                        entry.getKey(), "apurve.shrivastava@smartdukaan.com", "puneet.bisht@smartdukaan.com"
25721 tejbeer 2561
 
31697 amit.gupta 2562
                };
25721 tejbeer 2563
 
31886 tejbeer 2564
 
31697 amit.gupta 2565
                try {
31886 tejbeer 2566
                    Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Stock Alert", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
31697 amit.gupta 2567
                } catch (Exception e1) { // TODO Auto-generated catch block
2568
                    e1.printStackTrace();
2569
                }
25721 tejbeer 2570
 
31697 amit.gupta 2571
            });
2572
        }
2573
    }
25721 tejbeer 2574
 
31697 amit.gupta 2575
    private String getNotificationMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2576
        StringBuilder sb = new StringBuilder();
2577
        sb.append("Focused Model Shortage in Your Stock : \n");
2578
        for (FocusedModelShortageModel entry : focusedModelShortageModel) {
25721 tejbeer 2579
 
31697 amit.gupta 2580
            sb.append(entry.getItemName() + "-" + entry.getShortageQty());
2581
            sb.append(String.format("%n", ""));
2582
        }
2583
        return sb.toString();
2584
    }
25721 tejbeer 2585
 
31697 amit.gupta 2586
    private void sendMailWithAttachments(String subject, String messageText, String email) throws Exception {
2587
        MimeMessage message = mailSender.createMimeMessage();
2588
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
25721 tejbeer 2589
 
31697 amit.gupta 2590
        helper.setSubject(subject);
2591
        helper.setText(messageText, true);
2592
        helper.setTo(email);
2593
        InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
2594
        helper.setFrom(senderAddress);
2595
        mailSender.send(message);
25721 tejbeer 2596
 
31697 amit.gupta 2597
    }
25721 tejbeer 2598
 
31697 amit.gupta 2599
    private String getMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2600
        StringBuilder sb = new StringBuilder();
31886 tejbeer 2601
        sb.append("<html><body><p>Alert</p><p>Focused Model Shortage in Your Stock:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
2602
        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 2603
        for (FocusedModelShortageModel entry : focusedModelShortageModel) {
25721 tejbeer 2604
 
31697 amit.gupta 2605
            sb.append("<tr>");
2606
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getItemName() + "</td>");
25936 amit.gupta 2607
 
31697 amit.gupta 2608
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getShortageQty() + "</td>");
26790 tejbeer 2609
 
31697 amit.gupta 2610
            sb.append("</tr>");
25927 amit.gupta 2611
 
31697 amit.gupta 2612
        }
26790 tejbeer 2613
 
31697 amit.gupta 2614
        sb.append("</tbody></table></body></html>");
26945 amit.gupta 2615
 
31697 amit.gupta 2616
        return sb.toString();
2617
    }
26945 amit.gupta 2618
 
31697 amit.gupta 2619
    public void notifyLead() throws Exception {
31886 tejbeer 2620
        List<Lead> leadsToNotify = leadRepository.selectLeadsScheduledBetweenDate(null, LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
2621
        Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
31697 amit.gupta 2622
        LOGGER.info("authUserEmailMap {}", authUserEmailMap);
31886 tejbeer 2623
        Map<String, Integer> dtrEmailMap = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
25982 amit.gupta 2624
 
31697 amit.gupta 2625
        LOGGER.info("dtrEmailMap {}", dtrEmailMap);
26283 tejbeer 2626
 
31697 amit.gupta 2627
        Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26283 tejbeer 2628
 
31697 amit.gupta 2629
        for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2630
            int authId = authUserEmail.getKey();
2631
            String email = authUserEmail.getValue();
2632
            authUserKeyMap.put(authId, dtrEmailMap.get(email));
2633
        }
2634
        LOGGER.info("authUserKeyMap", authUserKeyMap);
2635
        LOGGER.info("leadsToNotify {}", leadsToNotify);
26283 tejbeer 2636
 
31697 amit.gupta 2637
        String templateMessage = "Lead followup for %s %s, %s, %s is due by %s";
2638
        for (Lead lead : leadsToNotify) {
2639
            if (authUserKeyMap.get(lead.getAssignTo()) == null) {
2640
                LOGGER.info("Assignee no longer part of system {}", lead.getAssignTo());
2641
                continue;
2642
            }
2643
            String title = "Leads followup Reminder";
31886 tejbeer 2644
            String notificationMessage = String.format(templateMessage, lead.getFirstName(), lead.getLastName(), lead.getAddress(), lead.getLeadMobile(), leadTimeFormatter.format(lead.getScheduledTimestamp()));
31697 amit.gupta 2645
            String url = "https://app.smartdukaan.com/pages/home/leadUpdate?leadId=" + lead.getId();
2646
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
2647
            sendNotificationModel.setCampaignName("Lead Reminder");
2648
            sendNotificationModel.setTitle(title);
2649
            sendNotificationModel.setMessage(notificationMessage);
2650
            sendNotificationModel.setType("url");
2651
            sendNotificationModel.setUrl(url);
2652
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2653
            sendNotificationModel.setMessageType(MessageType.reminder);
2654
            sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(lead.getAssignTo())));
2655
            System.out.println(sendNotificationModel);
2656
            notificationService.sendNotification(sendNotificationModel);
2657
            AuthUser authUser = authRepository.selectById(lead.getAssignTo());
2658
            // notificationService.sendWhatsappMessage(notificationMessage, title,
2659
            // authUser.getMobileNumber());
2660
        }
2661
    }
26790 tejbeer 2662
 
31697 amit.gupta 2663
    public void notifyVisits() throws Exception {
31886 tejbeer 2664
        List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository.selectVisitsScheduledBetweenDate(LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
2665
        Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
2666
        Map<String, Integer> dtrEmailMap = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
31697 amit.gupta 2667
        Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26790 tejbeer 2668
 
31697 amit.gupta 2669
        for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2670
            int authId = authUserEmail.getKey();
2671
            String email = authUserEmail.getValue();
2672
            authUserKeyMap.put(authId, dtrEmailMap.get(email));
2673
        }
2674
        String visitTemplate = "Planned visit to franchisee %s is due by %s";
2675
        String followupTemplate = "Lead followup for franchisee %s is due by %s";
2676
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("MMM 7, EEEE h:m a");
2677
        for (FranchiseeVisit visit : franchiseeVisits) {
2678
            if (authUserKeyMap.containsKey(visit.getAuthId())) {
2679
                continue;
2680
            }
2681
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
2682
            String message = null;
2683
            if (visit.getFranchiseActivityId() == 0) {
31886 tejbeer 2684
                message = String.format(visitTemplate, visit.getPartnerName(), timeFormatter.format(visit.getScheduleTimestamp()));
31697 amit.gupta 2685
                sendNotificationModel.setCampaignName("Franchisee visit Reminder");
2686
            } else {
31886 tejbeer 2687
                message = String.format(followupTemplate, visit.getPartnerName(), timeFormatter.format(visit.getScheduleTimestamp()));
31697 amit.gupta 2688
                sendNotificationModel.setCampaignName("Franchisee followup Reminder");
2689
            }
2690
            sendNotificationModel.setMessage(message);
2691
            sendNotificationModel.setType("url");
2692
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
2693
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2694
            sendNotificationModel.setMessageType(MessageType.reminder);
2695
            sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(visit.getAuthId())));
2696
            // notificationService.sendNotification(sendNotificationModel);
2697
        }
2698
    }
26792 tejbeer 2699
 
31697 amit.gupta 2700
    public void ticketClosed() throws Exception {
26790 tejbeer 2701
 
31697 amit.gupta 2702
        List<Ticket> tickets = ticketRepository.selectAllNotClosedTicketsWithStatus(ActivityType.RESOLVED);
2703
        for (Ticket ticket : tickets) {
2704
            if (ticket.getUpdateTimestamp().toLocalDate().isBefore(LocalDate.now().minusDays(7))) {
2705
                ticket.setCloseTimestamp(LocalDateTime.now());
2706
                ticket.setLastActivity(ActivityType.RESOLVED_ACCEPTED);
2707
                ticket.setUpdateTimestamp(LocalDateTime.now());
2708
                ticketRepository.persist(ticket);
2709
            }
2710
        }
26790 tejbeer 2711
 
31697 amit.gupta 2712
    }
26790 tejbeer 2713
 
31697 amit.gupta 2714
    public void checkValidateReferral() throws Exception {
26790 tejbeer 2715
 
31697 amit.gupta 2716
        List<Refferal> referrals = refferalRepository.selectByStatus(RefferalStatus.pending);
2717
        LOGGER.info("referrals" + referrals);
2718
        if (!referrals.isEmpty()) {
2719
            String subject = "Referral Request";
2720
            String messageText = this.getMessageForReferral(referrals);
26790 tejbeer 2721
 
31697 amit.gupta 2722
            MimeMessage message = mailSender.createMimeMessage();
2723
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
2724
            String[] email = {"kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com"};
2725
            helper.setSubject(subject);
2726
            helper.setText(messageText, true);
2727
            helper.setTo(email);
2728
            InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
2729
            helper.setFrom(senderAddress);
2730
            mailSender.send(message);
26790 tejbeer 2731
 
31697 amit.gupta 2732
        }
2733
    }
26790 tejbeer 2734
 
31697 amit.gupta 2735
    private String getMessageForReferral(List<Refferal> referrals) {
2736
        StringBuilder sb = new StringBuilder();
31886 tejbeer 2737
        sb.append("<html><body><p>Alert</p><p>Pending Referrals:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
2738
        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 2739
        for (Refferal entry : referrals) {
26790 tejbeer 2740
 
31697 amit.gupta 2741
            sb.append("<tr>");
2742
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeName() + "</td>");
30421 tejbeer 2743
 
31697 amit.gupta 2744
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeEmail() + "</td>");
2745
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getFirstName() + "</td>");
2746
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMobile() + "</td>");
2747
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCity() + "</td>");
2748
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getState() + "</td>");
30421 tejbeer 2749
 
31697 amit.gupta 2750
            sb.append("</tr>");
30421 tejbeer 2751
 
31697 amit.gupta 2752
        }
30421 tejbeer 2753
 
31697 amit.gupta 2754
        sb.append("</tbody></table></body></html>");
30421 tejbeer 2755
 
31697 amit.gupta 2756
        return sb.toString();
2757
    }
30421 tejbeer 2758
 
31886 tejbeer 2759
    private String getMessageForUncontacblePartner(List<PartnerCollectionRemark> pcrs) throws ProfitMandiBusinessException {
31697 amit.gupta 2760
        StringBuilder sb = new StringBuilder();
31886 tejbeer 2761
        sb.append("<html><body><p>Alert</p><p>Not Responding Partner:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
2762
        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 2763
 
31697 amit.gupta 2764
                + "	    				</tr>");
2765
        for (PartnerCollectionRemark entry : pcrs) {
30421 tejbeer 2766
 
31697 amit.gupta 2767
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
30421 tejbeer 2768
 
31697 amit.gupta 2769
            sb.append("<tr>");
31886 tejbeer 2770
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
28205 tejbeer 2771
 
31886 tejbeer 2772
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
28205 tejbeer 2773
 
31697 amit.gupta 2774
            sb.append("</tr>");
28205 tejbeer 2775
 
31697 amit.gupta 2776
        }
28205 tejbeer 2777
 
31697 amit.gupta 2778
        sb.append("</tbody></table></body></html>");
28205 tejbeer 2779
 
31697 amit.gupta 2780
        return sb.toString();
2781
    }
28208 tejbeer 2782
 
31697 amit.gupta 2783
    public void reverseWallet() throws Exception {
2784
        LocalDate localDate = LocalDate.of(2020, 10, 28);
31886 tejbeer 2785
        List<UserWalletHistory> uwhList = userWalletHistoryRepository.selectAllByDateType(localDate.atStartOfDay(), localDate.plusDays(1).atStartOfDay(), Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
31697 amit.gupta 2786
        for (UserWalletHistory uwh : uwhList) {
2787
            if (uwh.getBusinessTimestamp().getMonth().equals(Month.SEPTEMBER)) {
2788
                UserWallet uw = userWalletRepository.selectById(uwh.getWalletId());
2789
                // LOGGER.info("UWH - {}", uwh);
2790
                // amount += uwh.getAmount();
2791
                // System.out.println("Amount is - " + amount);
2792
                // walletService.rollbackAmountFromWallet(uw.getUserId(), uwh.getAmount(),
2793
                // uwh.getReference(), uwh.getReferenceType(), "Margin reversal for error prone
2794
                // run", uwh.getBusinessTimestamp());
2795
                int orderId = uwh.getReference();
2796
                FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
2797
                int inventoryItemId = 0;
2798
                // fofoOrderRepository.delete(fofoOrder);
2799
                List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
2800
                /*
2801
                 * List<PaymentOptionTransaction> paymentOptionTransactions =
2802
                 * paymentOptionTransactionRepository.selectByReferenceIdAndType(fofoOrder.getId
2803
                 * (), PaymentOptionReferenceType.ORDER); for(PaymentOptionTransaction
2804
                 * paymentOptionTransaction : paymentOptionTransactions) {
2805
                 * //paymentOptionTransactionRepository.delete(paymentOptionTransaction); }
2806
                 */
2807
                for (FofoOrderItem foi : fofoOrderItems) {
2808
                    // fofoOrderItemRepository.delete(foi);
2809
                    List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(foi.getId());
2810
                    for (FofoLineItem fli : flis) {
2811
                        // fofoLineItemRepository.delete(fli);
2812
                        inventoryItemId = fli.getInventoryItemId();
2813
                    }
2814
                }
2815
                List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(
2816
                        java.util.stream.Stream.of(inventoryItemId).collect(Collectors.toSet()));
2817
                for (SchemeInOut sio : schemeInOuts) {
2818
                    if (sio.getCreateTimestamp().toLocalDate().equals(localDate)) {
2819
                        LOGGER.info("SIO - {}", sio);
2820
                        sio.setRolledBackTimestamp(LocalDateTime.now());
2821
                    }
2822
                }
28208 tejbeer 2823
 
31697 amit.gupta 2824
            }
2825
        }
28208 tejbeer 2826
 
31697 amit.gupta 2827
    }
28208 tejbeer 2828
 
31697 amit.gupta 2829
    public void partnerProblemAlert() throws Exception {
2830
        LocalDateTime curDate = LocalDate.now().atStartOfDay();
2831
        Map<Integer, Double> lmtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
2832
                curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1), 0, false);
31886 tejbeer 2833
        Map<Integer, Double> mtdSales = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX), 0, false);
2834
        Map<Integer, PartnerDailyInvestment> pdi = partnerDailyInvestmentRepository.selectAll(LocalDate.now()).stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
28205 tejbeer 2835
 
31697 amit.gupta 2836
        for (Entry<Integer, Double> ls : lmtdSale.entrySet()) {
28208 tejbeer 2837
 
31697 amit.gupta 2838
            double lmtdTwentyPercentSale = ls.getValue() * 0.2;
28208 tejbeer 2839
 
31697 amit.gupta 2840
            LOGGER.info("lmtdTwentyPercentSale" + lmtdTwentyPercentSale);
28208 tejbeer 2841
 
31697 amit.gupta 2842
            double mtdSale = mtdSales.get(ls.getKey()) == null ? 0 : mtdSales.get(ls.getKey());
28205 tejbeer 2843
 
31697 amit.gupta 2844
            LOGGER.info("mtdSale" + mtdSale);
28205 tejbeer 2845
 
31886 tejbeer 2846
            double totalSixtyPercentInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getTotalInvestment() * 0.6;
28205 tejbeer 2847
 
31697 amit.gupta 2848
            LOGGER.info("totalSixtyPercentInvestment" + totalSixtyPercentInvestment);
28205 tejbeer 2849
 
31697 amit.gupta 2850
            double stockInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getInStockAmount();
28205 tejbeer 2851
 
31697 amit.gupta 2852
            LOGGER.info("stockInvestment" + stockInvestment);
28205 tejbeer 2853
 
31697 amit.gupta 2854
            boolean Investmentvalue = partnerInvestmentService.isInvestmentBelow(ls.getKey(), 25);
28205 tejbeer 2855
 
31697 amit.gupta 2856
            PartnerProblem partnerProblem = partnerProblemRepository.selectByFofoId(ls.getKey());
28205 tejbeer 2857
 
31697 amit.gupta 2858
            if (partnerProblem == null) {
2859
                partnerProblem = new PartnerProblem();
2860
                partnerProblem.setFofoId(ls.getKey());
2861
                if (mtdSale < lmtdTwentyPercentSale) {
2862
                    partnerProblem.setMtd(1);
2863
                }
2864
                if (Investmentvalue) {
2865
                    partnerProblem.setInvestment(1);
2866
                }
28205 tejbeer 2867
 
31697 amit.gupta 2868
                if (stockInvestment < totalSixtyPercentInvestment) {
2869
                    partnerProblem.setInvestment(1);
2870
                }
28205 tejbeer 2871
 
31697 amit.gupta 2872
                partnerProblemRepository.persist(partnerProblem);
2873
            } else {
2874
                if (mtdSale < lmtdTwentyPercentSale) {
2875
                    partnerProblem.setMtd(partnerProblem.getMtd() + 1);
28213 tejbeer 2876
 
31697 amit.gupta 2877
                } else {
2878
                    partnerProblem.setMtd(0);
28227 tejbeer 2879
 
31697 amit.gupta 2880
                }
2881
                if (Investmentvalue) {
2882
                    partnerProblem.setInvestment(partnerProblem.getInvestment() + 1);
2883
                } else {
2884
                    partnerProblem.setInvestment(0);
28227 tejbeer 2885
 
31697 amit.gupta 2886
                }
2887
                if (stockInvestment < totalSixtyPercentInvestment) {
2888
                    partnerProblem.setStockInvestment(partnerProblem.getStockInvestment() + 1);
2889
                } else {
2890
                    partnerProblem.setStockInvestment(0);
2891
                }
28213 tejbeer 2892
 
31697 amit.gupta 2893
            }
28213 tejbeer 2894
 
31697 amit.gupta 2895
        }
28213 tejbeer 2896
 
31886 tejbeer 2897
        List<PartnerProblem> partnerProblems = partnerProblemRepository.selectAll().stream().filter(x -> x.getMtd() + x.getInvestment() + x.getStockInvestment() > 0).collect(Collectors.toList());
28205 tejbeer 2898
 
31697 amit.gupta 2899
        partnerProblems = partnerProblems.stream().sorted((x1, x2) -> {
31886 tejbeer 2900
            return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment() + x2.getStockInvestment() ? 1 : -1;
31697 amit.gupta 2901
        }).collect(Collectors.toList());
28205 tejbeer 2902
 
31697 amit.gupta 2903
        Map<Integer, PartnerProblem> partnerProblemMap = partnerProblems.stream().sorted((x1, x2) -> {
31886 tejbeer 2904
            return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment() + x2.getStockInvestment() ? 1 : -1;
31697 amit.gupta 2905
        }).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
28205 tejbeer 2906
 
31697 amit.gupta 2907
        Map<Integer, CustomRetailer> customRetailers = retailerService.getAllFofoRetailers();
28205 tejbeer 2908
 
31697 amit.gupta 2909
        List<Integer> assignTo = Arrays.asList(15, 9, 54, 53);
28205 tejbeer 2910
 
31886 tejbeer 2911
        Map<Integer, AuthUser> assignAuthUserMap = authRepository.selectAllAuthUserByIds(assignTo).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
28222 tejbeer 2912
 
31886 tejbeer 2913
        List<String> sendTo = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com", "sm@smartdukaan.com");
31697 amit.gupta 2914
        LOGGER.info("partnerProblem" + partnerProblems);
2915
        StringBuilder sb = new StringBuilder();
2916
        sb.append("<htl><body>");
2917
        sb.append(
2918
                "<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 2919
        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 2920
 
31697 amit.gupta 2921
                + "	    				</tr>");
28218 tejbeer 2922
 
31697 amit.gupta 2923
        for (PartnerProblem pp : partnerProblems) {
2924
            int value = pp.getFofoId() % 4;
28218 tejbeer 2925
 
31697 amit.gupta 2926
            Map<EscalationType, AuthUser> authUserMap = csService.getAuthUserAndEsclationByPartnerId(pp.getFofoId());
2927
            LOGGER.info("authUserMap" + authUserMap);
2928
            sb.append("<tr>");
31886 tejbeer 2929
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
2930
            sb.append("<td style='border:1px solid black;padding: 5px'>" + assignAuthUserMap.get(assignTo.get(value)).getName() + "</td>");
31697 amit.gupta 2931
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
2932
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
2933
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
31886 tejbeer 2934
            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 2935
 
31697 amit.gupta 2936
            sb.append("</tr>");
2937
        }
2938
        sb.append("</tbody></table><br><br>");
2939
        String subject = "Partner Problem Alert!";
2940
        String[] email = sendTo.toArray(new String[sendTo.size()]);
28227 tejbeer 2941
 
31697 amit.gupta 2942
        this.sendMailHtmlFormat(email, sb.toString(), null, subject);
28227 tejbeer 2943
 
31697 amit.gupta 2944
        Map<Integer, List<Integer>> authUserPartnerMapping = csService.getAuthUserIdPartnerIdMapping();
28224 tejbeer 2945
 
31697 amit.gupta 2946
        for (Entry<Integer, List<Integer>> authUserPartner : authUserPartnerMapping.entrySet()) {
2947
            AuthUser authUser = authRepository.selectById(authUserPartner.getKey());
2948
            for (Integer patnerId : authUserPartner.getValue()) {
2949
                if (partnerProblemMap.get(patnerId) != null) {
28230 tejbeer 2950
 
31697 amit.gupta 2951
                    StringBuilder sbbuilder = new StringBuilder();
2952
                    sbbuilder.append("<hml><body>");
2953
                    sb.append(
2954
                            "<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 2955
                    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 2956
 
31697 amit.gupta 2957
                            + "	    				</tr>");
28205 tejbeer 2958
 
31697 amit.gupta 2959
                    for (Integer partnerId : authUserPartner.getValue()) {
2960
                        if (partnerProblemMap.get(partnerId) != null) {
2961
                            PartnerProblem pp = partnerProblemMap.get(partnerId);
2962
                            sbbuilder.append("<tr>");
31886 tejbeer 2963
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
2964
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
31697 amit.gupta 2965
                            sbbuilder.append(
2966
                                    "<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
31886 tejbeer 2967
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
28790 amit.gupta 2968
 
31697 amit.gupta 2969
                            sbbuilder.append("</tr>");
2970
                        }
28790 amit.gupta 2971
 
31697 amit.gupta 2972
                    }
2973
                    sbbuilder.append("</tbody></table><br><br>");
29488 manish 2974
 
31697 amit.gupta 2975
                    this.sendMailOfHtmlFormat(authUser.getEmailId(), sbbuilder.toString(), null, subject);
2976
                }
29488 manish 2977
 
31697 amit.gupta 2978
            }
2979
        }
2980
    }
28775 amit.gupta 2981
 
31886 tejbeer 2982
    private void sendMailHtmlFormat(String email[], String body, String cc[], String subject) throws MessagingException, ProfitMandiBusinessException, IOException {
31697 amit.gupta 2983
        MimeMessage message = mailSender.createMimeMessage();
2984
        MimeMessageHelper helper = new MimeMessageHelper(message);
2985
        helper.setSubject(subject);
2986
        helper.setText(body, true);
2987
        helper.setTo(email);
2988
        if (cc != null) {
2989
            helper.setCc(cc);
2990
        }
2991
        InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
2992
        helper.setFrom(senderAddress);
2993
        mailSender.send(message);
2994
    }
29451 manish 2995
 
31697 amit.gupta 2996
    @Autowired
2997
    WarehouseRepository warehouseRepository;
29488 manish 2998
 
31697 amit.gupta 2999
    public void getVendorWarehouses(int warehouseId) {
3000
        LOGGER.info("Warehouses - {}", warehouseRepository.getVendorWarehouses().get(warehouseId));
29488 manish 3001
 
31697 amit.gupta 3002
    }
29488 manish 3003
 
31697 amit.gupta 3004
    public void checkImeiActivation() {
29801 manish 3005
 
31697 amit.gupta 3006
        try {
3007
            vivoImeiActivationService.checkImeiActivation();
3008
        } catch (ProfitMandiBusinessException e) {
3009
            // TODO Auto-generated catch block
3010
            e.printStackTrace();
3011
        } catch (IOException e) {
3012
            // TODO Auto-generated catch block
3013
            e.printStackTrace();
3014
        } catch (Exception e) {
3015
            // TODO Auto-generated catch block
3016
            e.printStackTrace();
3017
        }
29807 manish 3018
 
31697 amit.gupta 3019
    }
29801 manish 3020
 
31697 amit.gupta 3021
    public void checkItelImeiActivation(LocalDate date, Integer day) {
3022
        LOGGER.info("Hello - {}", "hhh");
29488 manish 3023
 
31697 amit.gupta 3024
        try {
3025
            itelImeiActivationService.checkItelImeiActivation(date, day);
3026
        } catch (ProfitMandiBusinessException e) {
3027
            // TODO Auto-generated catch block
3028
            e.printStackTrace();
3029
        } catch (IOException e) {
3030
            // TODO Auto-generated catch block
3031
            e.printStackTrace();
3032
        } catch (Exception e) {
3033
            // TODO Auto-generated catch block
3034
            e.printStackTrace();
3035
        }
29488 manish 3036
 
31697 amit.gupta 3037
    }
29488 manish 3038
 
31886 tejbeer 3039
    public void selectFinServiceFollowUpDateByCurrDate(LocalDate currentDate) throws MessagingException, ProfitMandiBusinessException, IOException {
31697 amit.gupta 3040
        LOGGER.info("selectfinServiceFollow - {}", "selectfinServiceFollowUpDateByCurrDate");
29308 tejbeer 3041
 
31697 amit.gupta 3042
        serviceConfigService.selectFinServicePartnerfollowUpDateByCurrentDate(currentDate);
29252 amit.gupta 3043
 
31697 amit.gupta 3044
    }
29451 manish 3045
 
31697 amit.gupta 3046
    public void checkTecnoImeiActivation(LocalDate date, Integer day) {
3047
        LOGGER.info("Hello - {}", "hhh");
29308 tejbeer 3048
 
31697 amit.gupta 3049
        try {
3050
            tecnoImeiActivation.checkTecnoImeiActivation(date, day);
3051
        } catch (ProfitMandiBusinessException e) {
3052
            // TODO Auto-generated catch block
3053
            e.printStackTrace();
3054
        } catch (IOException e) {
3055
            // TODO Auto-generated catch block
3056
            e.printStackTrace();
3057
        } catch (Exception e) {
3058
            // TODO Auto-generated catch block
3059
            e.printStackTrace();
3060
        }
29308 tejbeer 3061
 
31697 amit.gupta 3062
    }
29441 tejbeer 3063
 
31697 amit.gupta 3064
    public void checkCancellationMargin() throws Exception {
3065
        LocalDateTime startDate = LocalDate.of(2021, 4, 1).atStartOfDay();
3066
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectCancelledBetweenSaleDate(startDate, LocalDateTime.now());
3067
        LOGGER.info("Total Orders =  {}", fofoOrders.size());
3068
        for (FofoOrder fofoOrder : fofoOrders) {
31886 tejbeer 3069
            List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.SCHEME_OUT);
3070
            history.addAll(userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.ACTIVATION_SCHEME));
31697 amit.gupta 3071
            int walletSum = history.stream().mapToInt(x -> x.getAmount()).sum();
3072
            if (Math.abs(walletSum) > 1) {
3073
                // LOGGER.info("Cancelled invoice {}, Order Id = {}, = havent rolledback, Value
3074
                // = {}", fofoOrder.getInvoiceNumber(), fofoOrder.getId(), walletSum);
3075
                List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
3076
                List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(fofoOrderItems.get(0).getId());
3077
                FofoLineItem fli = flis.get(0);
3078
                if (StringUtils.isEmpty(fli.getSerialNumber()))
3079
                    continue;
31886 tejbeer 3080
                List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(fli.getInventoryItemId())));
31697 amit.gupta 3081
                InventoryItem inventoryItem = inventoryItemRepository.selectById(fli.getInventoryItemId());
31886 tejbeer 3082
                double schemeSum = schemeInOuts.stream().filter(x -> x.getRolledBackTimestamp() == null).mapToDouble(x -> x.getAmount()).sum();
31697 amit.gupta 3083
                /*
3084
                 * if(inventoryItem.getGoodQuantity()==1) {
3085
                 * LOGGER.info("GoodQty, Serial Number {}, InventoryItem = {}, Billed on {}",
3086
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3087
                 * inventoryItem.getUpdateTimestamp()); } else
3088
                 * if(inventoryItem.getBadQuantity()==1){
3089
                 * LOGGER.info("Bad Qty, Serial Number {}, InventoryItem = {}, Billed on {}",
3090
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3091
                 * inventoryItem.getUpdateTimestamp()); } else if
3092
                 * (inventoryItem.getLastScanType().equals(ScanType.SALE)) { LOGGER.
3093
                 * info("Problem Sold, Serial Number {}, InventoryItem = {}, Billed on {}",
3094
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3095
                 * inventoryItem.getUpdateTimestamp()); }
3096
                 */
31886 tejbeer 3097
                if (inventoryItem.getLastScanType().equals(ScanType.SALE) || inventoryItem.getLastScanType().equals(ScanType.SALE_RET)) {
3098
                    Map<String, Double> map = schemeInOuts.stream().collect(
3099
                            groupingBy(
3100
                                    x -> DateTimeFormatter.ofPattern("yyyyMMddHH").format(x.getCreateTimestamp()) + "- " + x.getSchemeId(), Collectors.summingDouble(x -> x.getAmount())));
31697 amit.gupta 3101
                    for (Map.Entry<String, Double> entry : map.entrySet()) {
3102
                        LOGGER.info("{} = {}", entry.getKey(), entry.getValue());
3103
                    }
31886 tejbeer 3104
                    LOGGER.info("id- {}, imei- {}, lastScan = {}, Scheme sum - {}", inventoryItem.getId(), inventoryItem.getSerialNumber(), inventoryItem.getLastScanType(), schemeSum);
31697 amit.gupta 3105
                }
3106
            }
3107
        }
29441 tejbeer 3108
 
31697 amit.gupta 3109
    }
29308 tejbeer 3110
 
31697 amit.gupta 3111
    public static String readFileAsString(String file) throws Exception {
3112
        String data = "";
3113
        data = new String(Files.readAllBytes(Paths.get(file)));
3114
        return data;
3115
    }
29308 tejbeer 3116
 
31697 amit.gupta 3117
    public void markDelhiveryOrderDelivered() throws ProfitMandiBusinessException, IOException {
31886 tejbeer 3118
        List<Order> orders = orderRepository.selectOrderByProviderIdAndStatus(ProfitMandiConstants.DELHIVERY_PROVIDERID, OrderStatus.SHIPPED_FROM_WH);
29308 tejbeer 3119
 
31697 amit.gupta 3120
        if (!orders.isEmpty()) {
3121
            Set<String> airwayBill = orders.stream().map(x -> x.getAirwayBillNumber()).collect(Collectors.toSet());
29308 tejbeer 3122
 
31697 amit.gupta 3123
            int arraylength = airwayBill.size();
29308 tejbeer 3124
 
31697 amit.gupta 3125
            if (arraylength >= 75) {
29308 tejbeer 3126
 
31697 amit.gupta 3127
                airwayBill = airwayBill.stream().limit(74).collect(Collectors.toSet());
3128
            }
3129
            LOGGER.info("airwayBill" + airwayBill);
3130
            String url = "https://track.delhivery.com/api/v1/packages/json/";
29308 tejbeer 3131
 
31697 amit.gupta 3132
            OkHttpClient client = new OkHttpClient();
29308 tejbeer 3133
 
31886 tejbeer 3134
            Request request1 = new Request.Builder().url(url + "?waybill=" + String.join(",", airwayBill) + "&token=" + token).get().build();
29308 tejbeer 3135
 
31697 amit.gupta 3136
            LOGGER.info("request1" + request1);
29308 tejbeer 3137
 
31697 amit.gupta 3138
            Response response = client.newCall(request1).execute();
29308 tejbeer 3139
 
31697 amit.gupta 3140
            LOGGER.info("jsonbj" + response.body());
29308 tejbeer 3141
 
31697 amit.gupta 3142
            JSONObject jsonObj = new JSONObject(response.body().string());
29308 tejbeer 3143
 
31697 amit.gupta 3144
            LOGGER.info("jsonObj" + jsonObj);
29308 tejbeer 3145
 
31697 amit.gupta 3146
            JSONArray shipmentData = jsonObj.getJSONArray("ShipmentData");
3147
            Set<String> airwaybillStatus = new HashSet<>();
3148
            for (int i = 0; i < shipmentData.length(); i++) {
3149
                JSONObject jsonObject = shipmentData.getJSONObject(i);
3150
                JSONObject shipment = jsonObject.getJSONObject("Shipment");
30982 tejbeer 3151
 
31697 amit.gupta 3152
                LOGGER.info("shipment" + shipment);
3153
                JSONObject statusDescription = shipment.getJSONObject("Status");
3154
                String awb = shipment.getString("AWB");
30982 tejbeer 3155
 
31697 amit.gupta 3156
                String status = statusDescription.getString("Status");
3157
                LOGGER.info("status" + status);
30982 tejbeer 3158
 
31697 amit.gupta 3159
                LOGGER.info("awb" + awb);
3160
                if (status.equals("Delivered")) {
3161
                    airwaybillStatus.add(awb);
3162
                }
30982 tejbeer 3163
 
31697 amit.gupta 3164
            }
3165
            markOrderDelivered(airwaybillStatus);
3166
        }
3167
    }
29308 tejbeer 3168
 
31697 amit.gupta 3169
    public void markBlueDartOrderDelivered() throws ProfitMandiBusinessException, IOException {
30982 tejbeer 3170
 
31697 amit.gupta 3171
        String loginId = "DEL81122";
31117 tejbeer 3172
 
31697 amit.gupta 3173
        String licencekey = "uhfhlg2jpmnqfhfrlsgzfr1nhu1qfvel";
31117 tejbeer 3174
 
31886 tejbeer 3175
        List<Order> orders = orderRepository.selectOrderByProviderIdAndStatus(ProfitMandiConstants.BLUEDART_PROVIDERID, OrderStatus.SHIPPED_FROM_WH);
31117 tejbeer 3176
 
31697 amit.gupta 3177
        if (!orders.isEmpty()) {
31117 tejbeer 3178
 
31697 amit.gupta 3179
            Set<String> airwayBillNo = orders.stream().map(x -> x.getAirwayBillNumber()).collect(Collectors.toSet());
31117 tejbeer 3180
 
31697 amit.gupta 3181
            LOGGER.info("airwayBill" + airwayBillNo);
3182
            String url = "https://api.bluedart.com/servlet/RoutingServlet?handler=tnt&action=custawbquery";
31117 tejbeer 3183
 
31886 tejbeer 3184
            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 3185
 
31697 amit.gupta 3186
            JSONObject updateJson = XML.toJSONObject(response);
31117 tejbeer 3187
 
31697 amit.gupta 3188
            JSONObject shipmentData = updateJson.getJSONObject("ShipmentData");
3189
            Object shipmentObject = shipmentData.get("Shipment");
31117 tejbeer 3190
 
31697 amit.gupta 3191
            Set<String> airwaybillStatus = new HashSet<>();
29308 tejbeer 3192
 
31697 amit.gupta 3193
            if (shipmentObject instanceof JSONArray) {
3194
                JSONArray shipments = (JSONArray) shipmentObject;
3195
                for (int i = 0; i < shipments.length(); i++) {
3196
                    JSONObject jsonObject = shipments.getJSONObject(i);
31117 tejbeer 3197
 
31697 amit.gupta 3198
                    Number awb = jsonObject.getNumber("WaybillNo");
3199
                    String status = jsonObject.getString("Status");
31117 tejbeer 3200
 
31697 amit.gupta 3201
                    if (status.equals("SHIPMENT DELIVERED")) {
3202
                        airwaybillStatus.add(awb.toString());
3203
                    }
29308 tejbeer 3204
 
31697 amit.gupta 3205
                }
3206
            } else {
3207
                JSONObject jsonObject = (JSONObject) shipmentObject;
3208
                Number awb = jsonObject.getNumber("WaybillNo");
3209
                String status = jsonObject.getString("Status");
31117 tejbeer 3210
 
31697 amit.gupta 3211
                if (status.equals("SHIPMENT DELIVERED")) {
3212
                    airwaybillStatus.add(awb.toString());
3213
                }
31117 tejbeer 3214
 
31697 amit.gupta 3215
            }
31117 tejbeer 3216
 
31697 amit.gupta 3217
            LOGGER.info("airwaybillStatus" + airwaybillStatus);
31117 tejbeer 3218
 
31697 amit.gupta 3219
            markOrderDelivered(airwaybillStatus);
3220
        }
31117 tejbeer 3221
 
31697 amit.gupta 3222
    }
31117 tejbeer 3223
 
31886 tejbeer 3224
    private void markOrderDelivered(Set<String> airwaybillStatus) throws ProfitMandiBusinessException, HttpHostConnectException {
31697 amit.gupta 3225
        if (!airwaybillStatus.isEmpty()) {
3226
            for (String aws : airwaybillStatus) {
31117 tejbeer 3227
 
31697 amit.gupta 3228
                List<Order> deliverdOrders = orderRepository.selectByAirwayBillNumber(aws);
31117 tejbeer 3229
 
31697 amit.gupta 3230
                int fofoId = deliverdOrders.get(0).getRetailerId();
3231
                for (Order dlo : deliverdOrders) {
3232
                    dlo.setStatus(OrderStatus.DELIVERY_SUCCESS);
3233
                    dlo.setStatusDescription("Order Delivered");
3234
                    dlo.setDeliveryTimestamp(LocalDateTime.now());
3235
                }
31117 tejbeer 3236
 
31697 amit.gupta 3237
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(fofoId);
31117 tejbeer 3238
 
31697 amit.gupta 3239
                Address address = addressRepository.selectById(user.getAddressId());
29814 tejbeer 3240
 
31697 amit.gupta 3241
                String title = "Order Delivered";
29814 tejbeer 3242
 
31886 tejbeer 3243
                String message = String.format("Dear partner, Your SmartDukaan Order " + aws + " has been delivered to you in a safe sealed bag.");
29814 tejbeer 3244
 
31697 amit.gupta 3245
                SendNotificationModel sendNotificationModel = new SendNotificationModel();
3246
                sendNotificationModel.setCampaignName("Order Delivered");
3247
                sendNotificationModel.setTitle(title);
3248
                sendNotificationModel.setMessage(message);
3249
                sendNotificationModel.setType("url");
3250
                sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
3251
                sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
3252
                sendNotificationModel.setMessageType(MessageType.notification);
3253
                int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
3254
                sendNotificationModel.setUserIds(Arrays.asList(userId));
3255
                notificationService.sendNotification(sendNotificationModel);
29815 tejbeer 3256
 
31697 amit.gupta 3257
                notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
29814 tejbeer 3258
 
31697 amit.gupta 3259
            }
3260
        }
3261
    }
29814 tejbeer 3262
 
31697 amit.gupta 3263
    public void partnerWiseCreditAccount() throws Exception {
29814 tejbeer 3264
 
31697 amit.gupta 3265
        List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
29814 tejbeer 3266
 
31697 amit.gupta 3267
        for (FofoStore fs : fofoStores) {
29835 tejbeer 3268
 
31697 amit.gupta 3269
            if (fs.getPan() != null) {
3270
                AccountStatusResponseOut accountStatusResponseOut = mandiiService.getStatus(fs.getPan());
29835 tejbeer 3271
 
31697 amit.gupta 3272
                LOGGER.info("accountStatusResponseOut" + accountStatusResponseOut);
31886 tejbeer 3273
                CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(fs.getId(), Gateway.MANDII);
29817 tejbeer 3274
 
31697 amit.gupta 3275
                if (creditAccount == null) {
29835 tejbeer 3276
 
31697 amit.gupta 3277
                    creditAccount = new CreditAccount();
29835 tejbeer 3278
 
31697 amit.gupta 3279
                    creditAccount.setFofoId(fs.getId());
3280
                    creditAccount.setGateway(Gateway.MANDII);
29817 tejbeer 3281
 
31697 amit.gupta 3282
                }
29814 tejbeer 3283
 
31697 amit.gupta 3284
                if (accountStatusResponseOut == null) {
3285
                    creditAccount.setCreditStatus(CreditStatus.UNKNOWN);
3286
                    creditAccount.setDescription("User company not found");
30421 tejbeer 3287
 
31697 amit.gupta 3288
                } else {
3289
                    if (accountStatusResponseOut.getSanctionLimit() != null) {
3290
                        creditAccount.setSanctionedAmount(accountStatusResponseOut.getSanctionLimit().floatValue());
3291
                    } else {
3292
                        creditAccount.setSanctionedAmount(0);
3293
                    }
30421 tejbeer 3294
 
31697 amit.gupta 3295
                    creditAccount.setInterestRate(accountStatusResponseOut.getRateOfInterest());
3296
                    if (accountStatusResponseOut.getBalanceAmount() != null) {
3297
                        creditAccount.setAvailableAmount(accountStatusResponseOut.getBalanceAmount().floatValue());
3298
                    } else {
3299
                        creditAccount.setAvailableAmount(0);
3300
                    }
30421 tejbeer 3301
 
31697 amit.gupta 3302
                    if (accountStatusResponseOut.getCurrentStage() != null) {
3303
                        creditAccount.setDescription(accountStatusResponseOut.getCurrentStage().toString());
3304
                    }
3305
                    if (accountStatusResponseOut.getStatus().equals(EligibilityStatusEnum.SANCTION_AVAILABLE)) {
3306
                        creditAccount.setCreditStatus(CreditStatus.SANCTIONED);
3307
                    } else if (accountStatusResponseOut.getStatus().equals(EligibilityStatusEnum.IN_ELIGIBLE)) {
3308
                        creditAccount.setCreditStatus(CreditStatus.INELIGIBLE);
3309
                    } else {
30421 tejbeer 3310
 
31697 amit.gupta 3311
                        creditAccount.setCreditStatus(CreditStatus.TO_BE_EVALUATED);
3312
                    }
3313
                }
30421 tejbeer 3314
 
31697 amit.gupta 3315
                creditAccount.setUpdatedOn(LocalDateTime.now());
3316
                creditAccountRepository.persist(creditAccount);
3317
            }
3318
        }
3319
    }
30421 tejbeer 3320
 
31697 amit.gupta 3321
    @Autowired
3322
    private PartnerCollectionRemarkRepository partnerCollectionRemarkRepository;
30421 tejbeer 3323
 
31886 tejbeer 3324
    public void reviewUncontactablePartner() throws ProfitMandiBusinessException, MessagingException, UnsupportedEncodingException {
30421 tejbeer 3325
 
31697 amit.gupta 3326
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
30421 tejbeer 3327
 
31886 tejbeer 3328
        List<Integer> pcrms = partnerCollectionRemarkRepository.selectMaxRemarkId(new ArrayList<>(customRetailerMap.keySet()));
30859 tejbeer 3329
 
31697 amit.gupta 3330
        if (!pcrms.isEmpty()) {
31886 tejbeer 3331
            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 3332
 
31697 amit.gupta 3333
            if (!partnerCollectionRemarksMap.isEmpty()) {
31886 tejbeer 3334
                for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMapping().entrySet()) {
3335
                    List<PartnerCollectionRemark> filteredRows = storeGuyEntry.getValue().stream().map(x -> partnerCollectionRemarksMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
31697 amit.gupta 3336
                    String subject = "UNCONTACTABLE PARTNERS";
3337
                    String messageText = this.getMessageForUncontacblePartner(filteredRows);
30859 tejbeer 3338
 
31697 amit.gupta 3339
                    MimeMessage message = mailSender.createMimeMessage();
3340
                    MimeMessageHelper helper = new MimeMessageHelper(message, true);
3341
                    String[] email = new String[]{storeGuyEntry.getKey()};
30859 tejbeer 3342
 
31697 amit.gupta 3343
                    helper.setSubject(subject);
3344
                    helper.setText(messageText, true);
3345
                    helper.setTo(email);
31886 tejbeer 3346
                    InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
31697 amit.gupta 3347
                    helper.setFrom(senderAddress);
3348
                    mailSender.send(message);
30859 tejbeer 3349
 
31697 amit.gupta 3350
                    LOGGER.info("filteredRows {}", filteredRows);
30859 tejbeer 3351
 
31697 amit.gupta 3352
                }
3353
            }
30936 tejbeer 3354
 
31697 amit.gupta 3355
        }
3356
    }
30936 tejbeer 3357
 
31697 amit.gupta 3358
    @Autowired
3359
    private LoanRepository loanRepository;
31020 tejbeer 3360
 
31697 amit.gupta 3361
    @Autowired
3362
    private LoanStatementRepository loanStatementRepository;
30859 tejbeer 3363
 
31697 amit.gupta 3364
    @Autowired
3365
    private SDCreditService sdCreditService;
30859 tejbeer 3366
 
31697 amit.gupta 3367
    @Autowired
3368
    private SDCreditRequirementRepository sdCreditRequirementRepository;
30859 tejbeer 3369
 
31697 amit.gupta 3370
    @Autowired
3371
    private CurrentPartnerDailyInvestmentRepository currentPartnerDailyInvestmentRepository;
30859 tejbeer 3372
 
31697 amit.gupta 3373
    @Autowired
3374
    private TransactionRepository transactionRepository;
30859 tejbeer 3375
 
31697 amit.gupta 3376
    @Autowired
3377
    private SanctionRequestRepository sanctionRequestRepository;
30859 tejbeer 3378
 
31697 amit.gupta 3379
    public void calculateInterestAccured() throws ProfitMandiBusinessException {
30936 tejbeer 3380
 
31697 amit.gupta 3381
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30859 tejbeer 3382
 
31697 amit.gupta 3383
        if (!loans.isEmpty()) {
30936 tejbeer 3384
 
31697 amit.gupta 3385
            for (Loan loan : loans) {
30936 tejbeer 3386
 
31697 amit.gupta 3387
                List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
30936 tejbeer 3388
 
31724 amit.gupta 3389
                Map<LoanReferenceType, Double> loanStatusAmount = loanStatements.stream().collect(groupingBy(
31697 amit.gupta 3390
                        x -> x.getLoanReferenceType(), Collectors.summingDouble(x -> x.getAmount().doubleValue())));
30859 tejbeer 3391
 
31697 amit.gupta 3392
                if (loan.getFreeDays() > 0) {
3393
                    LocalDateTime freeDaysLimitDate = loan.getCreatedOn().plusDays(loan.getFreeDays() - 1);
30859 tejbeer 3394
 
31697 amit.gupta 3395
                    LOGGER.info("freeDaysLimitDate {}", freeDaysLimitDate);
3396
                    if (LocalDateTime.now().isAfter(freeDaysLimitDate)) {
31886 tejbeer 3397
                        int loanStatementId = loanStatementRepository.selectLatestLoanSatement(loan.getFofoId(), loan.getId());
31697 amit.gupta 3398
                        LOGGER.info("loanStatementId {}", loanStatementId);
30859 tejbeer 3399
 
31697 amit.gupta 3400
                        if (loanStatementId != 0) {
30859 tejbeer 3401
 
31697 amit.gupta 3402
                            this.calculateInterest(loan, loanStatusAmount, loanStatementId);
30859 tejbeer 3403
 
31697 amit.gupta 3404
                        } else {
31886 tejbeer 3405
                            sdCreditService.addInterest(freeDaysLimitDate.toLocalDate(), LocalDate.now(), loan, loanStatusAmount);
31697 amit.gupta 3406
                        }
30859 tejbeer 3407
 
31697 amit.gupta 3408
                    }
3409
                } else {
31332 amit.gupta 3410
 
31886 tejbeer 3411
                    int loanStatementId = loanStatementRepository.selectLatestLoanSatement(loan.getFofoId(), loan.getId());
31697 amit.gupta 3412
                    LOGGER.info("loanStatementId2 {}", loanStatementId);
31604 tejbeer 3413
 
31697 amit.gupta 3414
                    this.calculateInterest(loan, loanStatusAmount, loanStatementId);
31332 amit.gupta 3415
 
31697 amit.gupta 3416
                }
31518 amit.gupta 3417
 
31697 amit.gupta 3418
            }
3419
        }
30936 tejbeer 3420
 
31697 amit.gupta 3421
    }
30936 tejbeer 3422
 
31697 amit.gupta 3423
    @Autowired
3424
    FofoPaymentRepository fofoPaymentRepository;
30936 tejbeer 3425
 
31697 amit.gupta 3426
    @Autowired
3427
    CCAvenuePaymentService ccAvenuePaymentService;
30936 tejbeer 3428
 
31697 amit.gupta 3429
    public void settleCCAvePayments() throws Exception {
31886 tejbeer 3430
        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 3431
        for (FofoPayment fofoPayment : fofoPayments) {
3432
            ccAvenuePaymentService.updatePayment(fofoPayment);
3433
        }
3434
    }
30859 tejbeer 3435
 
31697 amit.gupta 3436
    /*
3437
     * public void getCCAvenuePendingOrderStatus(int pendingOrderId) { PendingOrder
3438
     * pendingOrder = pendingOrderRepository.selectById(pendingOrderId);
3439
     * ccAvenuePaymentService.getPaymentStatusMap(pendingOrder); }
3440
     */
30859 tejbeer 3441
 
31886 tejbeer 3442
    private void calculateInterest(Loan loan, Map<LoanReferenceType, Double> loanStatusAmount, int loanStatementId) throws ProfitMandiBusinessException {
31697 amit.gupta 3443
        LoanStatement loanStatement = loanStatementRepository.selectById(loanStatementId);
30859 tejbeer 3444
 
31697 amit.gupta 3445
        if (loanStatement.getLoanId() == loan.getId()) {
30859 tejbeer 3446
 
31886 tejbeer 3447
            sdCreditService.addInterest(loanStatement.getCreatedAt().toLocalDate(), LocalDate.now(), loan, loanStatusAmount);
30859 tejbeer 3448
 
31697 amit.gupta 3449
        } else {
3450
            throw new ProfitMandiBusinessException("loanstament", loanStatement.getLoanId(), "Invalid LoanId");
3451
        }
3452
    }
31175 tejbeer 3453
 
31697 amit.gupta 3454
    public void loanSettlement() throws Exception {
3455
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30859 tejbeer 3456
 
31697 amit.gupta 3457
        if (!loans.isEmpty()) {
30859 tejbeer 3458
 
31697 amit.gupta 3459
            for (Loan loan : loans) {
31020 tejbeer 3460
 
31697 amit.gupta 3461
                UserWallet userWallet = userWalletRepository.selectByRetailerId(loan.getFofoId());
31886 tejbeer 3462
                SDCreditRequirement sdCreditRequirement = sdCreditRequirementRepository.selectByFofoId(loan.getFofoId());
30859 tejbeer 3463
 
31697 amit.gupta 3464
                if (userWallet.getAmount() >= 100) {
3465
                    List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
31175 tejbeer 3466
 
31697 amit.gupta 3467
                    LOGGER.info("loanStatements {}", loanStatements);
30859 tejbeer 3468
 
31886 tejbeer 3469
                    Map<LoanReferenceType, Double> loanStatusAmount = loanStatements.stream().collect(groupingBy(x -> x.getLoanReferenceType(), Collectors.summingDouble(x -> FormattingUtils.serialize(x.getAmount()))));
30859 tejbeer 3470
 
31697 amit.gupta 3471
                    LOGGER.info("loanStatusAmount {}", loanStatusAmount);
3472
                    Double interestAmount = loanStatusAmount.get(LoanReferenceType.INTEREST);
30859 tejbeer 3473
 
31697 amit.gupta 3474
                    if (interestAmount == null) {
3475
                        interestAmount = (double) 0;
3476
                    }
30859 tejbeer 3477
 
31697 amit.gupta 3478
                    double principalAmount = loanStatusAmount.get(LoanReferenceType.PRINCIPAL);
3479
                    double paidAmount = 0;
3480
                    if (userWallet.getAmount() > Math.abs(interestAmount)) {
30859 tejbeer 3481
 
31697 amit.gupta 3482
                        LOGGER.info("interestAmount b {}", interestAmount);
30859 tejbeer 3483
 
31697 amit.gupta 3484
                        if (interestAmount < 0) {
3485
                            LOGGER.info("interestAmount a {}", interestAmount);
30859 tejbeer 3486
 
31886 tejbeer 3487
                            settledLoanStatement(LoanReferenceType.INTEREST, BigDecimal.valueOf(interestAmount), loan.getFofoId(), loan.getId(), "Amount adjusted against loan", LocalDateTime.now());
31697 amit.gupta 3488
                            loan.setInterestPaid(loan.getInterestPaid().add(BigDecimal.valueOf(interestAmount).abs()));
30859 tejbeer 3489
 
31697 amit.gupta 3490
                            paidAmount += Math.abs(interestAmount);
3491
                        }
31020 tejbeer 3492
 
31697 amit.gupta 3493
                        double userWalletAmount = userWallet.getAmount() - Math.abs(interestAmount);
31110 tejbeer 3494
 
32161 tejbeer 3495
                        LOGGER.info("interestAmount b {}", interestAmount);
3496
 
3497
 
31697 amit.gupta 3498
                        if (userWalletAmount > Math.abs(principalAmount) && principalAmount < 0) {
31110 tejbeer 3499
 
31886 tejbeer 3500
                            settledLoanStatement(LoanReferenceType.PRINCIPAL, BigDecimal.valueOf(principalAmount), loan.getFofoId(), loan.getId(), "Amount adjusted against loan", LocalDateTime.now());
31697 amit.gupta 3501
                            double amount = userWalletAmount - Math.abs(principalAmount);
31110 tejbeer 3502
 
31697 amit.gupta 3503
                            paidAmount += Math.abs(principalAmount);
30859 tejbeer 3504
 
32145 tejbeer 3505
                            // userWallet.setAmount((int) amount);
30859 tejbeer 3506
 
31886 tejbeer 3507
                            BigDecimal utilizationAmount = sdCreditRequirement.getUtilizedAmount().subtract(BigDecimal.valueOf(principalAmount).abs());
30859 tejbeer 3508
 
31697 amit.gupta 3509
                            sdCreditRequirement.setUtilizedAmount(utilizationAmount);
30859 tejbeer 3510
 
31886 tejbeer 3511
                            CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(loan.getFofoId(), Gateway.SDDIRECT);
31020 tejbeer 3512
 
31697 amit.gupta 3513
                            creditAccount.setAvailableAmount(sdCreditRequirement.getAvailableLimit().floatValue());
3514
                            creditAccount.setUpdatedOn(LocalDateTime.now());
31020 tejbeer 3515
 
31697 amit.gupta 3516
                            loan.setPendingAmount(BigDecimal.ZERO);
31020 tejbeer 3517
 
31697 amit.gupta 3518
                        } else if (principalAmount < 0) {
31110 tejbeer 3519
 
31886 tejbeer 3520
                            settledLoanStatement(LoanReferenceType.PRINCIPAL, BigDecimal.valueOf(userWalletAmount), loan.getFofoId(), loan.getId(), "Amount adjusted against loan", LocalDateTime.now());
30859 tejbeer 3521
 
31697 amit.gupta 3522
                            paidAmount += Math.abs(userWalletAmount);
30859 tejbeer 3523
 
31886 tejbeer 3524
                            BigDecimal availableLimit = sdCreditRequirement.getAvailableLimit().add(BigDecimal.valueOf(userWalletAmount)).abs();
30859 tejbeer 3525
 
31886 tejbeer 3526
                            BigDecimal utilizationAmount = sdCreditRequirement.getUtilizedAmount().subtract(BigDecimal.valueOf(userWalletAmount)).abs();
30859 tejbeer 3527
 
31697 amit.gupta 3528
                            sdCreditRequirement.setUtilizedAmount(utilizationAmount);
30859 tejbeer 3529
 
31886 tejbeer 3530
                            CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(loan.getFofoId(), Gateway.SDDIRECT);
30859 tejbeer 3531
 
31697 amit.gupta 3532
                            creditAccount.setAvailableAmount(sdCreditRequirement.getAvailableLimit().floatValue());
3533
                            creditAccount.setUpdatedOn(LocalDateTime.now());
32117 tejbeer 3534
                            //userWallet.setAmount(0);
30859 tejbeer 3535
 
31697 amit.gupta 3536
                            loan.setPendingAmount(
3537
                                    loan.getPendingAmount().subtract(BigDecimal.valueOf(userWalletAmount)));
30859 tejbeer 3538
 
31697 amit.gupta 3539
                        }
30859 tejbeer 3540
 
32161 tejbeer 3541
                        LOGGER.info("paidAmount b {}", paidAmount);
3542
 
3543
 
32117 tejbeer 3544
                        walletService.consumeAmountFromWallet(userWallet.getUserId(), loan.getId(), WalletReferenceType.LOAN_REPAYMENT, "Amount adjusted against loan", (float) Math.abs(paidAmount), LocalDateTime.now());
30859 tejbeer 3545
 
32145 tejbeer 3546
                        // createUserWalletHistory(userWallet.getId(), userWallet.getUserId(), WalletReferenceType.LOAN_REPAYMENT, loan.getId(), Math.abs(paidAmount));
32117 tejbeer 3547
 
31697 amit.gupta 3548
                    } else {
30999 tejbeer 3549
 
31886 tejbeer 3550
                        settledLoanStatement(LoanReferenceType.INTEREST, BigDecimal.valueOf(userWallet.getAmount()), loan.getFofoId(), loan.getId(), "Amount adjusted against loan", LocalDateTime.now());
31020 tejbeer 3551
 
31697 amit.gupta 3552
                        paidAmount += Math.abs(userWallet.getAmount());
31020 tejbeer 3553
 
31697 amit.gupta 3554
                        loan.setInterestPaid(
3555
                                loan.getInterestPaid().add(BigDecimal.valueOf(userWallet.getAmount()).abs()));
31020 tejbeer 3556
 
32117 tejbeer 3557
                        //  createUserWalletHistory(userWallet.getId(), userWallet.getUserId(), WalletReferenceType.LOAN_REPAYMENT, loan.getId(), Math.abs(paidAmount));
3558
 
3559
                        walletService.consumeAmountFromWallet(userWallet.getUserId(), loan.getId(), WalletReferenceType.LOAN_REPAYMENT, "Amount adjusted against loan", (float) Math.abs(paidAmount), LocalDateTime.now());
3560
 
3561
 
3562
                        // userWallet.setAmount(0);
31697 amit.gupta 3563
                    }
31020 tejbeer 3564
 
31697 amit.gupta 3565
                }
3566
            }
31020 tejbeer 3567
 
31697 amit.gupta 3568
            List<Order> allOrders = orderRepository.selectHoldOrder();
31020 tejbeer 3569
 
31697 amit.gupta 3570
            LOGGER.info("allOrders {}", allOrders);
31020 tejbeer 3571
 
31697 amit.gupta 3572
            if (!allOrders.isEmpty()) {
31886 tejbeer 3573
                Map<Integer, List<Order>> transactionOrdersMap = allOrders.stream().collect(groupingBy(Order::getTransactionId, Collectors.toList()));
31697 amit.gupta 3574
                LinkedHashMap<Integer, List<Order>> sortedTransactionOrdersMap = new LinkedHashMap<>();
31886 tejbeer 3575
                transactionOrdersMap.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEachOrdered(x -> sortedTransactionOrdersMap.put(x.getKey(), x.getValue()));
31697 amit.gupta 3576
                LOGGER.info("sortedTransactionOrdersMap {}", sortedTransactionOrdersMap);
31020 tejbeer 3577
 
31697 amit.gupta 3578
                for (Entry<Integer, List<Order>> transactionOrdersEntry : sortedTransactionOrdersMap.entrySet()) {
31020 tejbeer 3579
 
31697 amit.gupta 3580
                    List<Order> orders = transactionOrdersEntry.getValue();
31020 tejbeer 3581
 
31697 amit.gupta 3582
                    double totalAmount = orders.stream().collect(Collectors.summingDouble(x -> x.getTotalAmount()));
31020 tejbeer 3583
 
31697 amit.gupta 3584
                    LocalDateTime createDate = orders.get(0).getCreateTimestamp();
31020 tejbeer 3585
 
31697 amit.gupta 3586
                    int fofoId = orders.get(0).getRetailerId();
31020 tejbeer 3587
 
31697 amit.gupta 3588
                    int transactionId = transactionOrdersEntry.getKey();
31020 tejbeer 3589
 
31697 amit.gupta 3590
                    SanctionRequest sanctionRequest = sanctionRequestRepository.selectByTransactionId(transactionId);
31020 tejbeer 3591
 
31886 tejbeer 3592
                    double loanSettleAmount = loanStatementRepository.selectByDateAndFofoId(createDate, fofoId).stream().filter(x -> x.getAmount().doubleValue() > 0).collect(Collectors.summingDouble(x -> x.getAmount().doubleValue()));
31020 tejbeer 3593
 
31697 amit.gupta 3594
                    LOGGER.info("loanSettleAmount {}", loanSettleAmount);
31020 tejbeer 3595
 
31697 amit.gupta 3596
                    LOGGER.info("totalAmount {}", totalAmount);
3597
                    if (loanSettleAmount >= sanctionRequest.getUtilizationAmount().doubleValue()) {
31020 tejbeer 3598
 
31697 amit.gupta 3599
                        LOGGER.info("totalAmount {}", totalAmount);
31020 tejbeer 3600
 
31697 amit.gupta 3601
                        orders.forEach(x -> x.setShipmentHold(false));
31020 tejbeer 3602
 
31886 tejbeer 3603
                        List<String> authUserEmail = csService.getAuthUserIdByPartnerId(orders.get(0).getRetailerId()).stream().map(x -> x.getEmailId()).collect(Collectors.toList());
31697 amit.gupta 3604
                        authUserEmail.add("vinay.p@smartdukaan.com");
3605
                        authUserEmail.add("shivam.gupta@smartdukaan.com");
31020 tejbeer 3606
 
31697 amit.gupta 3607
                        String[] emailTo = authUserEmail.toArray(new String[authUserEmail.size()]);
30859 tejbeer 3608
 
31697 amit.gupta 3609
                        String[] ccTo = {"tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com"};
30859 tejbeer 3610
 
31697 amit.gupta 3611
                        String subject = "Dispatched " + (orders.get(0).getRetailerName());
31886 tejbeer 3612
                        String message = String.format("Dear Team, \n" + "kindly note the material for the " + orders.get(0).getRetailerName() + "of Rs." + totalAmount + "is dispatched.");
30859 tejbeer 3613
 
31697 amit.gupta 3614
                        Utils.sendMailWithAttachments(mailSender, emailTo, ccTo, subject, message);
30859 tejbeer 3615
 
31697 amit.gupta 3616
                    }
30859 tejbeer 3617
 
31697 amit.gupta 3618
                }
3619
            }
30859 tejbeer 3620
 
31697 amit.gupta 3621
        }
30859 tejbeer 3622
 
31697 amit.gupta 3623
    }
30859 tejbeer 3624
 
31886 tejbeer 3625
    private void settledLoanStatement(LoanReferenceType loanReferneceType, BigDecimal amount, int fofoId, int loanId, String description, LocalDateTime now) {
30859 tejbeer 3626
 
31886 tejbeer 3627
        sdCreditService.createLoanStatement(loanReferneceType, amount.abs(), fofoId, loanId, description, LocalDateTime.now());
30859 tejbeer 3628
 
31697 amit.gupta 3629
    }
30859 tejbeer 3630
 
31886 tejbeer 3631
    private void createUserWalletHistory(int walletId, int userId, WalletReferenceType referenceType, int loanId, double interestAmount) {
31697 amit.gupta 3632
        UserWalletHistory uwh = new UserWalletHistory();
3633
        uwh.setWalletId(walletId);
3634
        uwh.setFofoId(userId);
3635
        uwh.setBusinessTimestamp(LocalDateTime.now());
3636
        uwh.setReferenceType(referenceType);
3637
        uwh.setReference(loanId);
3638
        uwh.setTimestamp(LocalDateTime.now());
3639
        uwh.setAmount((int) -(interestAmount));
3640
        uwh.setDescription("Amount adjusted against loan");
3641
        userWalletHistoryRepository.persist(uwh);
30859 tejbeer 3642
 
31697 amit.gupta 3643
    }
30859 tejbeer 3644
 
31886 tejbeer 3645
    public void dailyLoanAlert() throws ProfitMandiBusinessException, HttpHostConnectException, UnsupportedEncodingException {
31697 amit.gupta 3646
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30859 tejbeer 3647
 
31697 amit.gupta 3648
        Map<Integer, Double> partnerLoanAmount = new HashMap<>();
30859 tejbeer 3649
 
31697 amit.gupta 3650
        if (!loans.isEmpty()) {
30859 tejbeer 3651
 
31697 amit.gupta 3652
            for (Loan loan : loans) {
30859 tejbeer 3653
 
31697 amit.gupta 3654
                List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
30859 tejbeer 3655
 
31886 tejbeer 3656
                double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
31697 amit.gupta 3657
                if (partnerLoanAmount.get(loan.getFofoId()) != null) {
3658
                    amount += partnerLoanAmount.get(loan.getFofoId());
3659
                    partnerLoanAmount.put(loan.getFofoId(), amount);
3660
                } else {
3661
                    partnerLoanAmount.put(loan.getFofoId(), amount);
3662
                }
30965 tejbeer 3663
 
31697 amit.gupta 3664
            }
30965 tejbeer 3665
 
31697 amit.gupta 3666
        }
30859 tejbeer 3667
 
31697 amit.gupta 3668
        if (!partnerLoanAmount.isEmpty()) {
30965 tejbeer 3669
 
31697 amit.gupta 3670
            for (Entry<Integer, Double> partnerLoanAmountEnrty : partnerLoanAmount.entrySet()) {
30859 tejbeer 3671
 
31697 amit.gupta 3672
                int fofoId = partnerLoanAmountEnrty.getKey();
30859 tejbeer 3673
 
31697 amit.gupta 3674
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(fofoId);
30859 tejbeer 3675
 
31697 amit.gupta 3676
                Address address = addressRepository.selectById(user.getAddressId());
30896 amit.gupta 3677
 
31697 amit.gupta 3678
                String title = "Alert Credit Outstanding!";
3679
                String url = "http://app.smartdukaan.com/pages/home/credit";
31886 tejbeer 3680
                String message = "Your total pending Loan amount is Rs." + FormattingUtils.formatDecimal(Math.abs(partnerLoanAmountEnrty.getValue())) + ".";
31697 amit.gupta 3681
                notificationService.sendNotification(fofoId, title, MessageType.notification, title, message, url);
30913 tejbeer 3682
 
31697 amit.gupta 3683
                notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30913 tejbeer 3684
 
31697 amit.gupta 3685
            }
30917 tejbeer 3686
 
31697 amit.gupta 3687
        }
30917 tejbeer 3688
 
31697 amit.gupta 3689
    }
30920 tejbeer 3690
 
31697 amit.gupta 3691
    public void processActivatedImeisForSchemes() throws ProfitMandiBusinessException {
3692
        schemeService.processActivatedImeisForSchemes();
3693
    }
30920 tejbeer 3694
 
31697 amit.gupta 3695
    public void updatePartnerLimit() throws ProfitMandiBusinessException {
3696
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
30913 tejbeer 3697
 
31886 tejbeer 3698
        Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
3699
        Map<Integer, CurrentPartnerDailyInvestment> currentPartnerDailyInvestmentMap = currentPartnerDailyInvestmentRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31697 amit.gupta 3700
        double limitValue = 100000;
3701
        for (Entry<Integer, CustomRetailer> customRetailerEntry : customRetailerMap.entrySet()) {
3702
            int fofoId = customRetailerEntry.getKey();
3703
            SDCreditRequirement sdCreditRequirement = sdCreditRequirementMap.get(customRetailerEntry.getKey());
3704
            LocalDateTime firstBillingDate = transactionRepository.getFirstBillingDate(fofoId);
3705
            CurrentPartnerDailyInvestment currentPartnerDailyInvestment = currentPartnerDailyInvestmentMap.get(fofoId);
3706
            BigDecimal suggestedAmount = BigDecimal.ZERO;
3707
            if (currentPartnerDailyInvestment != null) {
3708
                suggestedAmount = BigDecimal.valueOf(currentPartnerDailyInvestment.getTotalInvestment() * 0.1);
3709
            }
30929 tejbeer 3710
 
31697 amit.gupta 3711
            if (suggestedAmount.doubleValue() > limitValue) {
30929 tejbeer 3712
 
31697 amit.gupta 3713
                suggestedAmount = BigDecimal.valueOf(limitValue);
30929 tejbeer 3714
 
31697 amit.gupta 3715
            }
30913 tejbeer 3716
 
31697 amit.gupta 3717
            if (suggestedAmount.doubleValue() < 0) {
3718
                suggestedAmount = BigDecimal.ZERO;
3719
            }
30913 tejbeer 3720
 
31697 amit.gupta 3721
            LOGGER.info("suggestedAmount {} ", suggestedAmount);
30913 tejbeer 3722
 
31697 amit.gupta 3723
            if (sdCreditRequirement == null) {
3724
                sdCreditRequirement = new SDCreditRequirement();
3725
                sdCreditRequirement.setFofoId(fofoId);
3726
                sdCreditRequirement.setCreditDays(15);
3727
                sdCreditRequirement.setInterestRate(BigDecimal.valueOf(0.05));
3728
                sdCreditRequirement.setSuggestedLimit(suggestedAmount);
3729
                sdCreditRequirement.setRisk(CreditRisk.HIGH_RISK);
3730
                sdCreditRequirement.setLimit(suggestedAmount);
3731
                sdCreditRequirement.setUtilizedAmount(BigDecimal.ZERO);
3732
                sdCreditRequirement.setCreateTimestamp(LocalDateTime.now());
3733
                sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
3734
                sdCreditRequirementRepository.persist(sdCreditRequirement);
3735
            }
30913 tejbeer 3736
 
31697 amit.gupta 3737
            CreditRisk creditRisk = sdCreditService.getCurrentRisk(sdCreditRequirement, firstBillingDate);
30913 tejbeer 3738
 
31697 amit.gupta 3739
            sdCreditRequirement.setRisk(creditRisk);
30913 tejbeer 3740
 
31697 amit.gupta 3741
            sdCreditRequirement.setSuggestedLimit(suggestedAmount);
3742
            sdCreditRequirement.setLimit(suggestedAmount);
3743
            BigDecimal utilizedLimit = new BigDecimal(sdCreditService.getUtilizationAmount(fofoId));
30934 tejbeer 3744
 
31697 amit.gupta 3745
            BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);
30934 tejbeer 3746
 
31697 amit.gupta 3747
            LOGGER.info("utilizedLimit {} ", utilizedLimit);
30913 tejbeer 3748
 
31697 amit.gupta 3749
            LOGGER.info("availableLimit {} ", availableLimit);
30913 tejbeer 3750
 
31697 amit.gupta 3751
            sdCreditRequirement.setUtilizedAmount(utilizedLimit);
30929 tejbeer 3752
 
31697 amit.gupta 3753
            sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
30929 tejbeer 3754
 
31886 tejbeer 3755
            CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(sdCreditRequirement.getFofoId(), Gateway.SDDIRECT);
31697 amit.gupta 3756
            if (creditAccount != null) {
30929 tejbeer 3757
 
31697 amit.gupta 3758
                creditAccount.setInterestRate(sdCreditRequirement.getInterestRate().floatValue());
3759
                creditAccount.setSanctionedAmount(sdCreditRequirement.getLimit().floatValue());
3760
                creditAccount.setAvailableAmount(availableLimit.floatValue());
3761
                creditAccount.setFreeDays(sdCreditRequirement.getFreeDays());
3762
                creditAccount.setUpdatedOn(LocalDateTime.now());
3763
            }
30929 tejbeer 3764
 
31697 amit.gupta 3765
        }
31177 tejbeer 3766
 
31697 amit.gupta 3767
    }
30929 tejbeer 3768
 
31697 amit.gupta 3769
    public void notifyDefaultLoans() throws ProfitMandiBusinessException, MessagingException, IOException {
30929 tejbeer 3770
 
31697 amit.gupta 3771
        sdCreditService.updateRisk();
3772
        List<Loan> defaultLoans = sdCreditService.getDefaultLoan();
3773
        if (!defaultLoans.isEmpty()) {
3774
            this.sendDefaultLoanAlert(defaultLoans);
3775
        }
30929 tejbeer 3776
 
31697 amit.gupta 3777
    }
30929 tejbeer 3778
 
31886 tejbeer 3779
    public void sendDefaultLoanAlert(List<Loan> defaultLoans) throws ProfitMandiBusinessException, MessagingException, IOException {
31697 amit.gupta 3780
        String subject = "Default Partners";
30931 tejbeer 3781
 
31886 tejbeer 3782
        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 3783
 
31886 tejbeer 3784
        for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false).entrySet()) {
31697 amit.gupta 3785
            List<Loan> filteredRows = new ArrayList<>();
3786
            for (Loan loan : defaultLoans) {
30929 tejbeer 3787
 
31697 amit.gupta 3788
                if (storeGuyEntry.getValue().contains(loan.getFofoId())) {
30929 tejbeer 3789
 
31697 amit.gupta 3790
                    filteredRows.add(loan);
3791
                }
3792
            }
3793
            if (!filteredRows.isEmpty()) {
3794
                String messageText = this.getMessageForDueDateExtend(filteredRows);
3795
                String[] email = new String[]{storeGuyEntry.getKey()};
30982 tejbeer 3796
 
31697 amit.gupta 3797
                this.sendMailHtmlFormat(email, messageText, null, subject);
30982 tejbeer 3798
 
31697 amit.gupta 3799
            }
30936 tejbeer 3800
 
31697 amit.gupta 3801
        }
30982 tejbeer 3802
 
31697 amit.gupta 3803
        for (Loan defaultLoan : defaultLoans) {
3804
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
30929 tejbeer 3805
 
31886 tejbeer 3806
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30929 tejbeer 3807
 
31697 amit.gupta 3808
            com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(defaultLoan.getFofoId());
30936 tejbeer 3809
 
31697 amit.gupta 3810
            Address address = addressRepository.selectById(user.getAddressId());
30936 tejbeer 3811
 
31697 amit.gupta 3812
            String title = "Loan Amount Overdue!";
3813
            String url = "http://app.smartdukaan.com/pages/home/credit";
31886 tejbeer 3814
            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!!";
3815
            notificationService.sendNotification(defaultLoan.getFofoId(), title, MessageType.notification, title, message, url);
30936 tejbeer 3816
 
31697 amit.gupta 3817
            // notificationService.sendWhatsappMessage(message, title,
3818
            // address.getPhoneNumber());
30929 tejbeer 3819
 
31697 amit.gupta 3820
        }
3821
    }
30929 tejbeer 3822
 
31697 amit.gupta 3823
    private String getMessageForDueDateExtend(List<Loan> loans) throws ProfitMandiBusinessException {
3824
        StringBuilder sb = new StringBuilder();
3825
        sb.append(
31886 tejbeer 3826
                "<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';>");
3827
        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 3828
 
31697 amit.gupta 3829
                + "	    				</tr>");
3830
        for (Loan entry : loans) {
30929 tejbeer 3831
 
31697 amit.gupta 3832
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(entry.getId());
30929 tejbeer 3833
 
31886 tejbeer 3834
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30929 tejbeer 3835
 
31697 amit.gupta 3836
            long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getDueDate().toLocalDate(), LocalDateTime.now());
30929 tejbeer 3837
 
31697 amit.gupta 3838
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
30929 tejbeer 3839
 
31697 amit.gupta 3840
            sb.append("<tr>");
31886 tejbeer 3841
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
31397 tejbeer 3842
 
31886 tejbeer 3843
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getDueDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
31697 amit.gupta 3844
            sb.append("<td style='border:1px solid black;padding: 5px'>" + noOfdaysBetween + "</td>");
31886 tejbeer 3845
            sb.append("<td style='border:1px solid black;padding: 5px'>" + new DecimalFormat("#.##").format(Math.abs(amount)) + "</td>");
31397 tejbeer 3846
 
31697 amit.gupta 3847
            sb.append("</tr>");
31397 tejbeer 3848
 
31697 amit.gupta 3849
        }
31397 tejbeer 3850
 
31697 amit.gupta 3851
        sb.append("</tbody></table></body></html>");
31397 tejbeer 3852
 
31697 amit.gupta 3853
        return sb.toString();
3854
    }
31397 tejbeer 3855
 
31697 amit.gupta 3856
    private String getMessageForDueDateCross(List<Loan> loans) throws ProfitMandiBusinessException {
3857
        StringBuilder sb = new StringBuilder();
31886 tejbeer 3858
        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';>");
3859
        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 3860
 
31697 amit.gupta 3861
                + "	    				</tr>");
3862
        for (Loan entry : loans) {
31397 tejbeer 3863
 
31697 amit.gupta 3864
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(entry.getId());
31397 tejbeer 3865
 
31886 tejbeer 3866
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
31397 tejbeer 3867
 
31697 amit.gupta 3868
            long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getDueDate().toLocalDate(), LocalDateTime.now());
31397 tejbeer 3869
 
31697 amit.gupta 3870
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
31397 tejbeer 3871
 
31697 amit.gupta 3872
            sb.append("<tr>");
31886 tejbeer 3873
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
30936 tejbeer 3874
 
31886 tejbeer 3875
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getDueDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
31697 amit.gupta 3876
            sb.append("<td style='border:1px solid black;padding: 5px'>" + noOfdaysBetween + "</td>");
31886 tejbeer 3877
            sb.append("<td style='border:1px solid black;padding: 5px'>" + new DecimalFormat("#.##").format(Math.abs(amount)) + "</td>");
30936 tejbeer 3878
 
31697 amit.gupta 3879
            sb.append("</tr>");
31397 tejbeer 3880
 
31697 amit.gupta 3881
        }
31397 tejbeer 3882
 
31697 amit.gupta 3883
        sb.append("</tbody></table></body></html>");
31397 tejbeer 3884
 
31697 amit.gupta 3885
        return sb.toString();
3886
    }
31397 tejbeer 3887
 
31697 amit.gupta 3888
    public void notifyLoanDueDateCross() throws ProfitMandiBusinessException, MessagingException, IOException {
31397 tejbeer 3889
 
31697 amit.gupta 3890
        List<Loan> dueDateCrossLoans = sdCreditService.getDueDateCrossLoan();
3891
        if (!dueDateCrossLoans.isEmpty()) {
3892
            this.sendDueDateCrossLoanAlert(dueDateCrossLoans);
3893
        }
31397 tejbeer 3894
 
31697 amit.gupta 3895
    }
31397 tejbeer 3896
 
31886 tejbeer 3897
    private void sendDueDateCrossLoanAlert(List<Loan> dueDateCrossLoans) throws ProfitMandiBusinessException, MessagingException, IOException {
3898
        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 3899
 
31886 tejbeer 3900
        for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false).entrySet()) {
31697 amit.gupta 3901
            List<Loan> filteredRows = new ArrayList<>();
3902
            for (Loan loan : dueDateCrossLoans) {
30936 tejbeer 3903
 
31697 amit.gupta 3904
                if (storeGuyEntry.getValue().contains(loan.getFofoId())) {
30982 tejbeer 3905
 
31697 amit.gupta 3906
                    filteredRows.add(loan);
3907
                }
3908
            }
3909
            if (!filteredRows.isEmpty()) {
3910
                String messageText = this.getMessageForDueDateCross(filteredRows);
3911
                String[] email = new String[]{storeGuyEntry.getKey()};
30982 tejbeer 3912
 
31697 amit.gupta 3913
                this.sendMailHtmlFormat(email, messageText, null, "Due Date Cross");
30936 tejbeer 3914
 
31697 amit.gupta 3915
            }
30936 tejbeer 3916
 
31697 amit.gupta 3917
        }
3918
        if (!dueDateCrossLoans.isEmpty()) {
3919
            for (Loan loan : dueDateCrossLoans) {
30936 tejbeer 3920
 
31697 amit.gupta 3921
                long noOfdaysBetween = ChronoUnit.DAYS.between(loan.getDueDate().toLocalDate(), LocalDate.now());
30989 tejbeer 3922
 
31697 amit.gupta 3923
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(loan.getFofoId());
30989 tejbeer 3924
 
31697 amit.gupta 3925
                Address address = addressRepository.selectById(user.getAddressId());
30982 tejbeer 3926
 
31697 amit.gupta 3927
                LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
30982 tejbeer 3928
 
31697 amit.gupta 3929
                List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
30936 tejbeer 3930
 
31886 tejbeer 3931
                double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30936 tejbeer 3932
 
31697 amit.gupta 3933
                String url = "http://app.smartdukaan.com/pages/home/credit";
30936 tejbeer 3934
 
31697 amit.gupta 3935
                String title = "Alert!";
31886 tejbeer 3936
                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 3937
 
31886 tejbeer 3938
                notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title, message, url);
30936 tejbeer 3939
 
31697 amit.gupta 3940
                notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 3941
 
31697 amit.gupta 3942
            }
3943
        }
30982 tejbeer 3944
 
31697 amit.gupta 3945
    }
30936 tejbeer 3946
 
31697 amit.gupta 3947
    public void alertForDueDate() throws ProfitMandiBusinessException, MessagingException, IOException {
30936 tejbeer 3948
 
31697 amit.gupta 3949
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30936 tejbeer 3950
 
31697 amit.gupta 3951
        if (!loans.isEmpty()) {
3952
            for (Loan loan : loans) {
30936 tejbeer 3953
 
31697 amit.gupta 3954
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(loan.getFofoId());
30936 tejbeer 3955
 
31697 amit.gupta 3956
                Address address = addressRepository.selectById(user.getAddressId());
30936 tejbeer 3957
 
31697 amit.gupta 3958
                long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), loan.getDueDate().toLocalDate());
30936 tejbeer 3959
 
31697 amit.gupta 3960
                LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
30982 tejbeer 3961
 
31697 amit.gupta 3962
                if (noOfdaysBetween <= 4 && noOfdaysBetween >= 0) {
3963
                    List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
31886 tejbeer 3964
                    double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30936 tejbeer 3965
 
31697 amit.gupta 3966
                    String title = "Alert!";
3967
                    String url = "http://app.smartdukaan.com/pages/home/credit";
3968
                    String message = null;
3969
                    if (noOfdaysBetween == 0) {
30936 tejbeer 3970
 
31886 tejbeer 3971
                        message = "Your total pending Loan amount is Rs." + FormattingUtils.formatDecimal(Math.abs(amount)) + " is due for Today, Pay Now!!";
30982 tejbeer 3972
 
31697 amit.gupta 3973
                    } else {
30982 tejbeer 3974
 
31886 tejbeer 3975
                        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 3976
 
31697 amit.gupta 3977
                    }
31886 tejbeer 3978
                    notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title, message, url);
31697 amit.gupta 3979
                    notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 3980
 
31697 amit.gupta 3981
                }
3982
            }
3983
        }
30984 tejbeer 3984
 
31697 amit.gupta 3985
    }
30982 tejbeer 3986
 
31697 amit.gupta 3987
    public void userMobileNumberOptIn() throws HttpHostConnectException, ProfitMandiBusinessException {
30982 tejbeer 3988
 
31697 amit.gupta 3989
        List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
30982 tejbeer 3990
 
31886 tejbeer 3991
        List<com.spice.profitmandi.dao.entity.user.User> users = userUserRepository.selectByIds(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
30982 tejbeer 3992
 
31886 tejbeer 3993
        List<Address> addresses = addressRepository.selectByIds(users.stream().map(x -> x.getAddressId()).collect(Collectors.toList()));
30982 tejbeer 3994
 
31697 amit.gupta 3995
        LOGGER.info("addresses" + addresses);
30984 tejbeer 3996
 
31697 amit.gupta 3997
        for (Address address : addresses) {
3998
            Map<String, String> requestheaders = new HashMap<>();
3999
            requestheaders.put("Content-Type", "application/x-www-form-urlencoded");
4000
            Map<String, String> requestParams = new HashMap<>();
4001
            requestParams.put("userid", String.valueOf(2000215976));
4002
            requestParams.put("password", "MFRd!BBL");
4003
            requestParams.put("phone_number", address.getPhoneNumber());
4004
            requestParams.put("auth_scheme", "plain");
4005
            requestParams.put("v", "1.1");
4006
            requestParams.put("format", "json");
30982 tejbeer 4007
 
31697 amit.gupta 4008
            requestParams.put("method", "OPT_IN");
30982 tejbeer 4009
 
31697 amit.gupta 4010
            requestParams.put("channel", "WHATSAPP");
31886 tejbeer 4011
            String response = restClient.get("https://media.smsgupshup.com/GatewayAPI/rest", requestParams, requestheaders);
31697 amit.gupta 4012
            LOGGER.info("response" + response);
4013
        }
30982 tejbeer 4014
 
31697 amit.gupta 4015
    }
30982 tejbeer 4016
 
31697 amit.gupta 4017
    public void authUserMobileNumberOptIn() throws HttpHostConnectException, ProfitMandiBusinessException {
31206 tejbeer 4018
 
31697 amit.gupta 4019
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
4020
        LOGGER.info("authUsers" + authUsers);
31206 tejbeer 4021
 
31697 amit.gupta 4022
        for (AuthUser authUser : authUsers) {
4023
            Map<String, String> requestheaders = new HashMap<>();
4024
            requestheaders.put("Content-Type", "application/x-www-form-urlencoded");
4025
            Map<String, String> requestParams = new HashMap<>();
4026
            requestParams.put("userid", String.valueOf(2000215976));
4027
            requestParams.put("password", "MFRd!BBL");
4028
            requestParams.put("phone_number", authUser.getMobileNumber());
4029
            requestParams.put("auth_scheme", "plain");
4030
            requestParams.put("v", "1.1");
4031
            requestParams.put("format", "json");
31206 tejbeer 4032
 
31697 amit.gupta 4033
            requestParams.put("method", "OPT_IN");
31206 tejbeer 4034
 
31697 amit.gupta 4035
            requestParams.put("channel", "WHATSAPP");
31886 tejbeer 4036
            String response = restClient.get("https://media.smsgupshup.com/GatewayAPI/rest", requestParams, requestheaders);
31697 amit.gupta 4037
            LOGGER.info("response" + response);
4038
        }
31206 tejbeer 4039
 
31697 amit.gupta 4040
    }
31206 tejbeer 4041
 
31697 amit.gupta 4042
    @Autowired
4043
    private HygieneDataRepository hygieneDataRepository;
31209 tejbeer 4044
 
31697 amit.gupta 4045
    public void hygineAlertForPartner() throws ProfitMandiBusinessException, MessagingException, IOException {
31206 tejbeer 4046
 
31697 amit.gupta 4047
        List<String> remarks = new ArrayList<>();
4048
        remarks.add("Out of Service");
4049
        remarks.add("Duplicate number");
4050
        remarks.add("Partner number");
31886 tejbeer 4051
        List<HygieneData> hygieneData = hygieneDataRepository.selectAllByDisposedDateAndRemark(LocalDate.now(), remarks);
31206 tejbeer 4052
 
31697 amit.gupta 4053
        if (!hygieneData.isEmpty()) {
31206 tejbeer 4054
 
31886 tejbeer 4055
            Map<Integer, List<HygieneData>> partnerHygieneDataMap = hygieneData.stream().collect(groupingBy(x -> x.getFofoId()));
31206 tejbeer 4056
 
31697 amit.gupta 4057
            for (Entry<Integer, List<HygieneData>> partnerHygieneDataMapEntry : partnerHygieneDataMap.entrySet()) {
31206 tejbeer 4058
 
31697 amit.gupta 4059
                CustomRetailer customRetailer = retailerService.getFofoRetailer(partnerHygieneDataMapEntry.getKey());
31206 tejbeer 4060
 
31697 amit.gupta 4061
                StringBuilder sb = new StringBuilder();
31886 tejbeer 4062
                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 4063
 
31886 tejbeer 4064
                        + " </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 4065
 
31697 amit.gupta 4066
                        + "<br/><table style='border:1px solid black ;padding: 5px';>");
4067
                sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4068
                sb.append("<th style='border:1px solid black;padding: 5px'>Invoice Number</th>\n");
4069
                sb.append("<th style='border:1px solid black;padding: 5px'>Customer Name</th>\n");
4070
                sb.append("<th style='border:1px solid black;padding: 5px'>Customer Number</th>\n");
4071
                sb.append("</tr>\n");
31206 tejbeer 4072
 
31697 amit.gupta 4073
                List<HygieneData> hygienes = partnerHygieneDataMapEntry.getValue();
31206 tejbeer 4074
 
31697 amit.gupta 4075
                List<Integer> orderIds = hygienes.stream().map(x -> x.getOrderId()).collect(Collectors.toList());
31206 tejbeer 4076
 
31697 amit.gupta 4077
                List<FofoOrder> fofoOrders = fofoOrderRepository.selectAllByOrderIds(orderIds);
31206 tejbeer 4078
 
31697 amit.gupta 4079
                for (FofoOrder fofoOrder : fofoOrders) {
4080
                    Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
4081
                    sb.append("<tr>");
31886 tejbeer 4082
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoOrder.getInvoiceNumber() + "</td>\n");
4083
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customer.getFirstName() + "" + customer.getLastName() + "</td>\n");
4084
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customer.getMobileNumber() + "</td>\n");
31206 tejbeer 4085
 
31697 amit.gupta 4086
                    sb.append("</tr>\n");
4087
                }
31206 tejbeer 4088
 
31697 amit.gupta 4089
                sb.append("</tbody></table></body></html>");
4090
                String subject = "Customer Info - Hygiene Alert";
31206 tejbeer 4091
 
31697 amit.gupta 4092
                this.sendMailOfHtmlFormat(customRetailer.getEmail(), sb.toString(), null, subject);
31206 tejbeer 4093
 
31697 amit.gupta 4094
            }
31206 tejbeer 4095
 
31697 amit.gupta 4096
        }
31206 tejbeer 4097
 
31697 amit.gupta 4098
    }
31206 tejbeer 4099
 
31697 amit.gupta 4100
    public void hygineAlertForInternalTeam() throws ProfitMandiBusinessException, MessagingException, IOException {
31206 tejbeer 4101
 
31697 amit.gupta 4102
        List<String> remarks = new ArrayList<>();
4103
        remarks.add("Out of Service");
4104
        remarks.add("Duplicate number");
4105
        remarks.add("Partner number");
31886 tejbeer 4106
        List<HygieneData> hygieneDataLastThreeMonth = hygieneDataRepository.selectDisposedDateAndRemarks(
4107
                LocalDate.now().withDayOfMonth(1).minusMonths(3).atStartOfDay(), LocalDate.now().minusMonths(1).withDayOfMonth(LocalDate.now().minusMonths(1).lengthOfMonth()).atTime(LocalTime.MAX), remarks);
31206 tejbeer 4108
 
31886 tejbeer 4109
        List<HygieneData> hygieneDataRecentMonth = hygieneDataRepository.selectDisposedDateAndRemarks(LocalDate.now().withDayOfMonth(1), remarks);
31697 amit.gupta 4110
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
4111
        Map<Integer, List<HygieneData>> partnerHygieneLastThreeMonthMap = null;
31206 tejbeer 4112
 
31697 amit.gupta 4113
        Map<Integer, List<HygieneData>> partnerHygieneDataRecentMonth = null;
31206 tejbeer 4114
 
31697 amit.gupta 4115
        if (!hygieneDataLastThreeMonth.isEmpty()) {
31886 tejbeer 4116
            partnerHygieneLastThreeMonthMap = hygieneDataLastThreeMonth.stream().collect(groupingBy(x -> x.getFofoId()));
31206 tejbeer 4117
 
31697 amit.gupta 4118
        }
31206 tejbeer 4119
 
31697 amit.gupta 4120
        if (!hygieneDataRecentMonth.isEmpty()) {
31886 tejbeer 4121
            partnerHygieneDataRecentMonth = hygieneDataRecentMonth.stream().collect(groupingBy(x -> x.getFofoId()));
31697 amit.gupta 4122
        }
31206 tejbeer 4123
 
31697 amit.gupta 4124
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
31206 tejbeer 4125
 
31697 amit.gupta 4126
            String email = storeGuyEntry.getKey();
31206 tejbeer 4127
 
31697 amit.gupta 4128
            List<Integer> fofoIds = new ArrayList<>(storeGuyEntry.getValue());
31206 tejbeer 4129
 
31697 amit.gupta 4130
            Map<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthData = new HashMap<>();
4131
            Map<Integer, Map<LocalDate, List<HygieneData>>> partnerDateWiseData = new HashMap<>();
4132
            for (Integer fofoId : fofoIds) {
31206 tejbeer 4133
 
31697 amit.gupta 4134
                partnerYearMonthData.put(fofoId, null);
4135
                partnerDateWiseData.put(fofoId, null);
4136
                if (!partnerHygieneLastThreeMonthMap.isEmpty()) {
4137
                    List<HygieneData> hygienes = partnerHygieneLastThreeMonthMap.get(fofoId);
31206 tejbeer 4138
 
31697 amit.gupta 4139
                    if (hygienes != null) {
31886 tejbeer 4140
                        Map<YearMonth, List<HygieneData>> yearMonthData = hygienes.stream().collect(groupingBy(x -> YearMonth.from(x.getDisposedTimestamp())));
31206 tejbeer 4141
 
31697 amit.gupta 4142
                        partnerYearMonthData.put(fofoId, yearMonthData);
31206 tejbeer 4143
 
31697 amit.gupta 4144
                    }
4145
                    List<HygieneData> dateWiseHygienes = partnerHygieneDataRecentMonth.get(fofoId);
31206 tejbeer 4146
 
31697 amit.gupta 4147
                    if (dateWiseHygienes != null) {
31206 tejbeer 4148
 
31886 tejbeer 4149
                        Map<LocalDate, List<HygieneData>> dateWiseData = hygienes.stream().collect(groupingBy(x -> (x.getDisposedTimestamp()).toLocalDate()));
31206 tejbeer 4150
 
31697 amit.gupta 4151
                        partnerDateWiseData.put(fofoId, dateWiseData);
31206 tejbeer 4152
 
31697 amit.gupta 4153
                    }
31206 tejbeer 4154
 
31697 amit.gupta 4155
                }
31206 tejbeer 4156
 
31697 amit.gupta 4157
            }
31206 tejbeer 4158
 
31697 amit.gupta 4159
            String subject = "Customer Info - Hygiene Alert";
31206 tejbeer 4160
 
31697 amit.gupta 4161
            LOGGER.info("hygieneData {}", partnerDateWiseData.values());
31206 tejbeer 4162
 
31697 amit.gupta 4163
            boolean partnerDateWise = partnerDateWiseData.values().stream().allMatch(Objects::isNull);
31206 tejbeer 4164
 
31697 amit.gupta 4165
            boolean partnerYearMonth = partnerYearMonthData.values().stream().allMatch(Objects::isNull);
31206 tejbeer 4166
 
31697 amit.gupta 4167
            if (!partnerDateWise && !partnerYearMonth) {
4168
                String sb = this.getMessageHygieneAlertForPartner(partnerYearMonthData, partnerDateWiseData);
4169
                this.sendMailOfHtmlFormat(email, sb, null, subject);
4170
            }
31206 tejbeer 4171
 
31697 amit.gupta 4172
        }
31206 tejbeer 4173
 
31697 amit.gupta 4174
    }
31206 tejbeer 4175
 
31697 amit.gupta 4176
    private String getMessageHygieneAlertForPartner(
32084 tejbeer 4177
                                                    Map<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthData, Map<Integer, Map<LocalDate, List<HygieneData>>> partnerDateWiseData) {
31206 tejbeer 4178
 
31697 amit.gupta 4179
        Map<Integer, CustomRetailer> customeRetailerMap = retailerService.getAllFofoRetailers();
31206 tejbeer 4180
 
31697 amit.gupta 4181
        LocalDateTime startDate = LocalDate.now().withDayOfMonth(1).atStartOfDay();
4182
        LocalDateTime endDate = LocalDateTime.now();
31206 tejbeer 4183
 
31697 amit.gupta 4184
        LocalDateTime startYearMonth = LocalDate.now().withDayOfMonth(1).minusMonths(3).atStartOfDay();
31886 tejbeer 4185
        LocalDateTime endYearMonth = LocalDate.now().minusMonths(1).withDayOfMonth(LocalDate.now().minusMonths(1).lengthOfMonth()).atTime(LocalTime.MAX);
31206 tejbeer 4186
 
31697 amit.gupta 4187
        DateTimeFormatter dateYearMonthFormatter = DateTimeFormatter.ofPattern("MMM''uu");
31206 tejbeer 4188
 
31697 amit.gupta 4189
        List<YearMonth> yearMonthRange = new ArrayList<>();
4190
        yearMonthRange.add(YearMonth.from(startYearMonth));
31206 tejbeer 4191
 
31697 amit.gupta 4192
        yearMonthRange.add(YearMonth.from(startYearMonth.plusMonths(1)));
31206 tejbeer 4193
 
31697 amit.gupta 4194
        yearMonthRange.add(YearMonth.from(endYearMonth));
31206 tejbeer 4195
 
31697 amit.gupta 4196
        long noOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate.plusDays(1));
31206 tejbeer 4197
 
31886 tejbeer 4198
        List<LocalDate> dateRange = Stream.iterate(startDate.toLocalDate(), date -> date.plusDays(1)).limit(noOfDaysBetween).collect(Collectors.toList());
31206 tejbeer 4199
 
31697 amit.gupta 4200
        StringBuilder sb = new StringBuilder();
31886 tejbeer 4201
        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 4202
 
31697 amit.gupta 4203
                + "<table style='border:1px solid black ;padding: 5px';>");
4204
        sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4205
        sb.append("<th style='border:1px solid black;padding: 5px'>Partner Name</th>\n");
31206 tejbeer 4206
 
31697 amit.gupta 4207
        for (YearMonth yearMonth : yearMonthRange) {
31886 tejbeer 4208
            sb.append("<th style='border:1px solid black;padding: 5px'>" + yearMonth.format(dateYearMonthFormatter) + "</th>\n");
31697 amit.gupta 4209
        }
31206 tejbeer 4210
 
31697 amit.gupta 4211
        for (LocalDate localDate : dateRange) {
4212
            sb.append("<th style='border:1px solid black;padding: 5px'>" + localDate + "</th>\n");
4213
        }
31206 tejbeer 4214
 
31697 amit.gupta 4215
        sb.append("</tr>\n");
31206 tejbeer 4216
 
31886 tejbeer 4217
        for (Entry<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthEntry : partnerYearMonthData.entrySet()) {
31206 tejbeer 4218
 
31697 amit.gupta 4219
            int fofoId = partnerYearMonthEntry.getKey();
31206 tejbeer 4220
 
31697 amit.gupta 4221
            Map<YearMonth, List<HygieneData>> yearMonthData = partnerYearMonthEntry.getValue();
31206 tejbeer 4222
 
31697 amit.gupta 4223
            Map<LocalDate, List<HygieneData>> dateWiseData = partnerDateWiseData.get(fofoId);
31206 tejbeer 4224
 
31697 amit.gupta 4225
            if (yearMonthData == null && dateWiseData == null) {
4226
                continue;
4227
            }
31206 tejbeer 4228
 
31697 amit.gupta 4229
            sb.append("<tr>");
31886 tejbeer 4230
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customeRetailerMap.get(fofoId).getBusinessName() + "</td>\n");
31697 amit.gupta 4231
            for (YearMonth yearMonth : yearMonthRange) {
31206 tejbeer 4232
 
31697 amit.gupta 4233
                if (yearMonthData == null) {
4234
                    sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4235
 
31697 amit.gupta 4236
                } else {
4237
                    List<HygieneData> hygieneList = yearMonthData.get(yearMonth);
31206 tejbeer 4238
 
31697 amit.gupta 4239
                    if (hygieneList != null) {
4240
                        sb.append("<td style='border:1px solid black;padding: 5px'>" + hygieneList.size() + "</td>\n");
31206 tejbeer 4241
 
31697 amit.gupta 4242
                    } else {
4243
                        sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4244
 
31697 amit.gupta 4245
                    }
4246
                }
4247
            }
31206 tejbeer 4248
 
31697 amit.gupta 4249
            for (LocalDate localDate : dateRange) {
31206 tejbeer 4250
 
31697 amit.gupta 4251
                if (dateWiseData == null) {
4252
                    sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4253
 
31697 amit.gupta 4254
                } else {
4255
                    List<HygieneData> hygieneList = dateWiseData.get(localDate);
31206 tejbeer 4256
 
31697 amit.gupta 4257
                    if (hygieneList != null) {
4258
                        sb.append("<td style='border:1px solid black;padding: 5px'>" + hygieneList.size() + "</td>\n");
31218 tejbeer 4259
 
31697 amit.gupta 4260
                    } else {
4261
                        sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31218 tejbeer 4262
 
31697 amit.gupta 4263
                    }
4264
                }
4265
            }
4266
            sb.append("</tr>");
31218 tejbeer 4267
 
31697 amit.gupta 4268
        }
31218 tejbeer 4269
 
31697 amit.gupta 4270
        sb.append("</tbody></table></body></html>");
31218 tejbeer 4271
 
31697 amit.gupta 4272
        return sb.toString();
4273
    }
31218 tejbeer 4274
 
31697 amit.gupta 4275
    @Autowired
4276
    private MonthlyTargetRepository monthlyTargetRepository;
31218 tejbeer 4277
 
31697 amit.gupta 4278
    public void monthlyTargetForPartner() throws MessagingException, ProfitMandiBusinessException, IOException {
31218 tejbeer 4279
 
31697 amit.gupta 4280
        LocalDateTime curDate = LocalDateTime.now();
4281
        List<MonthlyTarget> monthlyTargets = monthlyTargetRepository.selectByDate(YearMonth.now());
31218 tejbeer 4282
 
31886 tejbeer 4283
        Map<Integer, MonthlyTarget> partnersMonthlyTarget = monthlyTargets.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31218 tejbeer 4284
 
31886 tejbeer 4285
        Map<Integer, Double> secondaryMtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
4286
        Map<Integer, Double> todaytertiary = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate, curDate.with(LocalTime.MAX), 0, false);
31218 tejbeer 4287
 
31697 amit.gupta 4288
        String subject = "Monthly Target Vs Achievement";
31218 tejbeer 4289
 
31697 amit.gupta 4290
        for (Entry<Integer, MonthlyTarget> partnerMonthlyTargetEntry : partnersMonthlyTarget.entrySet()) {
31249 tejbeer 4291
 
31697 amit.gupta 4292
            int fofoId = partnerMonthlyTargetEntry.getKey();
31249 tejbeer 4293
 
31697 amit.gupta 4294
            CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
31249 tejbeer 4295
 
31697 amit.gupta 4296
            Double purchaseTarget = partnerMonthlyTargetEntry.getValue().getPurchaseTarget();
31218 tejbeer 4297
 
31697 amit.gupta 4298
            Double saleTarget = partnerMonthlyTargetEntry.getValue().getSaleTarget();
31218 tejbeer 4299
 
31697 amit.gupta 4300
            if (purchaseTarget > 0) {
4301
                Double purchase = secondaryMtd.get(fofoId);
31249 tejbeer 4302
 
31697 amit.gupta 4303
                if (purchase == null) {
4304
                    purchase = 0.0;
4305
                }
31218 tejbeer 4306
 
31697 amit.gupta 4307
                Double balanceTarget = purchaseTarget - purchase;
31218 tejbeer 4308
 
31697 amit.gupta 4309
                if (balanceTarget <= 0) {
4310
                    balanceTarget = 0.0;
4311
                }
31651 tejbeer 4312
 
31697 amit.gupta 4313
                StringBuilder sb = new StringBuilder();
4314
                sb.append("<html><body><p>Dear Partner,\n");
31886 tejbeer 4315
                sb.append("<p>Pls note your agreed monthly target is Rs." + purchaseTarget + " and your achievement till date is Rs." + purchase + "</p>");
31697 amit.gupta 4316
                sb.append("<p>Pls note that your balance target is Rs." + balanceTarget + "</p>\n");
4317
                sb.append(
31886 tejbeer 4318
                        "<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 4319
 
31697 amit.gupta 4320
                this.sendMailOfHtmlFormat(customRetailer.getEmail(), sb.toString(), null, subject);
31218 tejbeer 4321
 
31697 amit.gupta 4322
                // this.sendMailOfHtmlFormat("tejbeer.kaur@smartdukaan.com", sb.toString(),
4323
                // null, subject);
31640 tejbeer 4324
 
31697 amit.gupta 4325
            }
31218 tejbeer 4326
 
31697 amit.gupta 4327
        }
31218 tejbeer 4328
 
31697 amit.gupta 4329
    }
31218 tejbeer 4330
 
31697 amit.gupta 4331
    public void monthlyTargetForInternalTeam() throws MessagingException, ProfitMandiBusinessException, IOException {
31218 tejbeer 4332
 
31697 amit.gupta 4333
        LocalDateTime curDate = LocalDateTime.now();
31218 tejbeer 4334
 
31886 tejbeer 4335
        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 4336
 
31697 amit.gupta 4337
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false);
31218 tejbeer 4338
 
31697 amit.gupta 4339
        List<MonthlyTarget> monthlyTargets = monthlyTargetRepository.selectByDate(YearMonth.now());
31218 tejbeer 4340
 
31697 amit.gupta 4341
        Map<Integer, CustomRetailer> customeRetailerMap = retailerService.getAllFofoRetailers();
31218 tejbeer 4342
 
31886 tejbeer 4343
        Map<Integer, MonthlyTarget> partnersMonthlyTarget = monthlyTargets.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31218 tejbeer 4344
 
31886 tejbeer 4345
        Map<Integer, Double> secondaryMtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
4346
        Map<Integer, Double> todaytertiary = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate, curDate.with(LocalTime.MAX), 0, false);
31218 tejbeer 4347
 
31697 amit.gupta 4348
        String subject = "Monthly Target Vs Achievement";
31218 tejbeer 4349
 
31697 amit.gupta 4350
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
31218 tejbeer 4351
 
31697 amit.gupta 4352
            String email = storeGuyEntry.getKey();
31218 tejbeer 4353
 
31697 amit.gupta 4354
            List<Integer> fofoIds = new ArrayList<>(storeGuyEntry.getValue());
4355
            Map<Integer, MonthlyTarget> monthlyTargetAchievement = new HashMap<>();
4356
            for (Integer fofoId : fofoIds) {
31218 tejbeer 4357
 
31697 amit.gupta 4358
                MonthlyTarget monthlyTarget = partnersMonthlyTarget.get(fofoId);
4359
                if (monthlyTarget != null) {
4360
                    Double purchaseTarget = monthlyTarget.getPurchaseTarget();
31218 tejbeer 4361
 
31697 amit.gupta 4362
                    Double saleTarget = monthlyTarget.getSaleTarget();
31218 tejbeer 4363
 
31697 amit.gupta 4364
                    if (purchaseTarget != null && purchaseTarget > 0) {
4365
                        Double purchase = secondaryMtd.get(fofoId);
4366
                        if (purchase == null) {
4367
                            purchase = 0.0;
4368
                        }
4369
                        monthlyTarget.setPurchaseAchievement(purchase);
4370
                        monthlyTargetAchievement.put(fofoId, monthlyTarget);
31218 tejbeer 4371
 
31697 amit.gupta 4372
                    }
4373
                }
4374
            }
31218 tejbeer 4375
 
31697 amit.gupta 4376
            if (!monthlyTargetAchievement.isEmpty()) {
31218 tejbeer 4377
 
31697 amit.gupta 4378
                StringBuilder sb = new StringBuilder();
31218 tejbeer 4379
 
31697 amit.gupta 4380
                sb.append("<html><body><p>Hi,\n");
31886 tejbeer 4381
                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 4382
                sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4383
                sb.append("<th style='border:1px solid black;padding: 5px'>Partner Name</th>\n");
31218 tejbeer 4384
 
31697 amit.gupta 4385
                sb.append("<th style='border:1px solid black;padding: 5px'>Purchase Target</th>\n");
31218 tejbeer 4386
 
31697 amit.gupta 4387
                sb.append("<th style='border:1px solid black;padding: 5px'>Purchase Achievement</th>\n");
4388
                sb.append("</tr>\n");
31218 tejbeer 4389
 
31886 tejbeer 4390
                for (Entry<Integer, MonthlyTarget> monthlyTargetAchievementEntry : monthlyTargetAchievement.entrySet()) {
31697 amit.gupta 4391
                    sb.append("<tr>");
4392
                    int fofoId = monthlyTargetAchievementEntry.getKey();
31218 tejbeer 4393
 
31697 amit.gupta 4394
                    MonthlyTarget monthlyTarget = monthlyTargetAchievementEntry.getValue();
31886 tejbeer 4395
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customeRetailerMap.get(fofoId).getBusinessName() + "</td>\n");
31218 tejbeer 4396
 
31886 tejbeer 4397
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + monthlyTarget.getPurchaseTarget() + "</td>\n");
31218 tejbeer 4398
 
31886 tejbeer 4399
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + monthlyTarget.getPurchaseAchievement() + "</td>\n");
31218 tejbeer 4400
 
31697 amit.gupta 4401
                    sb.append("</tr>\n");
31218 tejbeer 4402
 
31697 amit.gupta 4403
                }
31218 tejbeer 4404
 
31697 amit.gupta 4405
                this.sendMailOfHtmlFormat(email, sb.toString(), null, subject);
4406
                // this.sendMailOfHtmlFormat("tejbeer.kaur@smartdukaan.com", sb.toString(),
4407
                // null, subject);
31218 tejbeer 4408
 
31697 amit.gupta 4409
            }
31604 tejbeer 4410
 
31697 amit.gupta 4411
        }
31604 tejbeer 4412
 
31697 amit.gupta 4413
    }
31604 tejbeer 4414
 
32061 amit.gupta 4415
    @Autowired
4416
    private PerformanceService performanceService;
4417
 
4418
 
4419
    public void sendFilteredRetailerPerformance() throws Exception {
4420
        RetailerFilterModel retailerFilterModel = performanceService.getRetailerFilterModel();
4421
 
4422
        Map<Integer, CustomRetailer> customRetailers = retailerService.getFofoRetailers(true);
4423
 
4424
 
4425
        List<RetailerPeformanceFilterModel> partnersPerformance = performanceService.getPerformance(retailerFilterModel, customRetailers);
4426
 
4427
        Map<Integer, RetailerPeformanceFilterModel> partnersPerformanceMap = new HashMap<>();
4428
 
4429
        if (!partnersPerformance.isEmpty()) {
4430
            partnersPerformanceMap = partnersPerformance.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
4431
            performanceService.sendPartnerPerformanceEmail(partnersPerformanceMap, retailerFilterModel, customRetailers);
4432
 
4433
        }
4434
 
4435
 
4436
    }
4437
 
32081 tejbeer 4438
    @Autowired
4439
    private VendorItemPricingRepository vendorItemPricingRepository;
32061 amit.gupta 4440
 
32081 tejbeer 4441
    @Autowired
4442
    private VendorCatalogPricingLogRepository vendorCatalogPricingLogRepository;
4443
 
4444
 
4445
    @Autowired
4446
    private VendorCatalogPricingService vendorCatalogPricingService;
4447
 
4448
 
4449
    public void migrateVendorItemPricing() {
4450
 
4451
        List<VendorItemPricing> vendorItemPricings = vendorItemPricingRepository.selectAll();
32092 tejbeer 4452
 
4453
        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 4454
        for (VendorItemPricing vendorItemPricing : vendorItemPricings) {
4455
            Item item = null;
32092 tejbeer 4456
            if (items.get(vendorItemPricing.getItemId()) != null) {
4457
                item = items.get(vendorItemPricing.getItemId());
4458
            } else {
32084 tejbeer 4459
                continue;
32081 tejbeer 4460
            }
32092 tejbeer 4461
 
32081 tejbeer 4462
            VendorCatalogPricingModel vendorCatalogPricingModel = new VendorCatalogPricingModel();
4463
            vendorCatalogPricingModel.setCatalogId(item.getCatalogItemId());
4464
            vendorCatalogPricingModel.setAuthId(13);
32088 tejbeer 4465
            vendorCatalogPricingModel.setDp(vendorItemPricing.getDp());
32081 tejbeer 4466
 
4467
            vendorCatalogPricingModel.setTp(vendorItemPricing.getTp());
4468
            vendorCatalogPricingModel.setMop(vendorItemPricing.getMop());
32087 tejbeer 4469
            vendorCatalogPricingModel.setEffectedOn(LocalDate.now().minusDays(1));
32081 tejbeer 4470
            vendorCatalogPricingModel.setVendorId(vendorItemPricing.getVendorId());
4471
 
4472
 
4473
            try {
4474
                vendorCatalogPricingService.createVendorCatalogPricingLog(vendorCatalogPricingModel);
4475
            } catch (ProfitMandiBusinessException e) {
4476
                continue;
4477
            }
4478
 
4479
        }
4480
 
4481
    }
4482
 
4483
    public void approveVendorCatalogPricing() {
4484
        List<VendorCatalogPricingLog> vendorCatalogPricingLogs = vendorCatalogPricingLogRepository.selectByStatus(VendorCatalogPricingStatus.PENDING);
4485
 
32084 tejbeer 4486
 
32081 tejbeer 4487
        for (VendorCatalogPricingLog vendorCatalogPricingLog : vendorCatalogPricingLogs) {
32107 tejbeer 4488
            vendorCatalogPricingLog.setStatus(VendorCatalogPricingStatus.APPROVED);
4489
            vendorCatalogPricingLog.setUpdatedTimestamp(LocalDateTime.now());
4490
            vendorCatalogPricingLog.setApprovedBy(13);
4491
            vendorCatalogPricingLog.setApprovedTimestamp(LocalDateTime.now());
32114 tejbeer 4492
            vendorCatalogPricingService.createVendorCatalogPricing(vendorCatalogPricingLog);
4493
        }
32081 tejbeer 4494
 
32114 tejbeer 4495
    }
32108 tejbeer 4496
 
4497
 
32147 amit.gupta 4498
}