Subversion Repositories SmartDukaan

Rev

Rev 32350 | Rev 32421 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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