Subversion Repositories SmartDukaan

Rev

Rev 33817 | Rev 33821 | 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
 
24542 amit.gupta 3
import com.google.common.collect.Lists;
25300 tejbeer 4
import com.google.gson.Gson;
29488 manish 5
import com.razorpay.Payment;
32421 amit.gupta 6
import com.smartdukaan.cron.itelImeiActivation.ItelImeiActivationNewService;
29488 manish 7
import com.smartdukaan.cron.itelImeiActivation.ItelImeiActivationService;
8
import com.smartdukaan.cron.itelImeiActivation.TecnoImeiActivation;
32482 amit.gupta 9
import com.smartdukaan.cron.scheduled.runnables.PurchaseMigration;
32511 amit.gupta 10
import com.spice.profitmandi.common.enumuration.*;
24121 govind 11
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
32421 amit.gupta 12
import com.spice.profitmandi.common.model.*;
24681 amit.gupta 13
import com.spice.profitmandi.common.services.ReporticoService;
29814 tejbeer 14
import com.spice.profitmandi.common.services.mandii.AccountStatusResponseOut;
15
import com.spice.profitmandi.common.services.mandii.EligibilityStatusEnum;
16
import com.spice.profitmandi.common.services.mandii.MandiiService;
24002 amit.gupta 17
import com.spice.profitmandi.common.util.FileUtil;
23929 amit.gupta 18
import com.spice.profitmandi.common.util.FormattingUtils;
27678 amit.gupta 19
import com.spice.profitmandi.common.util.PdfUtils;
23929 amit.gupta 20
import com.spice.profitmandi.common.util.Utils;
24592 amit.gupta 21
import com.spice.profitmandi.common.util.Utils.Attachment;
29308 tejbeer 22
import com.spice.profitmandi.common.web.client.RestClient;
25300 tejbeer 23
import com.spice.profitmandi.dao.Interface.Campaign;
32511 amit.gupta 24
import com.spice.profitmandi.dao.cart.CartService;
25590 amit.gupta 25
import com.spice.profitmandi.dao.entity.auth.AuthUser;
30421 tejbeer 26
import com.spice.profitmandi.dao.entity.auth.PartnerCollectionRemark;
33078 ranu 27
import com.spice.profitmandi.dao.entity.catalog.*;
28
import com.spice.profitmandi.dao.entity.cs.NonSdBuying;
25590 amit.gupta 29
import com.spice.profitmandi.dao.entity.cs.Position;
26283 tejbeer 30
import com.spice.profitmandi.dao.entity.cs.Ticket;
28769 amit.gupta 31
import com.spice.profitmandi.dao.entity.dtr.User;
32421 amit.gupta 32
import com.spice.profitmandi.dao.entity.dtr.*;
33
import com.spice.profitmandi.dao.entity.fofo.*;
34
import com.spice.profitmandi.dao.entity.inventory.*;
33553 ranu 35
import com.spice.profitmandi.dao.entity.logistics.AST;
36
import com.spice.profitmandi.dao.entity.logistics.ASTRepository;
33817 amit.gupta 37
import com.spice.profitmandi.dao.entity.logistics.WarehouseProvider;
32421 amit.gupta 38
import com.spice.profitmandi.dao.entity.transaction.*;
39
import com.spice.profitmandi.dao.entity.user.*;
32511 amit.gupta 40
import com.spice.profitmandi.dao.entity.warehouse.WarehouseInventoryItem;
41
import com.spice.profitmandi.dao.entity.warehouse.WarehouseScan;
30421 tejbeer 42
import com.spice.profitmandi.dao.enumuration.auth.CollectionRemark;
24250 amit.gupta 43
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
25598 amit.gupta 44
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
26790 tejbeer 45
import com.spice.profitmandi.dao.enumuration.dtr.RefferalStatus;
29814 tejbeer 46
import com.spice.profitmandi.dao.enumuration.fofo.Gateway;
31332 amit.gupta 47
import com.spice.profitmandi.dao.enumuration.fofo.PaymentStatus;
32511 amit.gupta 48
import com.spice.profitmandi.dao.enumuration.fofo.ReturnType;
24242 amit.gupta 49
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
32081 tejbeer 50
import com.spice.profitmandi.dao.enumuration.inventory.VendorCatalogPricingStatus;
30913 tejbeer 51
import com.spice.profitmandi.dao.enumuration.transaction.CreditRisk;
30859 tejbeer 52
import com.spice.profitmandi.dao.enumuration.transaction.LoanReferenceType;
25609 amit.gupta 53
import com.spice.profitmandi.dao.enumuration.transaction.PriceDropImeiStatus;
32421 amit.gupta 54
import com.spice.profitmandi.dao.enumuration.transaction.SchemePayoutStatus;
55
import com.spice.profitmandi.dao.model.*;
33452 amit.gupta 56
import com.spice.profitmandi.dao.repository.GenericRepository;
25590 amit.gupta 57
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
33078 ranu 58
import com.spice.profitmandi.dao.repository.auth.NonSdBuyingRepository;
30421 tejbeer 59
import com.spice.profitmandi.dao.repository.auth.PartnerCollectionRemarkRepository;
32421 amit.gupta 60
import com.spice.profitmandi.dao.repository.catalog.*;
32980 amit.gupta 61
import com.spice.profitmandi.dao.repository.cs.CsService;
62
import com.spice.profitmandi.dao.repository.cs.PartnerRegionRepository;
63
import com.spice.profitmandi.dao.repository.cs.PositionRepository;
64
import com.spice.profitmandi.dao.repository.cs.TicketRepository;
32421 amit.gupta 65
import com.spice.profitmandi.dao.repository.dtr.*;
66
import com.spice.profitmandi.dao.repository.fofo.*;
67
import com.spice.profitmandi.dao.repository.inventory.*;
33817 amit.gupta 68
import com.spice.profitmandi.dao.repository.logistics.WarehouseProviderRepository;
32421 amit.gupta 69
import com.spice.profitmandi.dao.repository.transaction.*;
24542 amit.gupta 70
import com.spice.profitmandi.dao.repository.user.AddressRepository;
25721 tejbeer 71
import com.spice.profitmandi.dao.repository.user.UserRepository;
32421 amit.gupta 72
import com.spice.profitmandi.dao.repository.warehouse.*;
33355 amit.gupta 73
import com.spice.profitmandi.dao.service.SidbiService;
32817 amit.gupta 74
import com.spice.profitmandi.dao.service.biuedart.BluedartAuthService;
75
import com.spice.profitmandi.dao.service.biuedart.BluedartService;
31604 tejbeer 76
import com.spice.profitmandi.dao.service.solr.FofoSolr;
32421 amit.gupta 77
import com.spice.profitmandi.service.*;
31332 amit.gupta 78
import com.spice.profitmandi.service.integrations.CCAvenuePaymentService;
28368 tejbeer 79
import com.spice.profitmandi.service.integrations.RazorpayPaymentService;
30858 amit.gupta 80
import com.spice.profitmandi.service.integrations.bharti.model.BAGInsuranceModel;
33638 amit.gupta 81
import com.spice.profitmandi.service.integrations.gstpro.GstProAuthService;
33817 amit.gupta 82
import com.spice.profitmandi.service.integrations.gstpro.GstProService;
83
import com.spice.profitmandi.service.integrations.gstpro.api.model.E_InvoiceCommon;
32872 amit.gupta 84
import com.spice.profitmandi.service.integrations.psismart.PsiSmartService;
32948 amit.gupta 85
import com.spice.profitmandi.service.integrations.smartping.SmartPingService;
25694 amit.gupta 86
import com.spice.profitmandi.service.integrations.toffee.ToffeeService;
32421 amit.gupta 87
import com.spice.profitmandi.service.inventory.*;
31746 amit.gupta 88
import com.spice.profitmandi.service.offers.OfferService;
25335 amit.gupta 89
import com.spice.profitmandi.service.order.OrderService;
33452 amit.gupta 90
import com.spice.profitmandi.service.pricecircular.PriceCircularService;
24431 amit.gupta 91
import com.spice.profitmandi.service.pricing.PriceDropService;
23724 amit.gupta 92
import com.spice.profitmandi.service.recharge.provider.OxigenRechargeProviderService;
93
import com.spice.profitmandi.service.recharge.provider.ThinkWalnutDigitalRechargeProviderService;
94
import com.spice.profitmandi.service.scheme.SchemeService;
29668 tejbeer 95
import com.spice.profitmandi.service.serviceConfig.ServiceConfigService;
31008 amit.gupta 96
import com.spice.profitmandi.service.transaction.CreditNoteService;
30859 tejbeer 97
import com.spice.profitmandi.service.transaction.SDCreditService;
23929 amit.gupta 98
import com.spice.profitmandi.service.transaction.TransactionService;
32990 amit.gupta 99
import com.spice.profitmandi.service.transaction.invoicing.InvoiceService;
23929 amit.gupta 100
import com.spice.profitmandi.service.user.RetailerService;
32511 amit.gupta 101
import com.spice.profitmandi.service.wallet.CommonPaymentService;
23739 amit.gupta 102
import com.spice.profitmandi.service.wallet.WalletService;
32421 amit.gupta 103
import com.spice.profitmandi.service.warehouse.PurchaseOrderService;
32511 amit.gupta 104
import com.spice.profitmandi.service.warehouse.WarehouseInventoryService;
33384 amit.gupta 105
import com.spice.profitmandi.service.warehouse.WarehouseService;
25721 tejbeer 106
import in.shop2020.model.v1.order.OrderStatus;
29308 tejbeer 107
import in.shop2020.model.v1.order.WalletReferenceType;
32421 amit.gupta 108
import org.apache.commons.io.output.ByteArrayOutputStream;
109
import org.apache.commons.lang.StringUtils;
33664 amit.gupta 110
import org.apache.commons.lang3.tuple.Pair;
32421 amit.gupta 111
import org.apache.http.client.methods.CloseableHttpResponse;
112
import org.apache.http.client.methods.HttpPost;
113
import org.apache.http.conn.HttpHostConnectException;
114
import org.apache.http.entity.StringEntity;
115
import org.apache.http.impl.client.CloseableHttpClient;
116
import org.apache.http.impl.client.HttpClients;
117
import org.apache.logging.log4j.LogManager;
118
import org.apache.logging.log4j.Logger;
119
import org.hibernate.Session;
120
import org.hibernate.SessionFactory;
121
import org.hibernate.query.NativeQuery;
122
import org.json.JSONObject;
123
import org.springframework.beans.factory.annotation.Autowired;
124
import org.springframework.beans.factory.annotation.Qualifier;
125
import org.springframework.beans.factory.annotation.Value;
126
import org.springframework.core.io.ByteArrayResource;
127
import org.springframework.core.io.InputStreamSource;
33638 amit.gupta 128
import org.springframework.data.redis.cache.RedisCacheManager;
32421 amit.gupta 129
import org.springframework.mail.javamail.JavaMailSender;
130
import org.springframework.mail.javamail.MimeMessageHelper;
131
import org.springframework.stereotype.Component;
132
import org.springframework.transaction.annotation.Transactional;
31640 tejbeer 133
 
32421 amit.gupta 134
import javax.mail.MessagingException;
135
import javax.mail.internet.InternetAddress;
136
import javax.mail.internet.MimeMessage;
137
import java.io.*;
138
import java.math.BigDecimal;
139
import java.math.RoundingMode;
140
import java.nio.file.Files;
141
import java.nio.file.Paths;
142
import java.sql.Timestamp;
143
import java.text.DecimalFormat;
144
import java.time.*;
145
import java.time.format.DateTimeFormatter;
146
import java.time.temporal.ChronoField;
147
import java.time.temporal.ChronoUnit;
148
import java.util.*;
149
import java.util.Map.Entry;
150
import java.util.stream.Collectors;
151
import java.util.stream.Stream;
32060 amit.gupta 152
 
33664 amit.gupta 153
import static java.util.stream.Collectors.*;
32421 amit.gupta 154
 
155
 
23723 amit.gupta 156
@Component
33384 amit.gupta 157
@Transactional(rollbackFor = {Throwable.class, ProfitMandiBusinessException.class})
23723 amit.gupta 158
public class ScheduledTasks {
159
 
31697 amit.gupta 160
    @Value("${oxigen.recharge.enquiry.url}")
161
    private String oxigenRechargeEnquiryUrl;
24533 govind 162
 
31697 amit.gupta 163
    @Autowired
32482 amit.gupta 164
    PurchaseMigration purchaseMigration;
165
 
166
    @Autowired
32795 amit.gupta 167
    SmartPingService smartPingService;
168
 
33553 ranu 169
    @Autowired
170
    private ASTRepository astRepository;
29668 tejbeer 171
 
31697 amit.gupta 172
    @Autowired
173
    private ServiceConfigService serviceConfigService;
29801 manish 174
 
31697 amit.gupta 175
    @Autowired
176
    private TecnoImeiActivation tecnoImeiActivation;
28205 tejbeer 177
 
31697 amit.gupta 178
    private static final DateTimeFormatter leadTimeFormatter = DateTimeFormatter.ofPattern("d LLL, hh:mm a");
27088 tejbeer 179
 
31697 amit.gupta 180
    @Autowired
181
    private PartnerRegionRepository partnerRegionRepository;
28790 amit.gupta 182
 
31697 amit.gupta 183
    @Autowired
184
    private EmployeeAttendanceRepository employeeAttendanceRepository;
27088 tejbeer 185
 
31697 amit.gupta 186
    @Autowired
187
    VivoImeiActivationService vivoImeiActivationService;
29488 manish 188
 
31697 amit.gupta 189
    @Autowired
190
    ItelImeiActivationService itelImeiActivationService;
29488 manish 191
 
31697 amit.gupta 192
    @Autowired
193
    private PartnerTypeChangeService partnerTypeChangeService;
25598 amit.gupta 194
 
26408 amit.gupta 195
 
31697 amit.gupta 196
    @Autowired
197
    private LeadRepository leadRepository;
25927 amit.gupta 198
 
31697 amit.gupta 199
    @Autowired
200
    private AuthRepository authRepository;
25503 amit.gupta 201
 
31697 amit.gupta 202
    @Autowired
203
    private PriceDropService priceDropService;
26283 tejbeer 204
 
31697 amit.gupta 205
    @Autowired
206
    private FranchiseeVisitRepository franchiseeVisitRepository;
26790 tejbeer 207
 
31697 amit.gupta 208
    @Autowired
209
    private FranchiseeActivityRepository franchiseeActivityRepository;
26790 tejbeer 210
 
31697 amit.gupta 211
    @Autowired
212
    private HdfcPaymentRepository hdfcPaymentRepository;
26790 tejbeer 213
 
31697 amit.gupta 214
    @Autowired
215
    private CsService csService;
25846 amit.gupta 216
 
31697 amit.gupta 217
    @Autowired
218
    private SaholicInventoryService saholicInventoryService;
27208 tejbeer 219
 
31697 amit.gupta 220
    @Autowired
221
    private InsurancePolicyRepository insurancePolicyRepository;
23723 amit.gupta 222
 
31697 amit.gupta 223
    @Autowired
224
    private ToffeeService toffeeService;
25694 amit.gupta 225
 
31697 amit.gupta 226
    @Value("${oxigen.recharge.auth.key}")
227
    private String oxigenRechargeAuthKey;
23724 amit.gupta 228
 
31697 amit.gupta 229
    @Value("${oxigen.recharge.validation.url}")
230
    private String oxigenRechargeValidationUrl;
23724 amit.gupta 231
 
31697 amit.gupta 232
    @Value("${oxigen.recharge.validation.auth.key}")
233
    private String oxigenRechargeValidationAuthKey;
23724 amit.gupta 234
 
31697 amit.gupta 235
    @Value("${think.walnut.digital.recharge.transaction.mobile.url}")
236
    private String thinkWalnutDigitalRechargeTransactionMobileUrl;
23724 amit.gupta 237
 
31697 amit.gupta 238
    @Value("${think.walnut.digital.recharge.transaction.dth.url}")
239
    private String thinkWalnutDigitalRechargeTransactionDthUrl;
23724 amit.gupta 240
 
31697 amit.gupta 241
    @Value("${think.walnut.digital.recharge.enquiry.url}")
242
    private String thinkWalnutDigitalRechargeEnquiryUrl;
23724 amit.gupta 243
 
31697 amit.gupta 244
    @Value("${think.walnut.digital.recharge.balance.url}")
245
    private String thinkWalnutDigitalRechargeBalanceUrl;
23724 amit.gupta 246
 
31697 amit.gupta 247
    @Value("${think.walnut.digital.recharge.username}")
248
    private String thinkWalnutDigitalRechargeUserName;
23724 amit.gupta 249
 
31697 amit.gupta 250
    @Value("${think.walnut.digital.recharge.password}")
251
    private String thinkWalnutDigitalRechargePassword;
23724 amit.gupta 252
 
31697 amit.gupta 253
    @Value("${think.walnut.digital.recharge.auth.key}")
254
    private String thinkWalnutDigitalRechargeAuthKey;
23724 amit.gupta 255
 
31697 amit.gupta 256
    @Autowired
257
    private PurchaseRepository purchaseRepository;
23724 amit.gupta 258
 
31697 amit.gupta 259
    @Autowired
260
    private PriceDropIMEIRepository priceDropIMEIRepository;
25609 amit.gupta 261
 
31697 amit.gupta 262
    @Autowired
263
    PriceDropRepository priceDropRepository;
25609 amit.gupta 264
 
31697 amit.gupta 265
    @Autowired
266
    private PartnerTypeChangeRepository partnerTypeChangeRepository;
28368 tejbeer 267
 
31697 amit.gupta 268
    @Autowired
269
    private SchemeService schemeService;
24683 amit.gupta 270
 
31697 amit.gupta 271
    @Autowired
272
    private ServiceConfigRepository serviceConfigRepository;
29668 tejbeer 273
 
32061 amit.gupta 274
    @Autowired
275
    private RetailerBlockBrandsRepository retailerBlockBrandsRepository;
276
 
31886 tejbeer 277
    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 278
 
31886 tejbeer 279
    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 280
 
33664 amit.gupta 281
    private static final String[] INDENT_TERTIARY_MAIL_LIST = new String[]{"uday.singh@smartdukaan.com", "kuldeep.kumar@smartdukaan.com", "nishant.ohri@smartdukaan.com", "vinay.p@smartdukaan.com", "deena.nath@smartdukaan.com", "shobhit.tandon@smartdukaan.com", "ritesh.chauhan1@smartdukaan.com"};
28709 amit.gupta 282
 
31886 tejbeer 283
    private static final String[] EMPLOYEE_ATTENDANCE_MAIL_LIST = new String[]{"sm@smartdukaan.com", "sm@smartdukaan.com"};
28790 amit.gupta 284
 
31697 amit.gupta 285
    private List<OrderStatus> orderStatusList = Arrays.asList(OrderStatus.SUBMITTED_FOR_PROCESSING);
25721 tejbeer 286
 
31697 amit.gupta 287
    @Autowired
288
    private ReporticoService reporticoService;
23724 amit.gupta 289
 
31697 amit.gupta 290
    @Autowired
291
    private PartnerInvestmentService partnerInvestmentService;
25598 amit.gupta 292
 
31697 amit.gupta 293
    @Autowired
294
    private PositionRepository positionRepository;
24337 amit.gupta 295
 
31697 amit.gupta 296
    @Autowired
297
    private FofoOrderItemRepository fofoOrderItemRepository;
25865 amit.gupta 298
 
31697 amit.gupta 299
    @Autowired
300
    private NotificationService notificationService;
24542 amit.gupta 301
 
31697 amit.gupta 302
    @Autowired
303
    private PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
24277 amit.gupta 304
 
31697 amit.gupta 305
    @Autowired
306
    private SchemeInOutRepository schemeInOutRepository;
24241 amit.gupta 307
 
31697 amit.gupta 308
    @Autowired
309
    private RechargeTransactionRepository rechargeTransactionRepository;
23724 amit.gupta 310
 
31697 amit.gupta 311
    @Autowired
312
    private CustomerAddressRepository customerAddressRepository;
24542 amit.gupta 313
 
31697 amit.gupta 314
    @Autowired
315
    private RechargeProviderCreditWalletHistoryRepository rechargeProviderCreditWalletHistoryRepository;
23724 amit.gupta 316
 
31697 amit.gupta 317
    @Autowired
318
    private FofoLineItemRepository fofoLineItemRepository;
24590 amit.gupta 319
 
31697 amit.gupta 320
    @Autowired
321
    private FofoOrderRepository fofoOrderRepository;
24587 amit.gupta 322
 
31697 amit.gupta 323
    @Autowired
324
    private UserWalletHistoryRepository userWalletHistoryRepository;
24250 amit.gupta 325
 
31697 amit.gupta 326
    @Autowired
327
    private UserWalletRepository userWalletRepository;
24587 amit.gupta 328
 
31697 amit.gupta 329
    @Autowired
330
    private InventoryItemRepository inventoryItemRepository;
23929 amit.gupta 331
 
31697 amit.gupta 332
    @Autowired
333
    private WalletService walletService;
23724 amit.gupta 334
 
31697 amit.gupta 335
    @Autowired
336
    private ThinkWalnutDigitalRechargeProviderService thinkWalnutDigitalRechargeProviderService;
23724 amit.gupta 337
 
31697 amit.gupta 338
    @Autowired
339
    private OxigenRechargeProviderService oxigenRechargeProviderService;
23724 amit.gupta 340
 
31697 amit.gupta 341
    @Autowired
342
    private RechargeProviderRepository rechargeProviderRepository;
23724 amit.gupta 343
 
31697 amit.gupta 344
    @Autowired
345
    private ScanRecordRepository scanRecordRepository;
24242 amit.gupta 346
 
31697 amit.gupta 347
    @Autowired
348
    private DailyRechargeRepository dailyRechargeRepository;
23724 amit.gupta 349
 
31697 amit.gupta 350
    @Autowired
351
    private FofoStoreRepository fofoStoreRepository;
24177 govind 352
 
31697 amit.gupta 353
    @Value("${prod}")
354
    private boolean prod;
26945 amit.gupta 355
 
31697 amit.gupta 356
    @Autowired
357
    private StateGstRateRepository stateGstRateRepository;
23724 amit.gupta 358
 
31697 amit.gupta 359
    @Autowired
360
    private RetailerService retailerService;
23929 amit.gupta 361
 
31697 amit.gupta 362
    @Autowired
33078 ranu 363
    private BrandsRepository brandsRepository;
364
 
365
    @Autowired
31697 amit.gupta 366
    private TransactionService transactionService;
24250 amit.gupta 367
 
31697 amit.gupta 368
    @Autowired
369
    private ItemRepository itemRepository;
23929 amit.gupta 370
 
31697 amit.gupta 371
    @Autowired
372
    private OrderRepository orderRepository;
25351 tejbeer 373
 
31697 amit.gupta 374
    @Autowired
375
    private OrderService orderService;
23929 amit.gupta 376
 
31697 amit.gupta 377
    @Autowired
378
    private SchemeRepository schemeRepository;
24241 amit.gupta 379
 
31697 amit.gupta 380
    @Autowired
381
    private SchemeItemRepository schemeItemRepository;
31612 tejbeer 382
 
31697 amit.gupta 383
    @Autowired
384
    private JavaMailSender mailSender;
24177 govind 385
 
31697 amit.gupta 386
    @Autowired
387
    private PartnerTargetRepository partnerTargetRepository;
24002 amit.gupta 388
 
31697 amit.gupta 389
    @Autowired
390
    @Qualifier(value = "googleMailSender")
391
    private JavaMailSender googleMailSender;
23929 amit.gupta 392
 
31697 amit.gupta 393
    @Autowired
394
    private InventoryService inventoryService;
23929 amit.gupta 395
 
31697 amit.gupta 396
    @Autowired
397
    private AddressRepository addressRepository;
24542 amit.gupta 398
 
31697 amit.gupta 399
    @Autowired
400
    private RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
24542 amit.gupta 401
 
31697 amit.gupta 402
    @Autowired
403
    private Mongo mongoClient;
24683 amit.gupta 404
 
31697 amit.gupta 405
    @Autowired
406
    private DeviceRepository deviceRepository;
25300 tejbeer 407
 
31697 amit.gupta 408
    @Autowired
409
    private PushNotificationRepository pushNotificationRepository;
25300 tejbeer 410
 
31697 amit.gupta 411
    @Autowired
412
    private NotificationCampaignRepository notificationCampaignRepository;
25300 tejbeer 413
 
31697 amit.gupta 414
    @Autowired
415
    private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
25721 tejbeer 416
 
31697 amit.gupta 417
    @Autowired
418
    private FocusedModelRepository focusedModelRepository;
25721 tejbeer 419
 
31697 amit.gupta 420
    @Autowired
421
    private UserAccountRepository userAccountRepository;
24653 govind 422
 
31697 amit.gupta 423
    @Autowired
424
    private UserRepository userUserRepository;
25721 tejbeer 425
 
31697 amit.gupta 426
    @Autowired
427
    private com.spice.profitmandi.dao.repository.dtr.UserRepository dtrUserRepository;
25927 amit.gupta 428
 
31697 amit.gupta 429
    @Autowired
430
    private UserCampaignRepository userCampaignRepository;
25721 tejbeer 431
 
31697 amit.gupta 432
    @Autowired
433
    private Gson gson;
25721 tejbeer 434
 
31697 amit.gupta 435
    @Autowired
436
    private TicketRepository ticketRepository;
26283 tejbeer 437
 
31697 amit.gupta 438
    @Autowired
439
    private RefferalRepository refferalRepository;
26790 tejbeer 440
 
31697 amit.gupta 441
    @Autowired
442
    private PartnerProblemRepository partnerProblemRepository;
28205 tejbeer 443
 
31697 amit.gupta 444
    @Autowired
445
    private PendingOrderRepository pendingOrderRepository;
28368 tejbeer 446
 
31697 amit.gupta 447
    @Autowired
448
    private PendingOrderItemRepository pendingOrderItemRepository;
28368 tejbeer 449
 
31697 amit.gupta 450
    @Value("${razorpay.account.keyId}")
451
    private String keyId;
28368 tejbeer 452
 
31697 amit.gupta 453
    @Value("${razorpay.account.keySecret}")
454
    private String keySecret;
28368 tejbeer 455
 
31697 amit.gupta 456
    @Autowired
457
    private RazorpayPaymentService razorPaymentService;
28369 tejbeer 458
 
31697 amit.gupta 459
    @Autowired
460
    private RazorPayRepository razorPayRepository;
28369 tejbeer 461
 
31697 amit.gupta 462
    @Autowired
463
    private PendingOrderService pendingOrderService;
28377 tejbeer 464
 
31697 amit.gupta 465
    @Autowired
466
    private CustomerRepository customerRepository;
28377 tejbeer 467
 
31697 amit.gupta 468
    @Autowired
469
    private RestClient restClient;
29308 tejbeer 470
 
31697 amit.gupta 471
    @Autowired
472
    private MandiiService mandiiService;
29814 tejbeer 473
 
31697 amit.gupta 474
    @Autowired
475
    CreditAccountRepository creditAccountRepository;
31604 tejbeer 476
 
31697 amit.gupta 477
    @Autowired
478
    CustomerOfferRepository customerOfferRepository;
31612 tejbeer 479
 
31697 amit.gupta 480
    @Autowired
481
    CustomerOfferItemRepository customerOfferItemRepository;
482
    @Autowired
483
    private FofoSolr fofoSolr;
23724 amit.gupta 484
 
25300 tejbeer 485
 
31697 amit.gupta 486
    private static final Logger LOGGER = LogManager.getLogger(ScheduledTasks.class);
31388 amit.gupta 487
 
31697 amit.gupta 488
    private String FCM_URL = "https://fcm.googleapis.com/fcm/send";
489
    private String FCM_API_KEY = "AAAASAjNcn4:APA91bG6fWRIgYJI0L9gCjP5ynaXz2hJHYKtD9dfH7Depdv31Nd9APJwhx-OPkAJ1WSz4BGNYG8lHThLFSjDGFxIwUZv241YcAJEGDLgt86mxq9FXJe-yBRu-S0_ZwHqmX-QaVKl5F_A";
23724 amit.gupta 490
 
31697 amit.gupta 491
    @Autowired
492
    private TagListingRepository tagListingRepository;
23724 amit.gupta 493
 
31697 amit.gupta 494
    public void generateDailyRecharge() {
31886 tejbeer 495
        List<RechargeProviderCreditWalletHistory> allCreditHistory = rechargeProviderCreditWalletHistoryRepository.selectAll(0, 2000);
31697 amit.gupta 496
        List<RechargeProvider> rechargeProviders = rechargeProviderRepository.selectAll();
497
        rechargeProviders.stream().forEach(x -> x.setAmount(0));
23724 amit.gupta 498
 
31697 amit.gupta 499
        rechargeProviders.stream().forEach(x -> {
31886 tejbeer 500
            Map<LocalDate, List<RechargeProviderCreditWalletHistory>> dateWiseProviderCreditsMap = allCreditHistory.stream().filter(z -> z.getProviderId() == x.getId()).collect(groupingBy(x1 -> x1.getReceiveTimestamp().toLocalDate()));
23724 amit.gupta 501
 
31697 amit.gupta 502
            LOGGER.info("dateWiseProviderCreditsMap -{}", dateWiseProviderCreditsMap);
503
            LocalDate endDate = LocalDate.now().plusDays(1);
504
            float previousDayClosing = 0;
505
            LocalDate date = LocalDate.of(2018, 4, 6);
506
            while (date.isBefore(endDate)) {
31886 tejbeer 507
                List<RechargeTransaction> dateWiseRechargeTransactions = rechargeTransactionRepository.selectAllBetweenTimestamp(Arrays.asList(RechargeStatus.values()), date.atStartOfDay(), date.plusDays(1).atStartOfDay());
23724 amit.gupta 508
 
31886 tejbeer 509
                List<RechargeTransaction> successfulTransactions = dateWiseRechargeTransactions.stream().filter(y -> y.getStatus().equals(RechargeStatus.SUCCESS)).collect(Collectors.toList());
23724 amit.gupta 510
 
31697 amit.gupta 511
                float dailyAmount = 0;
512
                float totalCommission = 0;
513
                for (RechargeTransaction rechargeTransaction : successfulTransactions) {
514
                    if (rechargeTransaction.getProviderId() == x.getId()) {
515
                        dailyAmount += rechargeTransaction.getAmount();
516
                        totalCommission += rechargeTransaction.getCommission();
517
                    }
518
                }
28205 tejbeer 519
 
31697 amit.gupta 520
                List<RechargeProviderCreditWalletHistory> rechargeHistoryList = dateWiseProviderCreditsMap.get(date);
521
                float dailyWalletRecharge = 0;
522
                if (rechargeHistoryList != null) {
523
                    for (RechargeProviderCreditWalletHistory rechargeProviderCreditWalletHistory : rechargeHistoryList) {
524
                        if (rechargeProviderCreditWalletHistory.getProviderId() == x.getId()) {
525
                            dailyWalletRecharge += rechargeProviderCreditWalletHistory.getAmount();
526
                        }
527
                    }
528
                }
529
                if (dailyAmount > 0 || dailyWalletRecharge > 0) {
530
                    DailyRecharge dailyRecharge = null;
531
                    try {
532
                        dailyRecharge = dailyRechargeRepository.selectByProviderIdAndCreateDate(x.getId(), date);
533
                    } catch (Exception e) {
534
                        LOGGER.info("Could not find Recharge entry");
535
                    }
536
                    if (dailyRecharge == null) {
537
                        dailyRecharge = new DailyRecharge();
538
                        dailyRecharge.setCreateDate(date);
539
                    }
540
                    dailyRecharge.setOpeningBalance(previousDayClosing);
541
                    dailyRecharge.setProviderId(x.getId());
542
                    dailyRecharge.setWalletRechargeAmount(dailyWalletRecharge);
543
                    dailyRecharge.setTotalAmount(dailyAmount);
544
                    dailyRecharge.setTotalCommission(totalCommission);
545
                    float closingBalance = dailyRecharge.getOpeningBalance() + dailyWalletRecharge - dailyAmount;
546
                    dailyRecharge.setClosingBalance(closingBalance);
547
                    dailyRechargeRepository.persist(dailyRecharge);
548
                    x.setAmount(x.getAmount() + dailyRecharge.getClosingBalance() - dailyRecharge.getOpeningBalance());
549
                    previousDayClosing = dailyRecharge.getClosingBalance();
550
                }
551
                date = date.plusDays(1);
552
            }
553
            rechargeProviderRepository.persist(x);
554
        });
555
        LOGGER.info("finished generating daily recharge");
556
    }
24240 amit.gupta 557
 
31697 amit.gupta 558
    public void reconcileRecharge() throws Exception {
559
        LocalDateTime fromDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).minusDays(30);
560
        LocalDateTime toDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS);
561
        List<RechargeStatus> nonSuccessRechargeStatuses = new ArrayList<>(Arrays.asList(RechargeStatus.values()));
562
        LOGGER.info("nonSuccessRechargeStatuses {} ", nonSuccessRechargeStatuses);
563
        nonSuccessRechargeStatuses.remove(RechargeStatus.SUCCESS);
564
        nonSuccessRechargeStatuses.remove(RechargeStatus.FAILED);
565
        RechargeCredential thinkWalnutDigitalRechargeEnquiryCredential = new RechargeCredential();
566
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUrl(thinkWalnutDigitalRechargeEnquiryUrl);
567
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUserName(thinkWalnutDigitalRechargeUserName);
568
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargePassword(thinkWalnutDigitalRechargePassword);
569
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargeAuthKey(thinkWalnutDigitalRechargeAuthKey);
570
        Map<String, RechargeStatus> requestRechargeStatusChanged = new HashMap<>();
31886 tejbeer 571
        List<RechargeTransaction> rechargeTransactions = rechargeTransactionRepository.selectAllBetweenTimestamp(nonSuccessRechargeStatuses, fromDate, toDate);
31697 amit.gupta 572
        for (RechargeTransaction rechargeTransaction : rechargeTransactions) {
573
            try {
574
                int providerId = rechargeTransaction.getProviderId();
575
                if (providerId == 1) {
31886 tejbeer 576
                    oxigenRechargeProviderService.doCheckStatusRequest(oxigenRechargeEnquiryUrl, oxigenRechargeAuthKey, rechargeTransaction);
31697 amit.gupta 577
                } else if (providerId == 2) {
31886 tejbeer 578
                    thinkWalnutDigitalRechargeProviderService.doCheckStatusRequest(thinkWalnutDigitalRechargeEnquiryCredential, rechargeTransaction);
31697 amit.gupta 579
                }
31886 tejbeer 580
                if (rechargeTransaction.getStatus().equals(RechargeStatus.SUCCESS) || rechargeTransaction.getStatus().equals(RechargeStatus.FAILED)) {
581
                    requestRechargeStatusChanged.put(rechargeTransaction.getRequestId(), rechargeTransaction.getStatus());
31697 amit.gupta 582
                }
583
            } catch (Exception e) {
584
                LOGGER.info("Could not check status for Request {}", rechargeTransaction.getRequestId());
585
            }
586
        }
587
        LOGGER.info("Reconcile recharge ran successfully");
588
    }
24241 amit.gupta 589
 
31697 amit.gupta 590
    public void processActivation() throws Exception {
591
        schemeService.processActivation();
592
    }
24241 amit.gupta 593
 
31697 amit.gupta 594
    // TemporaryMethod
595
    public void migrateInvoice() {
596
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectFromSaleDate(LocalDateTime.now().minusDays(3));
597
        Map<Integer, List<FofoOrder>> partnerOrdersMap = new HashMap<>();
31886 tejbeer 598
        partnerOrdersMap = fofoOrders.stream().collect(groupingBy(FofoOrder::getFofoId, Collectors.toList()));
31697 amit.gupta 599
        for (List<FofoOrder> orderList : partnerOrdersMap.values()) {
600
            int sequence = 0;
601
            String prefix = "";
31886 tejbeer 602
            List<FofoOrder> sortedList = orderList.stream().sorted((x1, x2) -> x1.getId() - x2.getId()).collect(Collectors.toList());
31697 amit.gupta 603
            for (FofoOrder order : sortedList) {
23724 amit.gupta 604
 
31697 amit.gupta 605
                LOGGER.info("Order Id is {}, partner Id is {}", order.getId(), order.getFofoId());
606
                if (!order.getInvoiceNumber().contains("SEC")) {
607
                    sequence = Integer.parseInt(order.getInvoiceNumber().split("/")[1]);
608
                    prefix = order.getInvoiceNumber().split("/")[0];
609
                } else {
610
                    sequence += 1;
611
                    String invoiceNumber = prefix + "/" + sequence;
612
                    order.setInvoiceNumber(invoiceNumber);
613
                    fofoOrderRepository.persist(order);
614
                }
615
            }
24252 amit.gupta 616
 
31697 amit.gupta 617
        }
618
    }
28205 tejbeer 619
 
31697 amit.gupta 620
    @Autowired
621
    private ReporticoCacheTableRepository reporticoCacheTableRepository;
28205 tejbeer 622
 
31697 amit.gupta 623
    public void processSchemeOut(List<String> invoiceNumbers) throws Exception {
624
        for (String invoiceNumber : invoiceNumbers) {
625
            System.out.println("Invoice Number - " + invoiceNumber);
626
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
32147 amit.gupta 627
            //orderService.reverseScheme(fofoOrder);
31697 amit.gupta 628
            schemeService.processSchemeOut(fofoOrder.getId(), fofoOrder.getFofoId());
629
        }
630
    }
24271 amit.gupta 631
 
31697 amit.gupta 632
    public void processSchemeIn(List<String> invoiceNumbers) throws Exception {
633
        for (String invoiceNumber : invoiceNumbers) {
634
            System.out.println("Invoice Number - " + invoiceNumber);
635
            Purchase purchase = purchaseRepository.selectByPurchaseReference(invoiceNumber);
636
            schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
637
        }
638
    }
24271 amit.gupta 639
 
31697 amit.gupta 640
    public void processScheme(LocalDateTime startDate, LocalDateTime endDate, boolean dryRun) throws Exception {
641
        LOGGER.info("Started execution at {}", LocalDateTime.now());
642
        System.out.println(
643
                "InventoryId\tSerialNumber\tItem Id\tScheme Id\tScheme Name\tScheme Type\tAmount Type\tDP\tTaxable\tScheme Amount\tAmount Paid");
644
        try {
645
            List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
646
            for (Purchase purchase : purchases) {
647
                schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
648
            }
29160 amit.gupta 649
 
31697 amit.gupta 650
            List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
651
            for (FofoOrder fofoOrder : fofoOrders) {
652
                schemeService.processSchemeOut(fofoOrder.getId(), fofoOrder.getFofoId());
653
            }
654
        } catch (Exception e) {
655
            e.printStackTrace();
656
            throw e;
657
        }
31886 tejbeer 658
        List<UserWalletHistory> uwhs = userWalletHistoryRepository.selectAllByDateType(LocalDate.now().atStartOfDay(), endDate, Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
31697 amit.gupta 659
        System.out.println("Amount\tReference\tReferenceType\tTimestamp\tDescription");
660
        for (UserWalletHistory uwh : uwhs) {
31886 tejbeer 661
            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 662
        }
663
        LOGGER.info("Schemes processed successfully.");
664
        if (dryRun) {
665
            throw new Exception();
666
        }
667
    }
29160 amit.gupta 668
 
31697 amit.gupta 669
    public void processRechargeCashback() throws Throwable {
670
        LocalDateTime cashbackTime = LocalDateTime.now();
671
        int referenceId = (int) Timestamp.valueOf(cashbackTime).getTime() / 1000;
31886 tejbeer 672
        List<RechargeTransaction> pendingTransactions = rechargeTransactionRepository.getPendingCashBackRehargeTransactions();
31697 amit.gupta 673
        Map<Object, Double> totalRetailerCashbacks = pendingTransactions.stream().collect(
31724 amit.gupta 674
                groupingBy(x -> x.getRetailerId(), Collectors.summingDouble(x -> x.getCommission())));
33452 amit.gupta 675
        for (Entry<Object, Double> totalRetailerCashback : totalRetailerCashbacks.entrySet()) {
31697 amit.gupta 676
            int retailerId = (Integer) totalRetailerCashback.getKey();
677
            float amount = totalRetailerCashback.getValue().floatValue();
678
            if (Math.round(amount) > 0) {
31886 tejbeer 679
                walletService.addAmountToWallet(retailerId, referenceId, WalletReferenceType.CASHBACK, "Recharge Cashback", Math.round(amount), LocalDateTime.now());
31697 amit.gupta 680
            }
681
        }
682
        for (RechargeTransaction rt : pendingTransactions) {
683
            rt.setCashbackTimestamp(cashbackTime);
684
            rt.setCashbackReference(referenceId);
685
            rechargeTransactionRepository.persist(rt);
686
        }
687
        LOGGER.info("Cashbacks for Recharge processed Successfully");
688
    }
29160 amit.gupta 689
 
31697 amit.gupta 690
    public void rollOutUpgardedMarginsNextMonth() throws Exception {
691
        LocalDate startOfPreviousMonth = LocalDate.now().with(ChronoField.DAY_OF_MONTH, 1).minusMonths(1);
29160 amit.gupta 692
 
31697 amit.gupta 693
        List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
694
        for (FofoStore store : stores) {
32003 amit.gupta 695
            this.rolloutMarginForStoreOnMonth(store, startOfPreviousMonth);
696
        }
697
    }
29252 amit.gupta 698
 
32003 amit.gupta 699
    public void rolloutMarginForStoreOnMonth(FofoStore store, LocalDate startOfMonth) throws ProfitMandiBusinessException {
700
        int fofoId = store.getId();
29252 amit.gupta 701
 
32003 amit.gupta 702
        PartnerType startOfPreviousMonthPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, startOfMonth);
703
        PartnerType todayPartnerType = partnerTypeChangeService.getTypeOnMonth(fofoId, YearMonth.from(startOfMonth.atStartOfDay()));
704
        if (!startOfPreviousMonthPartnerType.nextPartnerTypes().contains(todayPartnerType)) {
705
            return;
706
        }
707
        if (!startOfPreviousMonthPartnerType.equals(todayPartnerType)) {
708
            LOGGER.info("Partner Type has been changed for code {} from {} to {}", store.getCode(), startOfPreviousMonthPartnerType, todayPartnerType);
709
            List<FofoOrder> fofoOrders = fofoOrderRepository.selectByFofoId(fofoId, startOfMonth.atStartOfDay(), startOfMonth.plusMonths(1).atStartOfDay(), 0, 0);
710
            for (FofoOrder fofoOrder : fofoOrders) {
711
                schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
31697 amit.gupta 712
            }
713
        }
714
    }
29252 amit.gupta 715
 
32003 amit.gupta 716
 
31697 amit.gupta 717
    public void rollOutUpgardedMargins() throws Exception {
718
        LocalDate today = LocalDate.now();
719
        LocalDate yesterday = today.minusDays(1);
720
        int upgradedCount = 0;
721
        List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
722
        StringBuilder sb = new StringBuilder();
723
        for (FofoStore store : stores) {
724
            int fofoId = store.getId();
23724 amit.gupta 725
 
31697 amit.gupta 726
            PartnerType yesterdayPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, yesterday);
727
            PartnerType todayPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, today);
728
            if (!yesterdayPartnerType.nextPartnerTypes().contains(todayPartnerType)) {
729
                continue;
730
            }
731
            if (!yesterdayPartnerType.equals(todayPartnerType)) {
732
                upgradedCount++;
31886 tejbeer 733
                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 734
                sb.append("<br>");
31886 tejbeer 735
                LOGGER.info("Partner Type has been changed for code {} from {} to {}", store.getCode(), yesterdayPartnerType, todayPartnerType);
736
                List<FofoOrder> fofoOrders = fofoOrderRepository.selectByFofoId(fofoId, yesterday.withDayOfMonth(1).atStartOfDay(), yesterday.atStartOfDay(), 0, 0);
31697 amit.gupta 737
                for (FofoOrder fofoOrder : fofoOrders) {
738
                    schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
739
                }
30390 amit.gupta 740
 
31697 amit.gupta 741
            }
742
        }
743
        if (upgradedCount > 0) {
32439 tejbeer 744
            sendMailOfHtmlFormat(googleMailSender, 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 745
        } else {
32439 tejbeer 746
            sendMailOfHtmlFormat(googleMailSender, 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 747
        }
748
    }
30393 amit.gupta 749
 
31697 amit.gupta 750
    @Autowired
751
    private PartnerStatsService partnerStatsService;
30393 amit.gupta 752
 
31697 amit.gupta 753
    // Temporary Method
754
    public void evaluateExcessSchemeOut() throws Exception {
755
        Map<Integer, String> userNameMap = retailerService.getAllFofoRetailerIdNameMap();
756
        Map<Integer, Float> userAmountMap = new HashMap<>();
30393 amit.gupta 757
 
31697 amit.gupta 758
        List<List<?>> rows = new ArrayList<>();
31886 tejbeer 759
        List<String> headers = Arrays.asList("Scheme", "Item", "Partner", "Amount", "Credited On", "Invoice Number", "Sale On", "Scheme Start", "Scheme End", "Active On", "Expired On");
33256 amit.gupta 760
        for (Scheme scheme : schemeRepository.selectAll()) {
761
            if (scheme.getType().equals(SchemeType.OUT)) {
762
                List<SchemeInOut> sioList = schemeInOutRepository.selectBySchemeIds(new HashSet<>(Arrays.asList(scheme.getId())));
763
                if (scheme.getActiveTimestamp() != null) {
764
                    LocalDateTime endDateTime = scheme.getEndDateTime();
765
                    if (scheme.getExpireTimestamp() != null && scheme.getExpireTimestamp().isBefore(scheme.getEndDateTime())) {
766
                        endDateTime = scheme.getExpireTimestamp();
31697 amit.gupta 767
                    }
768
                    for (SchemeInOut sio : sioList) {
769
                        InventoryItem inventoryItem = null;
770
                        inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
771
                        FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndSerialNumber(
772
                                inventoryItem.getFofoId(), inventoryItem.getSerialNumber(), null, null, 0, 1).get(0);
31886 tejbeer 773
                        Optional<ScanRecord> record = scanRecordRepository.selectByInventoryItemId(sio.getInventoryItemId()).stream().filter(y -> y.getType().equals(ScanType.SALE)).findFirst();
31697 amit.gupta 774
                        if (record.isPresent()) {
775
                            int fofoId = record.get().getFofoId();
33256 amit.gupta 776
                            if (record.get().getCreateTimestamp().isAfter(endDateTime) || record.get().getCreateTimestamp().isBefore(scheme.getStartDateTime())) {
31697 amit.gupta 777
                                if (!userAmountMap.containsKey(fofoId)) {
778
                                    userAmountMap.put(fofoId, 0f);
779
                                }
780
                                userAmountMap.put(fofoId, sio.getAmount() + userAmountMap.get(fofoId));
781
                                try {
33256 amit.gupta 782
                                    rows.add(Arrays.asList(scheme.getDescription(), itemRepository.selectById(inventoryItem.getItemId()).getItemDescription(), userNameMap.get(fofoId), sio.getAmount(), FormattingUtils.formatDate(sio.getCreateTimestamp()), fofoOrder.getInvoiceNumber(), FormattingUtils.formatDate(record.get().getCreateTimestamp()), FormattingUtils.formatDate(scheme.getStartDateTime()), FormattingUtils.formatDate(scheme.getEndDateTime()), FormattingUtils.formatDate(scheme.getActiveTimestamp()), FormattingUtils.formatDate(scheme.getExpireTimestamp())));
31697 amit.gupta 783
                                } catch (Exception e) {
784
                                    e.printStackTrace();
785
                                }
786
                            }
787
                        }
788
                    }
789
                }
790
            }
33256 amit.gupta 791
        }
31886 tejbeer 792
        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 793
 
31697 amit.gupta 794
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
31886 tejbeer 795
        Utils.sendMailWithAttachment(googleMailSender, new String[]{"amit.gupta@shop2020.in"}, null, "Partner Excess Amount", "PFA", "ListofSchemes.csv", new ByteArrayResource(baos.toByteArray()));
30390 amit.gupta 796
 
31697 amit.gupta 797
    }
30390 amit.gupta 798
 
31697 amit.gupta 799
    public void fetchParnterStats() throws Exception {
800
        Map<Integer, PartnerDetailModel> partnerStats = partnerStatsService.getAllPartnerStats();
801
        ObjectOutputStream oos = null;
802
        FileOutputStream fout = null;
803
        try {
804
            fout = new FileOutputStream("/tmp/partnerStat.tmp", false);
805
            oos = new ObjectOutputStream(fout);
806
            oos.writeObject(partnerStats);
30637 amit.gupta 807
 
31697 amit.gupta 808
        } catch (Exception ex) {
809
            ex.printStackTrace();
810
        } finally {
811
            if (oos != null) {
812
                oos.close();
813
            }
814
        }
32421 amit.gupta 815
        ReporticoCacheTable reporticoCacheTable = reporticoCacheTableRepository.selectByTableName("partnerStat");
816
        if (reporticoCacheTable == null) {
817
            reporticoCacheTable = new ReporticoCacheTable();
818
            reporticoCacheTable.setTableName("partnerStat");
819
            reporticoCacheTable.setLastCreatedTimestamp(LocalDateTime.now());
820
            reporticoCacheTableRepository.persist(reporticoCacheTable);
31697 amit.gupta 821
        } else {
32421 amit.gupta 822
            reporticoCacheTable.setLastCreatedTimestamp(LocalDateTime.now());
31697 amit.gupta 823
        }
824
    }
31008 amit.gupta 825
 
31697 amit.gupta 826
    public void processPriceDrop() throws Exception {
31886 tejbeer 827
        List<PriceDrop> priceDrops = priceDropRepository.selectAllByDatesBetween(LocalDateTime.now(), LocalDateTime.now().minusYears(1));
31697 amit.gupta 828
        for (PriceDrop priceDrop : priceDrops) {
829
            if (priceDrop.getDropAmount() > 0) {
830
                priceDropService.processPriceDrop(priceDrop.getId(), true);
831
            }
832
        }
833
    }
31008 amit.gupta 834
 
31697 amit.gupta 835
    @Autowired
836
    CreditNoteService creditNoteService;
25598 amit.gupta 837
 
31697 amit.gupta 838
    public void sendCreditNote(YearMonth yearMonth) throws Exception {
839
        creditNoteService.issueMonthlyMarginsCN(yearMonth);
840
    }
25598 amit.gupta 841
 
31918 amit.gupta 842
    @Autowired
843
    BrandAgeingLimitRepository brandAgeingLimitRepository;
844
 
845
    @Autowired
846
    AgeingService ageingService;
847
 
848
    public void sendMailForAgeingAlert() throws Exception {
849
        //brandAgeingLimitRepository.selectAll();
850
        Map<String, AgeingModel> ageingModelMap = ageingService.getAllAgeingForSecondary();
851
 
852
        System.out.println(ageingModelMap.size());
853
        List<PartnerAgeingModel> partnerAgeingModels = ageingService.getAllAgeingForTertiary();
854
 
855
 
33452 amit.gupta 856
        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 857
 
33452 amit.gupta 858
        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()));
859
        Attachment attachment1 = new Attachment("secondary-alert.csv", new ByteArrayResource(byteArrayOutputStream.toByteArray()));
860
        Attachment attachment2 = new Attachment("tertiary-alert.csv", new ByteArrayResource(byteArrayOutputStream2.toByteArray()));
31918 amit.gupta 861
 
862
        String mailSubject = "Stock ageing Alert";
863
        Utils.sendMailWithAttachments(mailSender, new String[]{"deena.nath@smartdukaan.com"}, null, mailSubject, "PFA", attachment1, attachment2);
864
    }
865
 
32724 amit.gupta 866
    public void rejectPriceDropsOfApprovedImeis() throws ProfitMandiBusinessException {
32690 amit.gupta 867
        priceDropService.rejectPriceDropsOfApprovedImeis();
868
    }
869
 
33357 amit.gupta 870
    public void processDeductions() {
871
        sidbiService.processDeductions();
872
    }
873
 
31697 amit.gupta 874
    private class SaleRoles {
25598 amit.gupta 875
 
31697 amit.gupta 876
        private List<String> l1;
877
        private List<String> l2;
25598 amit.gupta 878
 
31697 amit.gupta 879
        public SaleRoles() {
880
            l1 = new ArrayList<>();
881
            l2 = new ArrayList<>();
882
        }
25598 amit.gupta 883
 
31697 amit.gupta 884
        public List<String> getL1() {
885
            return l1;
886
        }
25598 amit.gupta 887
 
31697 amit.gupta 888
        public List<String> getL2() {
889
            return l2;
890
        }
26945 amit.gupta 891
 
31697 amit.gupta 892
    }
26945 amit.gupta 893
 
31697 amit.gupta 894
    private class FofoReportingModel {
895
        private String code;
896
        private int fofoId;
897
        private String businessName;
898
        private String territoryManager;
899
        private String regionalManager;
900
        private String businessManager;
26945 amit.gupta 901
 
31697 amit.gupta 902
        public String getCode() {
903
            return code;
904
        }
26945 amit.gupta 905
 
31697 amit.gupta 906
        public void setCode(String code) {
907
            this.code = code;
908
        }
26945 amit.gupta 909
 
31697 amit.gupta 910
        public String getBusinessName() {
911
            return businessName;
912
        }
26945 amit.gupta 913
 
31697 amit.gupta 914
        public void setBusinessName(String businessName) {
915
            this.businessName = businessName;
916
        }
26945 amit.gupta 917
 
31697 amit.gupta 918
        public String getTerritoryManager() {
919
            return territoryManager;
920
        }
26945 amit.gupta 921
 
31697 amit.gupta 922
        public void setTerritoryManager(String territoryManager) {
923
            this.territoryManager = territoryManager;
924
        }
26945 amit.gupta 925
 
31697 amit.gupta 926
        public String getRegionalManager() {
927
            return regionalManager;
928
        }
26945 amit.gupta 929
 
31697 amit.gupta 930
        public void setRegionalManager(String regionalManager) {
931
            this.regionalManager = regionalManager;
932
        }
26945 amit.gupta 933
 
31697 amit.gupta 934
        private ScheduledTasks getOuterType() {
935
            return ScheduledTasks.this;
936
        }
26945 amit.gupta 937
 
31697 amit.gupta 938
        @Override
939
        public String toString() {
31886 tejbeer 940
            return "FofoReportingModel{" + "code='" + code + '\'' + ", fofoId=" + fofoId + ", businessName='" + businessName + '\'' + ", territoryManager='" + territoryManager + '\'' + ", regionalManager='" + regionalManager + '\'' + ", businessManager='" + businessManager + '\'' + '}';
31697 amit.gupta 941
        }
26945 amit.gupta 942
 
31697 amit.gupta 943
        @Override
944
        public boolean equals(Object o) {
945
            if (this == o) return true;
946
            if (o == null || getClass() != o.getClass()) return false;
947
            FofoReportingModel that = (FofoReportingModel) o;
948
            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);
949
        }
26945 amit.gupta 950
 
31697 amit.gupta 951
        @Override
952
        public int hashCode() {
953
            return Objects.hash(code, fofoId, businessName, territoryManager, regionalManager, businessManager);
954
        }
26945 amit.gupta 955
 
31697 amit.gupta 956
        public String getBusinessManager() {
957
            return businessManager;
958
        }
26945 amit.gupta 959
 
31697 amit.gupta 960
        public void setBusinessManager(String businessManager) {
961
            this.businessManager = businessManager;
962
        }
25351 tejbeer 963
 
31697 amit.gupta 964
        public int getFofoId() {
965
            return fofoId;
966
        }
25598 amit.gupta 967
 
31697 amit.gupta 968
        public void setFofoId(int fofoId) {
969
            this.fofoId = fofoId;
970
        }
25598 amit.gupta 971
 
31697 amit.gupta 972
    }
26945 amit.gupta 973
 
31697 amit.gupta 974
    @Autowired
975
    WarehouseInventoryItemRepository warehouseInventoryItemRepository;
26945 amit.gupta 976
 
31746 amit.gupta 977
    @Autowired
978
    OfferService offerService;
979
 
980
    @Autowired
981
    PurchaseReturnItemRepository purchaseReturnItemRepository;
982
 
31918 amit.gupta 983
    @Autowired
984
    BrandRegionMappingRepository brandRegionMappingRepository;
985
 
32161 tejbeer 986
    @Autowired
987
    StandAlone standAlone;
32214 jai.hind 988
    @Autowired
989
    ItelImeiActivationNewService itelImeiActivationNewService;
32350 amit.gupta 990
 
991
    public void checkItelImeiActivationNew(LocalDate date, Integer day) throws Exception {
32063 amit.gupta 992
        try {
32223 amit.gupta 993
            itelImeiActivationNewService.checkItelImeiActivationNew(date, day);
32063 amit.gupta 994
        } catch (Throwable e) {
995
            throw new Exception(e);
996
        }
32223 amit.gupta 997
    }
32062 amit.gupta 998
 
32511 amit.gupta 999
    @Autowired
1000
    PurchaseReturnService purchaseReturnService;
1001
 
32682 amit.gupta 1002
    @Autowired
1003
    JavaMailSender javaMailSender;
1004
 
32795 amit.gupta 1005
    @Autowired
1006
    OfferPayoutRepository offerPayoutRepository;
1007
 
1008
    @Autowired
1009
    OfferRepository offerRepository;
1010
 
32817 amit.gupta 1011
    @Autowired
1012
    BluedartAuthService bluedartAuthService;
1013
    @Autowired
1014
    BluedartService bluedartService;
1015
 
1016
    @Autowired
1017
    TransactionRelatedTasks transactionRelatedTasks;
1018
 
32872 amit.gupta 1019
    @Autowired
1020
    PsiSmartService psiSmartService;
32948 amit.gupta 1021
 
32961 amit.gupta 1022
    private void migrateValentine() throws ProfitMandiBusinessException {
1023
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.now().atStartOfDay(), LocalDateTime.now());
1024
        for (FofoOrder fofoOrder : fofoOrders) {
1025
            orderService.processScratchOffer(fofoOrder);
1026
        }
1027
    }
33051 amit.gupta 1028
 
32990 amit.gupta 1029
    @Autowired
1030
    InvoiceService invoiceService;
1031
 
33384 amit.gupta 1032
    @Autowired
1033
    WarehouseService warehouseService;
1034
 
33452 amit.gupta 1035
    @Autowired
1036
    GenericRepository genericRepository;
1037
 
1038
    @Autowired
1039
    PriceCircularService priceCircularService;
1040
 
33638 amit.gupta 1041
    @Autowired
1042
    RedisCacheManager redisFortnightlyCacheManage;
1043
 
1044
    @Autowired
1045
    GstProAuthService gstProAuthService;
33664 amit.gupta 1046
 
33817 amit.gupta 1047
    @Autowired
1048
    GstProService gstProService;
1049
 
1050
    @Autowired
1051
    WarehouseProviderRepository warehouseProviderRepository;
33316 amit.gupta 1052
    public void test() throws Exception {
33820 ranu 1053
        //this.checkfocusedModelInPartnerStock();
33706 amit.gupta 1054
        List<SDCreditRequirement> sdCreditRequirements = sdCreditRequirementRepository.selectAll();
33817 amit.gupta 1055
        /*for (SDCreditRequirement sdCreditRequirement : sdCreditRequirements) {
33706 amit.gupta 1056
            long utilizationAmount = sdCreditService.getUtilizationAmount(sdCreditRequirement.getFofoId());
1057
            if (Math.abs(sdCreditRequirement.getUtilizedAmount().doubleValue() - utilizationAmount) > 5) {
1058
                sdCreditRequirement.setUtilizedAmount(BigDecimal.valueOf(utilizationAmount));
33664 amit.gupta 1059
            }
1060
 
33817 amit.gupta 1061
        }*/
1062
        //warehouseProviderRepository.selectAllByWarehouseId(1);
1063
        /*String sellerGstin = GstProService.SANDBOX_GST_NUMBER;
1064
        E_InvoiceCommon.RespAuthPl respAuthPl = gstProAuthService.getAuthToken(sellerGstin);
1065
        if (LocalDateTime.now().isAfter(respAuthPl.getData().TokenExpiry)) {
1066
            redisFortnightlyCacheManage.getCache("gstAuthToken").evict(sellerGstin);
1067
            respAuthPl = gstProAuthService.getAuthToken(sellerGstin);
33664 amit.gupta 1068
        }
33817 amit.gupta 1069
        Map<String, String> authMap = gstProAuthService.getAuthHeaders(sellerGstin);
1070
        String authToken = respAuthPl.getData().getAuthToken();
1071
        authMap.put("AuthToken", authToken);
1072
        authMap.put("QrCodeSize", "250");
1073
        authMap.put("ParseIrnResp", "1");
1074
        authMap.put("Content-Type", "application/json; charset=utf-8");
1075
        authMap.put("AuthToken", authToken);
1076
        authMap.put("QrCodeSize", "250");
1077
        authMap.put("ParseIrnResp", "1");
1078
        authMap.put("Content-Type", "application/json; charset=utf-8");
1079
 
1080
        System.out.println(gstProService.getEInvoiceByIrn(authMap, "5d95f5759fdfe48aeb86a7605727f37fc472d779a0f7bfbff98669e06dfd5ab2"));*/
1081
 
1082
        //List<Loan> loans = loanRepository.selectAllLoan();
1083
 
1084
        /*System.out.println(ageingService.getAllAgeingForWarehouseBilling(8718, Arrays.asList(34354)));
1085
        System.out.println(ageingService.getAllAgeingForWarehouseBilling(8646, Arrays.asList(36323)));
1086
        System.out.println(ageingService.getAllAgeingForWarehouseBilling(8954, Arrays.asList(34358)));*/
33820 ranu 1087
        //System.out.println(ageingService.getAgeingForWarehouseBilling(8718, Arrays.asList(new ItemIdQuantity(34354,10))));
33452 amit.gupta 1088
    }
1089
 
1090
    public void test4() throws Exception {
1091
        List<Integer> offerIds = Arrays.asList(2882, 2881, 2880, 2879, 2878, 2877, 2876, 2875, 2874, 2873, 2872, 2871, 2870, 2869, 2868, 2867, 2866, 2865, 2864, 2863, 2862, 2861, 2860, 2859, 2858, 2857, 2856, 2855, 2854, 2853, 2852, 2851, 2850, 2849, 2847, 2846, 2845, 2844, 2843, 2842, 2841, 2840, 2839, 2838, 2837, 2836, 2835, 2834, 2833, 2832, 2831, 2830, 2829, 2828, 2827, 2826, 2825, 2824, 2823, 2822, 2821, 2820, 2819, 2818, 2817, 2816, 2815, 2814, 2813, 2812, 2811, 2810, 2809, 2808, 2807, 2806, 2805, 2804, 2803, 2802, 2801, 2800, 2799, 2798, 2797, 2796, 2795, 2794, 2793, 2792, 2791, 2790, 2789, 2788, 2787, 2786, 2785, 2784, 2783, 2782, 2781, 2780, 2777, 2776, 2775, 2774, 2773, 2772, 2771, 2770, 2769, 2768, 2767, 2766, 2765, 2764, 2763, 2762, 2761, 2760, 2759, 2758, 2757, 2756, 2755, 2754, 2753, 2752, 2751, 2750, 2749, 2748, 2747, 2746, 2745, 2744, 2723, 2722, 2721, 2720, 2719, 2718, 2717, 2716, 2715, 2714, 2713, 2712, 2711, 2710, 2709, 2708, 2707, 2706, 2705, 2704, 2703, 2702, 2701, 2700, 2699, 2698, 2697, 2696, 2695, 2694, 2693, 2692, 2691, 2690, 2494, 2493, 2492, 2491, 2490, 2489, 2488, 2487, 2486, 2485, 2484, 2483, 2482, 2481, 2480, 2479, 2478, 2477, 2476, 2475, 2474, 2473, 2472, 2471, 2470, 2469, 2466, 2465, 2464, 2463, 2462, 2461, 2460, 2459, 2458, 2457, 2456, 2455, 2454, 2453, 2452, 2451, 2450, 2449, 2448, 2447, 2446, 2445, 2444, 2443, 2442, 2441, 2440, 2439, 2407, 2406, 2405, 2404, 2403, 2402, 2401, 2400, 2399, 2398, 2397, 2396, 2395, 2394, 2393, 2392, 2391, 2390, 2389, 2388, 2387, 2386, 2385, 2384, 2383, 2382, 2381, 2117, 2116, 2115, 2114, 2113, 2112, 2111, 2110, 2109, 2108, 2107, 2106, 2105, 2104, 2103, 2102, 2101, 2100, 2099, 2098, 2077);
1092
        for (Integer offerId : offerIds) {
1093
            Offer fromOffer = offerRepository.selectById(offerId);
1094
            CreateOfferRequest createOfferRequest = offerService.getCreateOfferRequest(fromOffer);
1095
            System.out.println("Processing offer Id " + fromOffer);
1096
            offerService.processActivationtOffer(createOfferRequest);
1097
        }
33433 amit.gupta 1098
        //sdCreditService.checkLoans();
33384 amit.gupta 1099
        /*System.out.println(warehouseService.moveToBad(Arrays.asList("860374066889716",
1100
                "863587077946699",
1101
                "865883067303639",
1102
                "868116066180113",
1103
                "868116066179719")));*/
33423 amit.gupta 1104
        /*System.out.println(warehouseService.moveToGood(Arrays.asList("354814720314877",
33391 amit.gupta 1105
                "43356/c21100001116",
33423 amit.gupta 1106
                "34850/c21100054629")));*/
33355 amit.gupta 1107
        //this.test1();
33433 amit.gupta 1108
        this.processSidbiDeductions();
33316 amit.gupta 1109
        /*List<Order> orders = orderRepository.selectByInvoiceNumber("NSDL43328");
1110
        invoiceService.saveInvoice(orders);*/
33355 amit.gupta 1111
        /*for ( int fofoId : Arrays.asList(4149607,175138674,175138854,175138934,175138958,175139138,175139150,175139245,175139259,175139306,175139324,175139344,175139346,175139362,175139386,175139395,175139412,175139452,175139455,175139460,175139462,175139463,175139488,175139489,175139499,175139504,175139508,175139511,175139513,175139521,175139524,175139531,175139532,175139557,175139559,175139576,175139603,175139605,175139608,175139612,175139621,175139630,175139638,175139657,175139661,175139690,175139697,175139716,175139731)) {
33317 amit.gupta 1112
            try {
1113
                sdCreditService.fundWallet(fofoId);
1114
            } catch (ProfitMandiBusinessException pbse) {
1115
                LOGGER.info("Failed to fund wallet for - {}", fofoId);
1116
            }
33355 amit.gupta 1117
        }*/
33295 amit.gupta 1118
 
1119
        //transactionService.moveOrdersFulfimentWarehouseByBillingWarehouseId(7573);
32817 amit.gupta 1120
    }
1121
 
1122
    public void test3() throws Exception {
1123
        List<Long> payoutIds = Arrays.asList();
32795 amit.gupta 1124
        List<OfferPayout> offerPayouts = offerPayoutRepository.selectAllByIds(payoutIds);
33452 amit.gupta 1125
        Map<Integer, List<OfferPayout>> offerPayoutMap = offerPayouts.stream().collect(groupingBy(x -> (int) x.getOfferId()));
1126
        for (Entry<Integer, List<OfferPayout>> offerPayoutEntry : offerPayoutMap.entrySet()) {
32795 amit.gupta 1127
            int offerId = offerPayoutEntry.getKey();
1128
            List<OfferPayout> offerPayoutList = offerPayoutEntry.getValue();
33452 amit.gupta 1129
            Map<Integer, List<OfferPayout>> partnerOfferPayoutMap = offerPayoutList.stream().collect(groupingBy(x -> (int) x.getFofoId()));
32795 amit.gupta 1130
            for (Entry<Integer, List<OfferPayout>> partnerOfferPayoutEntry : partnerOfferPayoutMap.entrySet()) {
1131
                int fofoId = partnerOfferPayoutEntry.getKey();
1132
                List<OfferPayout> partnerPayouts = partnerOfferPayoutEntry.getValue();
1133
                float amount = 0;
1134
                for (OfferPayout offerPayout : partnerPayouts) {
1135
                    amount += offerPayout.getAmount();
1136
                    offerPayout.setStatus(SchemePayoutStatus.REJECTED);
1137
                    offerPayout.setRejectTimestamp(LocalDateTime.now());
1138
                }
1139
                walletService.rollbackAmountFromWallet(fofoId, amount, offerId,
1140
                        WalletReferenceType.ADDITIONAL_SCHEME, "Imeis returned - " + partnerPayouts.size() + "pc(s)", LocalDateTime.now());
1141
            }
1142
        }
1143
    }
1144
 
33316 amit.gupta 1145
    public void test1() throws Exception {
32690 amit.gupta 1146
        System.out.println("Hello from test");
32724 amit.gupta 1147
        //this.calculateInterestAccured();
32690 amit.gupta 1148
        //sendMailOfHtmlFormat(javaMailSender, new String[]{"amit.gupta@smartdukaan.com"}, "hello", null, "Hello");
32698 amit.gupta 1149
        //priceDropService.rejectPriceDropsOfApprovedImeis();
32511 amit.gupta 1150
        //Create return
32600 amit.gupta 1151
        //this.updatePartnerLimit();
32607 ranu 1152
        //creditNoteService.sendCnMails(YearMonth.now().minusMonths(2));
32690 amit.gupta 1153
        //orderService.createMissingScratchOffers();
33315 amit.gupta 1154
        LocalDateTime debitNoteDate = LocalDate.of(2024, Month.APRIL, 30).atStartOfDay();
32698 amit.gupta 1155
        Map<Integer, Set<String>> fofoIdImeiReturnMap = new LinkedHashMap<>();
33355 amit.gupta 1156
        /*fofoIdImeiReturnMap.put(175139690,	new HashSet<>(Arrays.asList("862054078463472","863862077158219","866202075810858","866202077654494","866335072023651","866518078002718")));
33315 amit.gupta 1157
        fofoIdImeiReturnMap.put(175139414,	new HashSet<>(Arrays.asList("356494471684303","356494471857164","356494472062590","861753065078075","863511068904178","863511069732933","864179068109203","864179068112504","864259078789978","866202076254130","866202076254775","866657078259165","866657078272846","867492065809718","867907071107955","868565073021423","868565073022223","868565073386347")));
1158
        fofoIdImeiReturnMap.put(175139603,	new HashSet<>(Arrays.asList("350886063151961","356412387787135","357594162824701","357594162874771","860600078193972","863862077025350","863862077875796","863967075815072","866335073794995","866335074287874","869116067546048")));
1159
        fofoIdImeiReturnMap.put(175139657,	new HashSet<>(Arrays.asList("350933415734746","354324787135850","354324788766356","354990352512960","354990352580181","358142881241184","866611064207332","869116067600464")));
1160
        fofoIdImeiReturnMap.put(175139223,	new HashSet<>(Arrays.asList("350210770983048","350210771169027","350210771179844","350210771180784","863975067090596","866611060326797","868565075758196","869452074016992","869452074609515","869452074609556","869452074976674","869452074978654")));
1161
        fofoIdImeiReturnMap.put(175139557,	new HashSet<>(Arrays.asList("861977073551795","861977073552678","861977074486819","862046062571245","862046067278226","862046067734921","862046067756866","864468070394741","864468071225506","864468071668341","864468073604740","864468074854625","866993074734475")));
1162
        fofoIdImeiReturnMap.put(175139079,	new HashSet<>(Arrays.asList("862046068861921","862282079169299","865388071283496","866335072007753","866335073946256","866518073601712","866518077425993","866518078760471","868938062675394","868938062690799","868938064895552")));
1163
        fofoIdImeiReturnMap.put(175139711,	new HashSet<>(Arrays.asList("861753065266498","861888066009099","864468073703369","866993071640154","869116062800465")));
1164
        fofoIdImeiReturnMap.put(175139488,	new HashSet<>(Arrays.asList("862054076866114","862054076866650","866335071879079","866335077875998","866335077876095","866518078758939","868938062692878")));
1165
        fofoIdImeiReturnMap.put(175138934,	new HashSet<>(Arrays.asList("862054072810231","862054072823150","862054076867674","862054078659590","863862075768456","863862077158193","863975064472490","863975064473233","865388071160033","865610079408035","866335072117370","866335073899471","866335074306153","866335075664477","868938062669876","868938062677895","868938062685997")));
1166
        fofoIdImeiReturnMap.put(4149607	 ,   new HashSet<>(Arrays.asList("864468073415741","864468075548523","864468075549927","864468079499426","866657074106022","868938062686656","868938062696978","868938062699352","868938064895198","868938066363799")));
1167
        fofoIdImeiReturnMap.put(175139138,	new HashSet<>(Arrays.asList("862286066217631","864259076533691","864468073358842","864487061610014","864487061675918","866083066080028","866518078760950","866518078768979","866657075343848","868544061108518","868544061138432","869116065510848","869116065519781","869452074116891","869452074972939")));
1168
        fofoIdImeiReturnMap.put(175139608,	new HashSet<>(Arrays.asList("350201087552063","350201087559944","350201087635660","350201087649760","350201087843140","350201088470224","350201088696687","350201088697180","354324783756923","354324786101366","355472822024008","355472822025625","860388068055779","860388068262219","866518078762337","866518078767534","868544061141493","868544061141774","868544061141816","868938064895719","868938066360910")));
1169
        fofoIdImeiReturnMap.put(175139731,	new HashSet<>(Arrays.asList("860600079214413","861753063502217","861753065084172","861753065084636","863975064472094","863975064473076","863975064477218","864468074456462","865883068726994","866657074641481","866657078016946","868938062699832","868938062700754")));
1170
        fofoIdImeiReturnMap.put(175138958,	new HashSet<>(Arrays.asList("863862075766393","864179064784108","866202075811732","866202076252654","866202078005571","868544060277439")));
1171
        fofoIdImeiReturnMap.put(175139612,	new HashSet<>(Arrays.asList("864468073474946","864468073477808","864468075031082","864468075280689","864468075745723","864468079481747","864468079483123","866657074538125","866657074538141","866657074573106","867467071856465","867467071875465","867467071891223","867467071913845","867467072729125","867467072760088")));
1172
        fofoIdImeiReturnMap.put(175139479,	new HashSet<>(Arrays.asList("863975062106595","863975064472672","863975064472870","863975064472953","863975064482333","863975064483570","863975064484719","863975064662694","863975064666455","863975064668931","863975067090257","863975067090810","863975067230218","863975067232230","866186062852892","866186062853973","866186062855051","866186062855077","866186063250773","866186063251094","866186063251219","866186063251318")));
1173
        fofoIdImeiReturnMap.put(175139245,	new HashSet<>(Arrays.asList("354324787133962","354324787569397","354324787602750","863816078139719","863816078448318","866335070534139")));
1174
        fofoIdImeiReturnMap.put(175139324,	new HashSet<>(Arrays.asList("863718060410316","863862075060755","865610074109257","866518078844457","866518079735159")));
1175
        fofoIdImeiReturnMap.put(175139576,	new HashSet<>(Arrays.asList("354324789013261","861128071288044","862736064686138","863718062236859","863816074642674","863816074646691","864259078939631","867467071870367","867467072760625","868565073047048")));
1176
        fofoIdImeiReturnMap.put(175139150,	new HashSet<>(Arrays.asList("860492060436217","861977073052257","862054073026738","862054073052056","863862077158938","866993074147710","867907071407074","868938060257450","868956064835055")));
1177
        fofoIdImeiReturnMap.put(175139463,	new HashSet<>(Arrays.asList("862181066909552","863816077757719","863816078448516","864214068977273","866335070447936","866335071699212","866335071699592","866335071700291")));
1178
        fofoIdImeiReturnMap.put(175139722,	new HashSet<>(Arrays.asList("358250293364682","358250294683627","358250295102007","861858064421273","861888066009537","864214068983198","864259078491112","864259078787733","865883068445694","866335072878930","866518078371014","868492068014968","868565072254660","868565073401468","868565073465661")));
1179
        fofoIdImeiReturnMap.put(168311083,	new HashSet<>(Arrays.asList("863718064506176","864468070873488","865883068175572","866335071204435","866335072093738","866518077064313","866657077386209","866657077862282","868938061427359")));
1180
        fofoIdImeiReturnMap.put(175139691,	new HashSet<>(Arrays.asList("863718061338714","863718061339258")));
1181
        fofoIdImeiReturnMap.put(175139395,	new HashSet<>(Arrays.asList("860492060436910","861220079009850","862054077288730","863511068660374","863718060300574","863718060617936","866335072874111","869452070894897")));
1182
        fofoIdImeiReturnMap.put(175139621,	new HashSet<>(Arrays.asList("351240553452191","351240553483527","351240553502920","354990353485570","860492062979750","860492062980998","864214068585274","864214068784398","864214068795378","864214068946534","864214068946757","864214068982075","868938061418754","868938061427391","868938062623139")));
1183
        fofoIdImeiReturnMap.put(175139638,	new HashSet<>(Arrays.asList("863862077159191","866518078780438","866518079750471","868428060238049","868938061532836","868938062619517")));
1184
        fofoIdImeiReturnMap.put(175139313,	new HashSet<>(Arrays.asList("350837023070346","350837023075022","350837023075568","350837023075782","352256988699643","862054076944275","863862075060359","863862075520055","864468075575948","865388072943635","868938060248574","868938061422830","868938062630894","869116061122184","869452070893717","869452073157912","869452074054373","869452075220890")));
1185
        fofoIdImeiReturnMap.put(175139513,	new HashSet<>(Arrays.asList("861977073670355","863718060618439","864468075204986","868024064295935","868024065473754","868024065567811","868024065763972","868956063947893")));
1186
        fofoIdImeiReturnMap.put(175139524,	new HashSet<>(Arrays.asList("350933416006946","350933416007944","351115165469199","351115165471237","351115167775437","351115167778431","351115167784413","351688420101625","355300592141142","358250295005267","358250295284607","359197386833520","359197386864947","862054073974671","862054073979597","862054074261730","862054074425954","862054074426036","864468073609384","866518078777392","868544060023239","868938060253772","868938060258516","868938061419018")));
1187
        fofoIdImeiReturnMap.put(175139359,	new HashSet<>(Arrays.asList("358250293060942","358250293061387","863718063044252","863862077160991","866335072536793","866335072536975","866335072537130","866335072726691","866335072726733","866335073628532","866335073925250","866335073925292","866335073926233","866335075267156")));
1188
        fofoIdImeiReturnMap.put(175139397,	new HashSet<>(Arrays.asList("861977073659010","863511069721050","864468071611101","864468074432844","864468074435284")));
1189
        fofoIdImeiReturnMap.put(175139677,	new HashSet<>(Arrays.asList("351115165472839","351115165476095","351115165476251","351115165477739","351115165483430","351115165485377","351115165486516","351115165487191","351115166897992","351115166898438","351115166900416","351115166900879","351115166902438","351115166903816","351115166903857","351115166903915","351115166904475","351115166905753","351115166906454","351115166906595","351115166907015","351115166907759","351115166907957","351115166908872","351115166909813","864259078771372","864468075692644","864468079730101","864468079736744","866657076858687","868565073398649","869116061118042","869116061261081")));
1190
        fofoIdImeiReturnMap.put(175139460,	new HashSet<>(Arrays.asList("860492061918494","862054079983072","862054079983171","866335070533032","866518078995119","866518079014993","868938060095017")));
1191
        fofoIdImeiReturnMap.put(175139585,	new HashSet<>(Arrays.asList("358250293614706","358250293614904","358250294602908","358250294603120","358250295002181","861977074487718","863718061173699","863816078050254","865883068445777","866335070453439","866335070526812","866335071204351","866518078640293","869116067596803")));
1192
        fofoIdImeiReturnMap.put(175139726,	new HashSet<>(Arrays.asList("861858064489411","863718063927654","864468073702221","864468073928784","864468074193149","865883068445819","866657078378742","866657078498904","867949078179850","867949078180494","868544060023197")));
1193
        fofoIdImeiReturnMap.put(175139532,	new HashSet<>(Arrays.asList("863718060615096","863718060615617","863718060727537","863816077797897","866335073405139","868565072217287","868565072264560","868956065132510")));
1194
        fofoIdImeiReturnMap.put(175139462,	new HashSet<>(Arrays.asList("865610074119819","865610074120536","866335072878658","866335072882098","866335073617030")));
1195
        fofoIdImeiReturnMap.put(175139259,	new HashSet<>(Arrays.asList("350210771180644","355300593052348","860492061918213","861858064422651","864259078402572","864259078924310","866335070769719","866335071700556","866335071742558","866657073553208","867949078178530","867949078692472","868024065518616","868024065619091","869116067492540")));
1196
        fofoIdImeiReturnMap.put(175139344,	new HashSet<>(Arrays.asList("350115571135781","354990352587723","358250293362843","358250293363148","862736064732510","865610070849617","865610070851290","866518078899998","868938062623378","868956065234613")));
1197
        fofoIdImeiReturnMap.put(175139602,	new HashSet<>(Arrays.asList("861128070090482","868565072242160","868565072243044","868565072261004","868565073051644")));
1198
        fofoIdImeiReturnMap.put(175139605,	new HashSet<>(Arrays.asList("861515075217922","861515076369466","863816074206397","863816075080072","864259078661755","864468075627368","867467071860541","868565072177903","868565073075726","868565073401625","868938060248012","868938066709652","869452074088611","869452074609234")));
1199
        fofoIdImeiReturnMap.put(175139640,	new HashSet<>(Arrays.asList("358250293363429","358250293363684","861753065277792","863511069733998","864214068943713","864259078496574","864259078518773","864487060042870","864487060050352","865883069366170","866518079782391","867949078692639","867949078692852","868273068551617","868938066464571","869452073150115")));
1200
        fofoIdImeiReturnMap.put(175139346,	new HashSet<>(Arrays.asList("356494471614953","860600076022215","861765072074616","861977070097412","864468074885181","864468076046105","865610073263139","865883065558994","866335075002538","866657079093605","867907070983216")));
1201
        fofoIdImeiReturnMap.put(175139489,	new HashSet<>(Arrays.asList("354324789015209","354324789081797","861515075189824","861515075575501","861977070268997","864468072790144","864468072983921","864468075233225","866657077951960","869452071082492","869452071982378","869452074617070")));
1202
        fofoIdImeiReturnMap.put(175139508,	new HashSet<>(Arrays.asList("861515075367024","864468072781283","864468074453386","864468075200448","864468076050669","866083062293849")));
1203
        fofoIdImeiReturnMap.put(175139716,	new HashSet<>(Arrays.asList("350832440575209","358250295571425","860600076019492","861753063494373","861753063501151","864468073696100","864468074855689","865883065542311","865883067956030","866202075825450","866202077663297","866335073632591","866657078023769")));
1204
        fofoIdImeiReturnMap.put(175139727,	new HashSet<>(Arrays.asList("355300592353325","355300593005387","861765072344258","862046060196128","864468073908604","864468073910121","864468073911269","867437074118411","868024064300099","868024065464977","868024065468218","869116065414389")));
1205
        fofoIdImeiReturnMap.put(175139521,	new HashSet<>(Arrays.asList("860600071402594","860600071416719","861888064397496","861977073658616","864468070509587","864468073866406","866335074999056","866657077949642","866657078406964","866993072229072","867437070891698")));
1206
        fofoIdImeiReturnMap.put(175139523,	new HashSet<>(Arrays.asList("354324785409950","354324788632830","354990352587939","358250295736085","358250295805187","358311601935629","863967076359575","866657074163502","867907070986318","869452071963378","869452074611750")));
1207
        fofoIdImeiReturnMap.put(175139697,	new HashSet<>(Arrays.asList("862282078030112","862282078867117","863975067709930","863975068443810","864468072828860","864468073705786","864468075276489","864468075277685","865610073830739","866335073264577","866518079802116","866657074518903","866657077949980","868565073058664","868938060985639","869116065613949")));
1208
        fofoIdImeiReturnMap.put(175139622,	new HashSet<>(Arrays.asList("358250293381926","358250293382304","358250293382601","358250294076046","358250294078109","358250294078463","358250294602064","358250294602429","358250294603062","358250294603203")));
1209
        fofoIdImeiReturnMap.put(175139699,	new HashSet<>(Arrays.asList("863718064441317","865610074942897","866202077653173","866202077653553","866335072262671","866335073632211","866335074805519")));
1210
        fofoIdImeiReturnMap.put(175139741,	new HashSet<>(Arrays.asList("861515071386101","861515074123402","861515074124186","861977073047752","861977073658574","864468075082804","864468076049869","865883065542139","865883067957111","866518070599679","866518079800672","866657078018587","866657078270162","866657079236220")));
1211
        fofoIdImeiReturnMap.put(175139114,	new HashSet<>(Arrays.asList("861888066708856","861977074487692","866335070051217","866335070517274","866993074145631")));
1212
        fofoIdImeiReturnMap.put(175139531,	new HashSet<>(Arrays.asList("863816077976194","863816079685710","866335070997336","866335074729354","866335075514698")));
1213
        fofoIdImeiReturnMap.put(175139386,	new HashSet<>(Arrays.asList("350210771192805","358250295053846","860388068563434","863862077333374","864468075193221","864562077193757","864718076084310","866202077464092","866202077742190","866518077001513","868565079682020","868956065252516")));
1214
        fofoIdImeiReturnMap.put(175139452,	new HashSet<>(Arrays.asList("350835033581484","350835034344999","350835035973283","350886063052599","351115165490559","351115165492290","351115165492811","354324788947428","354996630411503","354996631256261","355480685142494","355480686969416","359197386860549","861977073020494","862046067791525","862054077982977","866335072889499","867467072712048","868938062127511")));
1215
        fofoIdImeiReturnMap.put(175139306,	new HashSet<>(Arrays.asList("863718064547394","864718076075516","864718076083478","866202077463631","866202077470057")));
1216
        fofoIdImeiReturnMap.put(175139733,	new HashSet<>(Arrays.asList("350210771180008","861515071845668","861888067164877","866335070489094","866518076378276","868565072242269")));
1217
        fofoIdImeiReturnMap.put(175138824,	new HashSet<>(Arrays.asList("862054078573478","863862074697490","863862075442375","864468074485545","866335070216315","866657078016169","866657078449402","869116065542247")));
1218
        fofoIdImeiReturnMap.put(175139511,	new HashSet<>(Arrays.asList("862054075642557","862054075643530","862054076379357","862054077978934","863816078158016","868938062108974")));
1219
        fofoIdImeiReturnMap.put(175139701,	new HashSet<>(Arrays.asList("863862078258331","866611061131790")));
1220
        fofoIdImeiReturnMap.put(175139552,	new HashSet<>(Arrays.asList("861753065084958","866202075814439","866202075825633","866202075864194","866202076138754","866202076252811","866202077646870","866202077651094","866202077653876","866202077659956","866202077660293","866202077663339","866202078006397","866202078006611","866202078008914","866657078023280")));
1221
        fofoIdImeiReturnMap.put(175139499,	new HashSet<>(Arrays.asList("351115165467359","351115166905951","355358277809813","355358277814052","356049795822532","358250290682060","863862075504950","864468073944906","864468076048721","866657079234365")));
1222
        fofoIdImeiReturnMap.put(175139630,	new HashSet<>(Arrays.asList("357349229650288","358250290499184","358250294552947","358250294590301","860946078570556","860946078571059","861977073552215","861977073657790","861977073657832","861977073658731","861977074660850","862054075627517","862054075632756","862054075642979","862054076374879","863967071220830")));
1223
        fofoIdImeiReturnMap.put(175139720,	new HashSet<>(Arrays.asList("865388072300075","866335073071691","866335073073697","866335073390398")));
1224
        fofoIdImeiReturnMap.put(175138854,	new HashSet<>(Arrays.asList("50115570082950","351688420279827","351688420575703","354324788647382","357594162666201","359333606194530","863862075760198")));
1225
        fofoIdImeiReturnMap.put(175139569,	new HashSet<>(Arrays.asList("350201087565545","350201087948386","350201087949087","350210771180081","351088890316094","351088890318454","351088896121530","351088896127776","351088896127958","351088896133410","351088896133832","352476512881224","352476512979242","354448512964985","357888147926932","357888147928292","357888147928557","357888147929050","357888147929795","357888147933094","861128070182420","861753065277115","863511069713933","866657077333680","868273068567092","868565072301768","869116062743905","869452071985157","869452073161393")));
1226
        fofoIdImeiReturnMap.put(175139610,	new HashSet<>(Arrays.asList("862736063981738","863718063044617","866335072870176","866335072870598")));
1227
        fofoIdImeiReturnMap.put(175139366,	new HashSet<>(Arrays.asList("354324783144864","354324788632608","354889661849990","354990353239423","863967070558271","864718076129396","866657077789543","866657078285368","866657078508066","869116060977828","869116061054429","869116061208546")));
1228
        fofoIdImeiReturnMap.put(175139412,	new HashSet<>(Arrays.asList("351115165488595","351115165491318","351115165491359","351115165491458","351115165492332","355358278026573","355358278081610","861888063460717","861977073052018","863816078633919","865883069477035","866335074538870","866993071639594")));
1229
        fofoIdImeiReturnMap.put(175139504,	new HashSet<>(Arrays.asList("862054072660792","862054075971873","862054076312374","862054077948630","863816075363171","863862075442334","864718075894230","868938062122017","868938065268932","869452071940632","869452073034897","869452073158233","869452073158498","869452074159735")));
1230
        fofoIdImeiReturnMap.put(175139201,	new HashSet<>(Arrays.asList("863718061956671","863862075497734","863862075596915","864718076078510","864718076134834","866335070211639","866611060437032","866611061133812")));
1231
        fofoIdImeiReturnMap.put(175139362,	new HashSet<>(Arrays.asList("350201087545646","350201087547048","350201087547709","350201087548764","350201087597043","350201087597167","350201087597464","350201087597787","350201087598165","350201087600789","863718062929271","865883069477191","865883069477530","866335071174133","866518078023870","866518078243072","868938061053494")));
33355 amit.gupta 1232
        fofoIdImeiReturnMap.put(175139661,	new HashSet<>(Arrays.asList("860946077691031","861977074661155","862054073218855","866335070523694","867940069973476","868938062656477")));*/
33452 amit.gupta 1233
        fofoIdImeiReturnMap.put(175139556, new HashSet<>(Arrays.asList("863718063534013", "866335072895173", "866335073390810")));
1234
        fofoIdImeiReturnMap.put(175139721, new HashSet<>(Arrays.asList("358250294549067", "865883067508138", "866993072210619")));
33355 amit.gupta 1235
        /*fofoIdImeiReturnMap.put(175139455,	new HashSet<>(Arrays.asList("358293804087913","866518078020694","866518078021650","866518078243676","866518078571936")));
33315 amit.gupta 1236
        fofoIdImeiReturnMap.put(175138674,	new HashSet<>(Arrays.asList("351115165482275","359197386868583","862054074428875","862054077945693","862054078556879","863967070559535","863975068705671","863975068705770","864468076196124","866186064235971","866186066185117","866186066186917","866518073607370","866518079641514","868938060476456","868938060501535","868938060717990","868938062656931")));
1237
        fofoIdImeiReturnMap.put(175139559,	new HashSet<>(Arrays.asList("863718069016890","863816078879256","864468075283881","866335073245436","866335073403571","866657074268327","868024065473853","868956065899993","869452070362895","869452074030274")));
1238
        fofoIdImeiReturnMap.put(175139575,	new HashSet<>(Arrays.asList("354324786659199","860388067452035","861220078009919","863816078878134","863862075841154","865388070857498","867907071407116")));
33355 amit.gupta 1239
        fofoIdImeiReturnMap.put(175139686,	new HashSet<>(Arrays.asList("866657078019106","866657078032869")));*/
33315 amit.gupta 1240
 
33355 amit.gupta 1241
        //this.processOrdersToRebill(fofoIdImeiReturnMap, debitNoteDate);
1242
        purchaseReturnService.fixReturns(fofoIdImeiReturnMap, debitNoteDate);
32513 amit.gupta 1243
 
32698 amit.gupta 1244
    }
1245
 
1246
 
33315 amit.gupta 1247
    private void processOrdersToRebill(Map<Integer, Set<String>> fofoIdImeiReturnMap, LocalDateTime debitNoteDate) throws Exception {
32698 amit.gupta 1248
 
1249
 
1250
        for (Entry<Integer, Set<String>> fofoIdImeiReturnEntry : fofoIdImeiReturnMap.entrySet()) {
32511 amit.gupta 1251
            int fofoId = fofoIdImeiReturnEntry.getKey();
1252
            Set<String> imeis = fofoIdImeiReturnEntry.getValue();
1253
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(fofoId, imeis, true);
1254
            for (InventoryItem inventoryItem : inventoryItems) {
1255
                //inventoryItem.getId();
1256
                purchaseReturnService.returnInventoryItem(fofoId, true, inventoryItem.getId(), ReturnType.GOOD);
1257
                //Approve return
1258
                PurchaseReturnItem purchaseReturnItem = purchaseReturnItemRepository.selectByInventoryItemId(inventoryItem.getId());
1259
                purchaseReturnItem.setStatus(PurchaseReturnStatus.APPROVED);
1260
                purchaseReturnItem.setApproveTimestamp(LocalDateTime.now());
1261
            }
1262
            Map<Purchase, List<InventoryItem>> purchaseInventoryItemsMap = purchaseReturnService.getPurchaseMapForApprovedReturns(fofoId);
1263
            int walletAmount = walletService.getWalletAmount(fofoId);
1264
            List<DebitNote> debitNotes = purchaseReturnService.generateDebitNotes(purchaseInventoryItemsMap);
1265
            int walletDiff = walletAmount - walletService.getWalletAmount(fofoId);
1266
            if (walletDiff > 0) {
1267
                int reference = walletService.getManualReference(WalletReferenceType.OTHERS);
32514 amit.gupta 1268
                walletService.addAmountToWallet(fofoId, reference, WalletReferenceType.ADVANCE_AMOUNT, "Sytematically added for internal PO", (float) walletDiff + 5000, LocalDateTime.now());
32511 amit.gupta 1269
            }
32698 amit.gupta 1270
            List<CartItem> cartItems = new ArrayList<>();
32511 amit.gupta 1271
            for (DebitNote debitNote : debitNotes) {
33315 amit.gupta 1272
                debitNote.setCreateTimestamp(debitNoteDate);
32511 amit.gupta 1273
                //Try to refund amount per debit note
32698 amit.gupta 1274
                cartItems.addAll(this.refundDnAmount(debitNote));
32511 amit.gupta 1275
            }
32698 amit.gupta 1276
            //If order created
33452 amit.gupta 1277
            Map<Integer, List<CartItem>> warehouseCartItemsMap = cartItems.stream().collect(groupingBy(x -> x.getWarehouseId()));
1278
            for (Entry<Integer, List<CartItem>> warehouseCartItemsEntry : warehouseCartItemsMap.entrySet()) {
32223 amit.gupta 1279
 
32698 amit.gupta 1280
                List<CartItem> warehouseCartItems = warehouseCartItemsEntry.getValue();
1281
 
1282
                List<CartItem> mergedCartItems = warehouseCartItems.stream()
1283
                        .collect(Collectors.collectingAndThen(
33452 amit.gupta 1284
                                groupingBy(x -> x.getItemId(), Collectors.collectingAndThen(
32724 amit.gupta 1285
                                        Collectors.reducing((a, b) -> {
32698 amit.gupta 1286
                                            a.setQuantity(a.getQuantity() + b.getQuantity());
1287
                                            return a;
1288
                                        }), Optional::get)),
1289
                                m -> new ArrayList<>(m.values())));
1290
 
32724 amit.gupta 1291
                double walletTotalAmount = mergedCartItems.stream().mapToDouble(x -> x.getQuantity() * x.getSellingPrice()).sum();
32698 amit.gupta 1292
 
1293
                com.spice.profitmandi.dao.entity.user.User user = userRepository.selectById(fofoId);
1294
                cartService.clearCart(user.getActiveCartId());
1295
                cartService.addItemsToCart(user.getActiveCartId(), mergedCartItems);
1296
 
1297
                UserCart userCart = new UserCart();
1298
                userCart.setCartId(user.getActiveCartId());
1299
                userCart.setUserId(user.getId());
1300
 
1301
                int transactionId = transactionService.createTransactionInternally(userCart, walletTotalAmount, warehouseCartItemsEntry.getKey());
1302
                commonPaymentService.payThroughWallet(transactionId);
1303
                transactionService.processTransaction(transactionId);
1304
            }
1305
        }
31697 amit.gupta 1306
    }
32048 tejbeer 1307
 
32384 amit.gupta 1308
    @Autowired
32511 amit.gupta 1309
    CartService cartService;
1310
    @Autowired
1311
    UserRepository userRepository;
1312
 
1313
    @Autowired
1314
    WarehouseScanRepository warehouseScanRepository;
1315
 
1316
    @Autowired
1317
    WarehouseInventoryService warehouseInventoryService;
1318
 
1319
    @Autowired
1320
    CommonPaymentService commonPaymentService;
1321
 
32533 amit.gupta 1322
    @Autowired
1323
    LineItemImeisRepository lineItemImeisRepository;
1324
 
32698 amit.gupta 1325
 
32511 amit.gupta 1326
    //Also create order
32698 amit.gupta 1327
    private List<CartItem> refundDnAmount(DebitNote debitNote) throws ProfitMandiBusinessException {
32511 amit.gupta 1328
        List<Integer> inventoryItemIds = purchaseReturnItemRepository.selectAllByDebitNoteId(debitNote.getId()).stream().map(x -> x.getInventoryItemId()).collect(Collectors.toList());
33452 amit.gupta 1329
        Map<Integer, Long> inventoryItemCountMap = inventoryItemIds.stream().collect(groupingBy(x -> x, Collectors.counting()));
32511 amit.gupta 1330
        List<InventoryItem> inventoryItems = inventoryItemRepository.selectAllByIds(new ArrayList<>(inventoryItemCountMap.keySet()));
1331
        Purchase purchase = purchaseRepository.selectById(inventoryItems.get(0).getPurchaseId());
1332
        String invoice = purchase.getPurchaseReference();
1333
        List<Order> orders = orderRepository.selectByInvoiceNumber(invoice);
1334
        Set<Integer> orderIds = orders.stream().map(x -> x.getId()).collect(Collectors.toSet());
1335
        Order order = orders.get(0);
1336
        float totalAmount = 0;
1337
        int totalQty = 0;
1338
        Map<Integer, CartItem> itemIdCartItemMap = new HashMap<>();
1339
 
1340
        List<CartItem> cartItems = new ArrayList<>();
1341
        for (InventoryItem inventoryItem : inventoryItems) {
1342
            TagListing tagListing = tagListingRepository.selectByItemId(inventoryItem.getItemId());
1343
            long quantity = inventoryItemCountMap.get(inventoryItem.getId());
1344
            totalAmount += inventoryItem.getUnitPrice() * quantity;
1345
            totalQty += quantity;
1346
            if (!itemIdCartItemMap.containsKey(inventoryItem.getItemId())) {
1347
                CartItem cartItem = new CartItem();
1348
                cartItem.setItemId(inventoryItem.getItemId());
1349
                cartItem.setSellingPrice(tagListing.getSellingPrice());
32698 amit.gupta 1350
                cartItem.setWarehouseId(order.getWarehouseId());
32511 amit.gupta 1351
                cartItems.add(cartItem);
1352
                itemIdCartItemMap.put(inventoryItem.getItemId(), cartItem);
1353
            }
1354
            CartItem cartItem = itemIdCartItemMap.get(inventoryItem.getItemId());
1355
            cartItem.setQuantity((int) quantity + cartItem.getQuantity());
1356
        }
1357
        String rollbackDescription = String.format("Refunded against DN %s, %d pc(s)", debitNote.getDebitNoteNumber(), totalQty);
1358
        walletService.addAmountToWallet(debitNote.getFofoId(), order.getTransactionId(), WalletReferenceType.PURCHASE, rollbackDescription, totalAmount, LocalDateTime.now());
1359
        //Before creating order lets try to in the stock
1360
 
1361
        //All scans pertaining to specific Invoices
1362
        List<WarehouseScan> warehouseScans = warehouseScanRepository.selectAllByOrderIds(new ArrayList<>(orderIds));
32698 amit.gupta 1363
        Map<Integer, Integer> inventoryItemIdOrderIdMap = new HashMap<>();
1364
        try {
1365
            inventoryItemIdOrderIdMap = warehouseScans.stream().collect(Collectors.toMap(x -> x.getInventoryItemId(), x -> x.getQuantity()));
32724 amit.gupta 1366
        } catch (Exception e) {
32698 amit.gupta 1367
            LOGGER.info("Could not process for fofoId - {}, {}", debitNote.getFofoId(), warehouseScans);
1368
        }
32511 amit.gupta 1369
        List<Integer> warehouseInventoryItemIds = warehouseScans.stream().filter(x -> !(x.getType().equals(in.shop2020.warehouse.ScanType.SALE_RET) || x.getType().equals(in.shop2020.warehouse.ScanType.SALE_RET_UNUSABLE)))
1370
                .map(x -> x.getInventoryItemId()).collect(Collectors.toList());
1371
        List<WarehouseInventoryItem> warehouseInventoryItems = warehouseInventoryItemRepository.selectAllByIds(warehouseInventoryItemIds);
1372
 
1373
        Map<String, WarehouseInventoryItem> serialNumberWarehouseInventoryItemMap = warehouseInventoryItems.stream().filter(x -> StringUtils.isNotBlank(x.getSerialNumber())).collect(Collectors.toMap(x -> x.getSerialNumber(), x -> x));
1374
 
1375
        for (InventoryItem inventoryItem : inventoryItems) {
1376
            if (StringUtils.isBlank(inventoryItem.getSerialNumber())) {
1377
                //As of now this should be happening as  dn are specifically for serialized devices
1378
                /*int returnQty = inventoryItemCountMap.get(inventoryItem.getId()).intValue();
1379
                List<WarehouseInventoryItem> warehouseInventoryItemList = itemIdWarehouseInventoryItemsMap.get(inventoryItem.getItemId());
1380
                warehouseInventoryService.returnNonSerializedQty(warehouseInventoryItem)*/
1381
            } else if (StringUtils.isNotBlank(inventoryItem.getSerialNumber())) {
1382
                String serialNumber = inventoryItem.getSerialNumber();
1383
                WarehouseInventoryItem warehouseInventoryItem = serialNumberWarehouseInventoryItemMap.get(serialNumber);
1384
                warehouseInventoryItem.setLastScanType(in.shop2020.warehouse.ScanType.SALE_RET);
1385
                warehouseInventoryService.addQuantity(warehouseInventoryItem.getId(), 1);
1386
                WarehouseScan warehouseScan = new WarehouseScan();
1387
                warehouseScan.setInventoryItemId(warehouseInventoryItem.getId());
1388
                warehouseScan.setQuantity(1);
1389
                warehouseScan.setOrderId(inventoryItemIdOrderIdMap.get(warehouseInventoryItem.getItemId()));
1390
                warehouseScan.setScannedAt(LocalDateTime.now());
1391
                warehouseScan.setType(in.shop2020.warehouse.ScanType.SALE_RET);
1392
                warehouseScanRepository.persist(warehouseScan);
1393
 
1394
            }
1395
        }
1396
 
1397
        //Create Order as well
32724 amit.gupta 1398
        return cartItems;
32698 amit.gupta 1399
    }
32511 amit.gupta 1400
 
32698 amit.gupta 1401
    void addToCartAndCreateOrder() {
32511 amit.gupta 1402
 
1403
    }
1404
 
1405
    @Autowired
32384 amit.gupta 1406
    WarehouseDebitNoteRepository warehouseDebitNoteRepository;
1407
    @Autowired
1408
    WarehouseDebitNoteLineRepository warehouseDebitNoteLineRepository;
1409
 
1410
    @Autowired
1411
    WarehouseInvoiceItemRepository warehouseInvoiceItemRepository;
1412
    @Autowired
1413
    WarehouseSupplierInvoiceRepository warehouseSupplierInvoiceRepository;
1414
 
1415
    @Autowired
1416
    PurchaseOrderService purchaseOrderService;
1417
 
32482 amit.gupta 1418
    @Autowired
1419
    VendorCatalogPricingLogRepository vendorCatalogPricingLogRepository;
32384 amit.gupta 1420
 
32214 jai.hind 1421
//    private void checkItelImeiActivationNew(LocalDate now, int i) {
1422
//    }
1423
 
32169 amit.gupta 1424
    @Autowired
1425
    SessionFactory sessionFactory;
1426
 
1427
    private void checkAllPayoutsDuplicate() throws Exception {
1428
        final Session session = sessionFactory.getCurrentSession();
32439 tejbeer 1429
        final NativeQuery<Object[]> nativeQuery = session.createNativeQuery("select sio.inventory_item_id, sio.scheme_id, sio.status, count(*) c\n" + "from fofo.scheme_in_out sio\n" + "         join catalog.scheme s on s.id = sio.scheme_id\n" + "where (sio.status = 'CREDITED'\n" + "    or sio.status = 'PENDING')\n" + "  and s.type != 'INVESTMENT'\n" + " and sio.create_timestamp >= '2023-01-01' " + "group by sio.inventory_item_id, sio.scheme_id, sio.status\n" + "having c > 1");
32169 amit.gupta 1430
        List<Object[]> resultList = nativeQuery.getResultList();
1431
        for (Object[] tuple : resultList) {
1432
            LOGGER.info("RESULT -- {}, {}, {}", tuple[0], tuple[1], tuple[2]);
1433
            int inventoryItemId = (Integer) tuple[0];
1434
            int schemeId = (Integer) tuple[1];
1435
            SchemePayoutStatus schemePayoutStatus = SchemePayoutStatus.valueOf((String) tuple[2]);
1436
            List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByScheme(schemeId, inventoryItemId);
1437
            List<SchemeInOut> statusSpecificSchemeInOuts = schemeInOuts.stream().filter(x -> x.getStatus().equals(schemePayoutStatus)).collect(Collectors.toList());
1438
            if (statusSpecificSchemeInOuts.size() > 0) {
1439
                InventoryItem inventoryItem = inventoryItemRepository.selectById(inventoryItemId);
1440
                Scheme scheme = schemeRepository.selectById(schemeId);
1441
                List<ScanRecord> scanRecords = scanRecordRepository.selectByInventoryItemId(inventoryItemId);
1442
                if (scheme.getType().equals(SchemeType.IN)) {
1443
                    LOGGER.info("Skipping -- {}", inventoryItem.getSerialNumber());
1444
                } else {
1445
                    int fofoOrderId = scanRecords.stream().filter(x -> x.getOrderId() != 0).max(Comparator.comparing(x -> x.getOrderId())).get().getOrderId();
1446
                    WalletReferenceType walletReferenceType = SchemeType.ACTIVATION.equals(scheme.getType()) ? WalletReferenceType.ACTIVATION_SCHEME : SchemeType.SPECIAL_SUPPORT.equals(scheme.getType()) ? WalletReferenceType.SPECIAL_SUPPORT : WalletReferenceType.SCHEME_OUT;
1447
                    List<UserWalletHistory> userWalletHistoryList = userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrderId, walletReferenceType).stream().filter(x -> x.getAmount() == Math.round(statusSpecificSchemeInOuts.get(0).getAmount())).collect(Collectors.toList());
1448
                    LOGGER.info("UserwalletHistory Entry --> {}, Sios --> {}", userWalletHistoryList.size(), statusSpecificSchemeInOuts.size());
1449
                    if (userWalletHistoryList.size() != statusSpecificSchemeInOuts.size()) {
1450
                        //Skipping them in first run as it is the special casw of upgrade where mismatch has happend.
1451
                        LOGGER.info("problem with {}, sio status - {}, inventoryItem id {}, schemeID {} ", fofoOrderId, statusSpecificSchemeInOuts.stream().map(x -> x.getStatus()).collect(Collectors.toList()), inventoryItemId, schemeId);
1452
                        //Primarily multiple pending cases
1453
                        statusSpecificSchemeInOuts.stream().skip(1).forEach(schemeInOut -> {
1454
                            schemeInOut.setStatus(SchemePayoutStatus.REJECTED);
1455
                            schemeInOut.setStatusDescription("Rejected as entry is duplicate");
1456
                        });
1457
                    } else {
1458
                        userWalletHistoryList.stream().skip(1).forEach(userWalletHistory -> {
1459
                            try {
1460
                                walletService.rollbackAmountFromWallet(inventoryItem.getFofoId(), userWalletHistory.getAmount(), userWalletHistory.getReference(), userWalletHistory.getReferenceType(), "Reversal as multiple entries created", userWalletHistory.getBusinessTimestamp());
1461
                            } catch (ProfitMandiBusinessException e) {
1462
                                throw new RuntimeException(e);
1463
                            }
1464
                        });
1465
 
1466
                        statusSpecificSchemeInOuts.stream().skip(1).forEach(schemeInOut -> {
1467
                            schemeInOut.setStatus(SchemePayoutStatus.REJECTED);
1468
                            if (schemePayoutStatus.equals(SchemePayoutStatus.CREDITED)) {
1469
                                schemeInOut.setRolledBackTimestamp(LocalDateTime.now());
1470
                                schemeInOut.setStatusDescription("Rolled back as entry is duplicate");
1471
                            } else {
1472
                                LOGGER.info("This seems higly unreachable should not come here");
1473
                                schemeInOut.setStatusDescription("Rejected as entry is duplicate");
1474
                            }
1475
                        });
1476
                    }
1477
                }
1478
            }
1479
        }
1480
    }
1481
 
31697 amit.gupta 1482
    public void sendMailForSamsungRebilling() throws Exception {
1483
        List<BilledImeiModel> samsungModels = warehouseInventoryItemRepository.findByBillingDateBrand(LocalDate.now(), "Samsung");
1484
        LOGGER.info("SamsungModels {}", samsungModels);
1485
        samsungModels = samsungModels.stream().sorted(Comparator.comparing(x -> x.getPcmDate() == null ? -1 : 1)).collect(Collectors.toList());
1486
        if (samsungModels.size() > 0) {
1487
            List<String> headers = Arrays.asList("Partner Id", "Code", "Name", "City", "Brand", "Model Name", "Model Number", "Color", "Serial Number", "Remarks");
1488
            List<List<?>> rows = new ArrayList<>();
1489
            for (BilledImeiModel billedImeiModel : samsungModels) {
31886 tejbeer 1490
                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 1491
                rows.add(row);
1492
            }
1493
            ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
1494
            String[] sendToArray = new String[]{"kamini.sharma@smartdukaan.com", "praveen.sharma@smartdukaan.com"};
1495
            String fileName = "Imeis need Rebilling -" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
31886 tejbeer 1496
            Utils.sendMailWithAttachment(googleMailSender, sendToArray, new String[]{"tarun.verma@smartdukaan.com"}, "Samsung Rebilling IMEI Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
31697 amit.gupta 1497
        }
1498
    }
24002 amit.gupta 1499
 
31697 amit.gupta 1500
    public void sendPartnerInvestmentDetails(List<String> sendTo) throws Exception {
1501
        LocalDate yesterDay = LocalDate.now().minusDays(1);
1502
        List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
31886 tejbeer 1503
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
25312 amit.gupta 1504
 
32169 amit.gupta 1505
        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 1506
        List<List<?>> rows = new ArrayList<>();
1507
        Map<Integer, List<?>> partnerRowsMap = new HashMap<>();
25598 amit.gupta 1508
 
31697 amit.gupta 1509
        Map<Integer, FofoReportingModel> partnerIdSalesHeaderMap = this.getPartnerIdSalesHeaders();
25312 amit.gupta 1510
 
31886 tejbeer 1511
        Map<Integer, Integer> shortDaysMap = partnerDailyInvestmentRepository.selectAll(LocalDate.now().withDayOfMonth(1), LocalDate.now()).stream().collect(groupingBy(
1512
                x -> x.getFofoId(), Collectors.summingInt(x -> x.getShortPercentage() > 10 ? 1 : 0)));
24271 amit.gupta 1513
 
31697 amit.gupta 1514
        for (FofoStore fofoStore : fofoStores) {
1515
            LOGGER.info("Fofo Store {},  {}", fofoStore.getId(), fofoStore.getCode());
1516
            int fofoId = fofoStore.getId();
1517
            PartnerDailyInvestment partnerDailyInvestment = partnerInvestmentService.getInvestment(fofoId, 1);
1518
            partnerDailyInvestment.setDate(yesterDay);
24177 govind 1519
 
31697 amit.gupta 1520
            try {
1521
                partnerDailyInvestmentRepository.persist(partnerDailyInvestment);
31886 tejbeer 1522
                shortDaysMap.put(fofoId, shortDaysMap.get(fofoId) + (partnerDailyInvestment.getShortPercentage() > 10 ? 1 : 0));
31697 amit.gupta 1523
            } catch (Exception e) {
1524
                // ignore the exceptions during persist
1525
            }
25598 amit.gupta 1526
 
31697 amit.gupta 1527
            CustomRetailer retailer = customRetailerMap.get(fofoStore.getId());
1528
            if (retailer == null || partnerIdSalesHeaderMap.get(fofoStore.getId()) == null) {
1529
                LOGGER.info("Could not find retailer with retailer Id {}", fofoStore.getId());
1530
                continue;
1531
            }
1532
            FofoReportingModel reportingModel = partnerIdSalesHeaderMap.get(fofoStore.getId());
1533
            List<Serializable> row = new ArrayList<>();
31886 tejbeer 1534
            row.addAll(Arrays.asList(reportingModel.getCode(), reportingModel.getBusinessName(), reportingModel.getRegionalManager(), reportingModel.getTerritoryManager()));
31697 amit.gupta 1535
            row.addAll(
31886 tejbeer 1536
                    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 1537
            partnerRowsMap.put(fofoStore.getId(), row);
1538
            rows.add(row);
25837 amit.gupta 1539
 
31697 amit.gupta 1540
        }
25837 amit.gupta 1541
 
31697 amit.gupta 1542
        String fileName = "InvestmentSummary-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
25837 amit.gupta 1543
 
31697 amit.gupta 1544
        if (sendTo == null) {
33452 amit.gupta 1545
            for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMapping().entrySet()) {
31886 tejbeer 1546
                List<List<?>> filteredRows = storeGuyEntry.getValue().stream().map(x -> partnerRowsMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
31697 amit.gupta 1547
                ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, filteredRows);
1548
                String[] sendToArray = new String[]{storeGuyEntry.getKey()};
31886 tejbeer 1549
                Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
31697 amit.gupta 1550
            }
31886 tejbeer 1551
            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 1552
        }
25837 amit.gupta 1553
 
31697 amit.gupta 1554
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
1555
        String[] sendToArray = sendTo.toArray(new String[sendTo.size()]);
31886 tejbeer 1556
        Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
25837 amit.gupta 1557
 
31697 amit.gupta 1558
    }
25598 amit.gupta 1559
 
33256 amit.gupta 1560
    private Map<Integer, FofoReportingModel> getPartnerIdSalesHeaders() throws ProfitMandiBusinessException {
31697 amit.gupta 1561
        Map<String, SaleRoles> partnerEmailSalesMap = new HashMap<>();
1562
        Map<String, SaleRoles> partnerEmailRBMMap = new HashMap<>();
24271 amit.gupta 1563
 
31886 tejbeer 1564
        List<Position> positions = positionRepository.selectPositionByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_RBM));
1565
        Map<Integer, AuthUser> authUsersMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
31697 amit.gupta 1566
        Map<Integer, List<CustomRetailer>> positionIdRetailerMap = csService.getPositionCustomRetailerMap(positions);
1567
        for (Position position : positions) {
1568
            List<CustomRetailer> crList = positionIdRetailerMap.get(position.getId());
1569
            if (crList == null)
1570
                continue;
1571
            if (position.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_SALES) {
1572
                for (CustomRetailer cr : crList) {
1573
                    if (!partnerEmailSalesMap.containsKey(cr.getEmail())) {
1574
                        partnerEmailSalesMap.put(cr.getEmail(), new SaleRoles());
1575
                    }
1576
                    SaleRoles saleRoles = partnerEmailSalesMap.get(cr.getEmail());
1577
                    AuthUser authUser = authUsersMap.get(position.getAuthUserId());
1578
                    if (authUser == null) {
1579
                        continue;
1580
                    }
1581
                    String name = authUser.getFirstName() + " " + authUser.getLastName();
1582
                    if (position.getEscalationType().equals(EscalationType.L1)) {
1583
                        saleRoles.getL1().add(name);
1584
                    } else if (position.getEscalationType().equals(EscalationType.L2)) {
1585
                        saleRoles.getL2().add(name);
1586
                    }
1587
                }
1588
            }
1589
            if (position.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_RBM) {
1590
                for (CustomRetailer cr : crList) {
1591
                    if (!partnerEmailRBMMap.containsKey(cr.getEmail())) {
1592
                        partnerEmailRBMMap.put(cr.getEmail(), new SaleRoles());
1593
                    }
1594
                    SaleRoles saleRoles = partnerEmailRBMMap.get(cr.getEmail());
1595
                    AuthUser authUser = authUsersMap.get(position.getAuthUserId());
1596
                    if (authUser == null) {
1597
                        continue;
1598
                    }
1599
                    String name = authUser.getFirstName() + " " + authUser.getLastName();
1600
                    if (position.getEscalationType().equals(EscalationType.L1) || position.getEscalationType().equals(EscalationType.L1)) {
1601
                        saleRoles.getL1().add(name);
1602
                    }
1603
                    /*else if (position.getEscalationType().equals(EscalationType.L2)) {
1604
                        saleRoles.getL2().add(name);
1605
                    }*/
1606
                }
1607
            }
24692 amit.gupta 1608
 
31697 amit.gupta 1609
        }
25418 amit.gupta 1610
 
31697 amit.gupta 1611
        Set<CustomRetailer> allCrList = new HashSet<>();
1612
        for (List<CustomRetailer> cr : positionIdRetailerMap.values()) {
1613
            allCrList.addAll(cr);
1614
        }
25609 amit.gupta 1615
 
31886 tejbeer 1616
        Map<Integer, FofoStore> fofoStoresMap = fofoStoreRepository.selectActiveStores().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
25503 amit.gupta 1617
 
31697 amit.gupta 1618
        Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = new HashMap<>();
25503 amit.gupta 1619
 
31697 amit.gupta 1620
        for (CustomRetailer cr : allCrList) {
1621
            FofoStore fofoStore = fofoStoresMap.get(cr.getPartnerId());
1622
            if (fofoStore == null) {
1623
                LOGGER.info("Could not find Store {} in active Store", cr.getBusinessName());
1624
                continue;
1625
            }
1626
            String code = fofoStore.getCode();
1627
            // String storeName = "SmartDukaan-" +
1628
            // fofoStore.getCode().replaceAll("[a-zA-Z]", "");
1629
            String businessName = cr.getBusinessName();
1630
            try {
1631
                String stateManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL2(), ", ");
1632
                String territoryManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL1(), ", ");
1633
                String bdm = StringUtils.join(partnerEmailRBMMap.get(cr.getEmail()).getL1(), ", ");
1634
                FofoReportingModel reportingModel = new FofoReportingModel();
1635
                reportingModel.setBusinessName(businessName);
1636
                reportingModel.setCode(code);
1637
                reportingModel.setFofoId(fofoStore.getId());
1638
                reportingModel.setRegionalManager(stateManager);
1639
                reportingModel.setTerritoryManager(territoryManager);
1640
                reportingModel.setBusinessManager(bdm);
1641
                partnerIdSalesHeadersMap.put(fofoStore.getId(), reportingModel);
1642
            } catch (Exception e) {
1643
                LOGGER.warn("Could not find partner with email - {}", cr.getEmail());
1644
            }
1645
        }
1646
        return partnerIdSalesHeadersMap;
24533 govind 1647
 
31697 amit.gupta 1648
    }
28709 amit.gupta 1649
 
31697 amit.gupta 1650
    public void sendPartnerInvestmentDetails() throws Exception {
1651
        this.sendPartnerInvestmentDetails(null);
1652
    }
28709 amit.gupta 1653
 
31697 amit.gupta 1654
    public void sendAgeingReport(String... sendTo) throws Exception {
28790 amit.gupta 1655
 
31886 tejbeer 1656
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.WAREHOUSENEW, "itemstockageing.xml");
1657
        InputStreamSource isr1 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "ItemwiseOverallPendingIndent.xml");
31697 amit.gupta 1658
        Attachment attachment = new Attachment(
1659
                "ageing-report-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr);
1660
        Attachment attachment1 = new Attachment(
1661
                "pending-indent-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr1);
28790 amit.gupta 1662
 
31886 tejbeer 1663
        Utils.sendMailWithAttachments(googleMailSender, STOCK_AGEING_MAIL_LIST, null, "Stock Ageing Report", "PFA", attachment);
1664
        Utils.sendMailWithAttachments(googleMailSender, ITEMWISE_PENDING_INDENT_MAIL_LIST, null, "Itemwise Pending indent", "PFA", attachment1);
28790 amit.gupta 1665
 
31697 amit.gupta 1666
        // Reports to be sent to mapped partners
1667
        Map<String, Set<String>> storeGuysMap = csService.getAuthUserPartnerEmailMapping();
28790 amit.gupta 1668
 
33452 amit.gupta 1669
        for (Entry<String, Set<String>> storeGuyEntry : storeGuysMap.entrySet()) {
31697 amit.gupta 1670
            Map<String, String> params = new HashMap<>();
1671
            if (storeGuyEntry.getValue().size() == 0)
1672
                continue;
1673
            params.put("MANUAL_email", String.join(",", storeGuyEntry.getValue()));
31886 tejbeer 1674
            InputStreamSource isr3 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "focostockreport.xml", params);
31697 amit.gupta 1675
            Attachment attache = new Attachment(
1676
                    "Franchise-stock-report" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr3);
1677
            System.out.println(storeGuyEntry.getValue());
31886 tejbeer 1678
            Utils.sendMailWithAttachments(googleMailSender, new String[]{storeGuyEntry.getKey()}, null, "Franchise Stock Report", "PFA", attache);
31697 amit.gupta 1679
        }
28839 tejbeer 1680
 
31697 amit.gupta 1681
    }
28839 tejbeer 1682
 
31697 amit.gupta 1683
    public void sendIndentTertiary() throws Exception {
28790 amit.gupta 1684
 
31886 tejbeer 1685
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "indentandtertiary.xml");
31697 amit.gupta 1686
        Attachment attachment = new Attachment(
1687
                "indentandtertiary-report-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr);
31886 tejbeer 1688
        Utils.sendMailWithAttachments(googleMailSender, INDENT_TERTIARY_MAIL_LIST, null, "Indent Tertiary Report", "PFA", attachment);
28790 amit.gupta 1689
 
31697 amit.gupta 1690
    }
28790 amit.gupta 1691
 
31697 amit.gupta 1692
    public void sendAttendanceMorningAlert() throws Exception {
1693
        LocalDateTime moriningTime = LocalDate.now().atTime(10, 31);
1694
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
31886 tejbeer 1695
        Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28775 amit.gupta 1696
 
31697 amit.gupta 1697
        List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
1698
        Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28790 amit.gupta 1699
 
31886 tejbeer 1700
        List<EmployeeAttendance> employeeAttendances = employeeAttendanceRepository.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now());
28784 amit.gupta 1701
 
31886 tejbeer 1702
        Map<Integer, Optional<EmployeeAttendance>> employeeMorningAttendance = employeeAttendances.stream().collect(groupingBy(EmployeeAttendance::getUserId, Collectors.minBy(Comparator.comparing(EmployeeAttendance::getCreateTimestamp))));
31697 amit.gupta 1703
        for (AuthUser authUser : authUsers) {
1704
            User user = userMap.get(authUser.getEmailId());
1705
            Optional<EmployeeAttendance> employeeAttendanceOptional = employeeMorningAttendance.get(user.getId());
1706
            LOGGER.info("AuthUser - {}, employeeAttendanceOptional {}", authUser.getName(), employeeAttendanceOptional);
1707
            if (employeeAttendanceOptional != null) {
1708
                LOGGER.info("employeeAttendanceOptional.orElse {}", employeeAttendanceOptional.orElse(null));
1709
                if (employeeAttendanceOptional.orElse(null) != null) {
31886 tejbeer 1710
                    LOGGER.info("employeeAttendanceOptional.get().getCreateTimestamp() {}", employeeAttendanceOptional.get().getCreateTimestamp());
31697 amit.gupta 1711
                }
1712
            }
31886 tejbeer 1713
            if (employeeAttendanceOptional == null || employeeAttendanceOptional.orElse(null) == null || employeeAttendanceOptional.get().getCreateTimestamp().isAfter(moriningTime)) {
31697 amit.gupta 1714
                LOGGER.info("Will Send Email to {}", authUser.getFullName());
1715
                String body = String.format(
31886 tejbeer 1716
                        "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 1717
 
31886 tejbeer 1718
                Utils.sendMailWithAttachments(googleMailSender, new String[]{authUser.getEmailId()}, new String[]{"kangan.monga@smartdukaan.com"}, "Attendance Alert", body);
28790 amit.gupta 1719
 
31697 amit.gupta 1720
            }
1721
        }
28790 amit.gupta 1722
 
31697 amit.gupta 1723
    }
28790 amit.gupta 1724
 
31697 amit.gupta 1725
    public void sendAttendanceEveningAlert() throws Exception {
1726
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
31886 tejbeer 1727
        Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28709 amit.gupta 1728
 
31697 amit.gupta 1729
        List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
1730
        Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28709 amit.gupta 1731
 
31886 tejbeer 1732
        Map<Integer, List<EmployeeAttendance>> employeeAttendancesMap = employeeAttendanceRepository.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now()).stream().collect(groupingBy(x -> x.getUserId()));
28709 amit.gupta 1733
 
31697 amit.gupta 1734
        for (AuthUser authUser : authUsers) {
1735
            User user = userMap.get(authUser.getEmailId());
1736
            String body = null;
1737
            List<EmployeeAttendance> employeeAttendances = employeeAttendancesMap.get(user.getId());
1738
            if (employeeAttendances == null) {
1739
                body = String.format(
31886 tejbeer 1740
                        "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 1741
            } else {
31886 tejbeer 1742
                List<LocalDateTime> punchTimes = employeeAttendances.stream().sorted(Comparator.comparing(EmployeeAttendance::getCreateTimestamp)).map(x -> x.getCreateTimestamp()).collect(Collectors.toList());
31697 amit.gupta 1743
                if (punchTimes.size() == 1) {
1744
                    // body = String.format("Dear %s,\n Pls note that you haven't punched out yet.
1745
                    // You have been marked absent for half the day. You may contact your manager
1746
                    // and get it regularise.\n\nRegards\nHR Team", authUser.getFullName());
1747
                } else {
1748
                    LocalDateTime firstPunch = punchTimes.get(0);
1749
                    LocalDateTime lastPunch = punchTimes.get(punchTimes.size() - 1);
1750
                    Duration duration = Duration.between(firstPunch, lastPunch);
1751
                    boolean hoursCompleted = lastPunch.isAfter(firstPunch.plusHours(8).plusMinutes(30));
1752
                    if (!hoursCompleted) {
1753
                        body = String.format(
31886 tejbeer 1754
                                "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 1755
                    }
1756
                }
28709 amit.gupta 1757
 
31697 amit.gupta 1758
            }
1759
            if (body != null) {
31886 tejbeer 1760
                Utils.sendMailWithAttachments(googleMailSender, new String[]{authUser.getEmailId()}, new String[]{"kangan.monga@smartdukaan.com"}, "Attendance Alert", body);
31697 amit.gupta 1761
            }
1762
        }
28709 amit.gupta 1763
 
31697 amit.gupta 1764
        this.sendMailToHR();
28709 amit.gupta 1765
 
31697 amit.gupta 1766
    }
28709 amit.gupta 1767
 
31697 amit.gupta 1768
    private void sendMailToHR() throws Exception {
1769
        Map<String, String> map = new HashMap<>();
1770
        String reporticoDate = FormattingUtils.formatReporitcoDate(LocalDateTime.now());
1771
        map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
1772
        map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
31886 tejbeer 1773
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "employeeattendance.xml");
1774
        Attachment attachment = new Attachment("attendance-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr);
1775
        Utils.sendMailWithAttachments(googleMailSender, EMPLOYEE_ATTENDANCE_MAIL_LIST, null, "Attendance - " + FormattingUtils.formatDate(LocalDateTime.now()), "PFA Attendance", attachment);
31697 amit.gupta 1776
    }
28709 amit.gupta 1777
 
31697 amit.gupta 1778
    public void checkPartnerActiveStore() throws Exception {
24697 amit.gupta 1779
 
31697 amit.gupta 1780
        List<FofoStore> fofoStores = fofoStoreRepository.selectByStatus(true);
23929 amit.gupta 1781
 
31697 amit.gupta 1782
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
1783
        if (!fofoStores.isEmpty()) {
1784
            for (FofoStore fofoStore : fofoStores) {
24551 amit.gupta 1785
 
31697 amit.gupta 1786
                if (currentDate.isBefore(fofoStore.getActiveTimeStamp())) {
24542 amit.gupta 1787
 
31697 amit.gupta 1788
                    fofoStore.setActive(true);
1789
                    fofoStoreRepository.persist(fofoStore);
1790
                    LOGGER.info("inserted into InActiveFofoStore successfully");
29160 amit.gupta 1791
 
31697 amit.gupta 1792
                } else {
1793
                    fofoStore.setActive(false);
1794
                    fofoStore.setActiveTimeStamp(null);
1795
                    fofoStoreRepository.persist(fofoStore);
1796
                    LOGGER.info("inserted into InActiveFofoStore successfully");
1797
                }
24542 amit.gupta 1798
 
31697 amit.gupta 1799
            }
1800
        }
24542 amit.gupta 1801
 
31697 amit.gupta 1802
    }
24548 amit.gupta 1803
 
31697 amit.gupta 1804
    public void sendAgeingReport() throws Exception {
33820 ranu 1805
        sendAgeingReport("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com", "niranjan.kala@smartdukaan.com", "kuldeep.kumar@smartdukaan.com");
31697 amit.gupta 1806
    }
24542 amit.gupta 1807
 
31697 amit.gupta 1808
    public void moveImeisToPriceDropImeis() throws Exception {
1809
        List<PriceDrop> priceDrops = priceDropRepository.selectAll();
1810
        for (PriceDrop priceDrop : priceDrops) {
1811
            priceDropService.priceDropStatus(priceDrop.getId());
1812
        }
1813
    }
29160 amit.gupta 1814
 
31697 amit.gupta 1815
    public void walletmismatch() throws Exception {
1816
        LocalDate curDate = LocalDate.now();
1817
        List<PartnerDailyInvestment> pdis = partnerDailyInvestmentRepository.selectAll(curDate.minusDays(2));
1818
        System.out.println(pdis.size());
1819
        for (PartnerDailyInvestment pdi : pdis) {
1820
            int fofoId = pdi.getFofoId();
31886 tejbeer 1821
            for (PartnerDailyInvestment investment : Lists.reverse(partnerDailyInvestmentRepository.selectAll(fofoId, null, null))) {
1822
                float statementAmount = walletService.getOpeningTill(fofoId, investment.getDate().plusDays(1).atTime(LocalTime.of(4, 0)));
31697 amit.gupta 1823
                CustomRetailer retailer = retailerService.getFofoRetailer(fofoId);
31886 tejbeer 1824
                LOGGER.info("{}\t{}\t{}\t{}\t{}", fofoId, retailer.getBusinessName(), retailer.getMobileNumber(), investment.getDate().toString(), investment.getWalletAmount(), statementAmount);
29160 amit.gupta 1825
 
31697 amit.gupta 1826
            }
1827
        }
29160 amit.gupta 1828
 
31697 amit.gupta 1829
    }
29160 amit.gupta 1830
 
31697 amit.gupta 1831
    @Autowired
1832
    StateRepository stateRepository;
29160 amit.gupta 1833
 
31697 amit.gupta 1834
    public void gst() throws Exception {
31886 tejbeer 1835
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.of(2021, 8, 16).atStartOfDay(), LocalDateTime.now());
31697 amit.gupta 1836
        for (FofoOrder fofoOrder : fofoOrders) {
31886 tejbeer 1837
            int retailerAddressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoOrder.getFofoId());
24548 amit.gupta 1838
 
31697 amit.gupta 1839
            Address retailerAddress = addressRepository.selectById(retailerAddressId);
1840
            CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
1841
            Integer stateId = null;
1842
            if (customerAddress.getState().equals(retailerAddress.getState())) {
1843
                try {
1844
                    stateId = stateRepository.selectByName(customerAddress.getState()).getId();
1845
                } catch (Exception e) {
1846
                    LOGGER.error("Cannot found state named {}", customerAddress.getState());
1847
                    continue;
1848
                }
1849
            }
1850
            Map<Integer, GstRate> itemIdStateTaxRateMap = null;
24542 amit.gupta 1851
 
31697 amit.gupta 1852
            List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1853
            List<Integer> itemIds = fofoOrderItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
1854
            if (stateId != null) {
1855
                itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(itemIds, stateId);
1856
            } else {
32145 tejbeer 1857
                itemIdStateTaxRateMap = stateGstRateRepository.getIgstTaxRate(itemIds);
31697 amit.gupta 1858
            }
24580 amit.gupta 1859
 
31697 amit.gupta 1860
            for (FofoOrderItem foi : fofoOrderItems) {
1861
                float sgstRate = foi.getSgstRate();
1862
                float cgstRate = foi.getCgstRate();
1863
                float igstRate = foi.getIgstRate();
32145 tejbeer 1864
                foi.setCgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate());
1865
                foi.setSgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
1866
                foi.setIgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getIgstRate());
24587 amit.gupta 1867
 
32145 tejbeer 1868
                LOGGER.info("Invoice {}, Date {}", fofoOrder.getInvoiceNumber(), fofoOrder.getCreateTimestamp());
1869
                LOGGER.info("customerAddress.getState() {}, retailerAddress.getState() {}", customerAddress.getState(), retailerAddress.getState());
1870
                LOGGER.info("Rates getIgstRate() {}", itemIdStateTaxRateMap.get(foi.getItemId()).getIgstRate());
1871
                LOGGER.info("Rates getCgstRate() {}, getSgstRate() {}", itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate(), itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
24587 amit.gupta 1872
 
1873
 
31697 amit.gupta 1874
            }
1875
        }
26092 amit.gupta 1876
 
31697 amit.gupta 1877
    }
24590 amit.gupta 1878
 
33256 amit.gupta 1879
    public void schemewalletmismatch() throws ProfitMandiBusinessException {
31697 amit.gupta 1880
        LocalDate dateToReconcile = LocalDate.of(2018, 4, 1);
1881
        while (dateToReconcile.isBefore(LocalDate.now())) {
1882
            reconcileSchemes(dateToReconcile);
1883
            // reconcileOrders(dateTime);
1884
            // reconcileRecharges(dateTime);
1885
            dateToReconcile = dateToReconcile.plusDays(1);
1886
        }
1887
    }
24587 amit.gupta 1888
 
33256 amit.gupta 1889
    private void reconcileSchemes(LocalDate date) throws ProfitMandiBusinessException {
31697 amit.gupta 1890
        LocalDateTime startDate = date.atStartOfDay();
1891
        LocalDateTime endDate = startDate.plusDays(1);
1892
        List<SchemeInOut> siosCreated = schemeInOutRepository.selectAllByCreateDate(startDate, endDate);
1893
        List<SchemeInOut> siosRefunded = schemeInOutRepository.selectAllByRefundDate(startDate, endDate);
1894
        double totalSchemeDisbursed = siosCreated.stream().mapToDouble(x -> x.getAmount()).sum();
1895
        double totalSchemeRolledback = siosRefunded.stream().mapToDouble(x -> x.getAmount()).sum();
1896
        double netSchemeDisbursed = totalSchemeDisbursed - totalSchemeRolledback;
31886 tejbeer 1897
        List<WalletReferenceType> walletReferenceTypes = Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT);
1898
        List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByDateType(startDate, endDate, walletReferenceTypes);
31697 amit.gupta 1899
        double schemeAmountWalletTotal = history.stream().mapToDouble(x -> x.getAmount()).sum();
1900
        if (Math.abs(netSchemeDisbursed - schemeAmountWalletTotal) > 10d) {
1901
            LOGGER.info("Scheme Amount mismatched for Date {}", date);
24590 amit.gupta 1902
 
31724 amit.gupta 1903
            Map<Integer, Double> inventoryItemSchemeIO = siosCreated.stream().collect(groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
24635 amit.gupta 1904
 
31886 tejbeer 1905
            Map<Integer, Double> userSchemeMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIO.keySet()).stream().collect(groupingBy(x -> x.getFofoId(), Collectors.summingDouble(x -> inventoryItemSchemeIO.get(x.getId()))));
24635 amit.gupta 1906
 
31724 amit.gupta 1907
            Map<Integer, Double> inventoryItemSchemeIORefunded = siosRefunded.stream().collect(groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
24635 amit.gupta 1908
 
31886 tejbeer 1909
            Map<Integer, Double> userSchemeRefundedMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIORefunded.keySet()).stream().collect(groupingBy(x -> x.getFofoId(), Collectors.summingDouble(x -> inventoryItemSchemeIORefunded.get(x.getId()))));
24635 amit.gupta 1910
 
31697 amit.gupta 1911
            Map<Integer, Double> finalUserSchemeAmountMap = new HashMap<>();
24635 amit.gupta 1912
 
33452 amit.gupta 1913
            for (Entry<Integer, Double> schemeAmount : userSchemeRefundedMap.entrySet()) {
31697 amit.gupta 1914
                if (!finalUserSchemeAmountMap.containsKey(schemeAmount.getKey())) {
1915
                    finalUserSchemeAmountMap.put(schemeAmount.getKey(), schemeAmount.getValue());
1916
                } else {
31886 tejbeer 1917
                    finalUserSchemeAmountMap.put(schemeAmount.getKey(), finalUserSchemeAmountMap.get(schemeAmount.getKey()) + schemeAmount.getValue());
31697 amit.gupta 1918
                }
1919
            }
31886 tejbeer 1920
            Map<Integer, Integer> userWalletMap = userWalletRepository.selectByRetailerIds(finalUserSchemeAmountMap.keySet()).stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24635 amit.gupta 1921
 
31724 amit.gupta 1922
            Map<Integer, Double> walletAmountMap = history.stream().collect(groupingBy(
31697 amit.gupta 1923
                    UserWalletHistory::getWalletId, Collectors.summingDouble((UserWalletHistory::getAmount))));
33452 amit.gupta 1924
            for (Entry<Integer, Double> userAmount : walletAmountMap.entrySet()) {
31697 amit.gupta 1925
                double diff = Math.abs(finalUserSchemeAmountMap.get(userAmount.getKey()) - userAmount.getValue());
1926
                if (diff > 5) {
1927
                    LOGGER.info("Partner scheme mismatched for Userid {}", userWalletMap.get(userAmount.getKey()));
1928
                }
1929
            }
1930
        }
24635 amit.gupta 1931
 
31697 amit.gupta 1932
    }
24635 amit.gupta 1933
 
31697 amit.gupta 1934
    public void dryRunSchemeReco() throws Exception {
31886 tejbeer 1935
        Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24635 amit.gupta 1936
 
31697 amit.gupta 1937
        List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1938
        List<SchemeInOut> rolledbackSios = new ArrayList<>();
31886 tejbeer 1939
        Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream().collect(Collectors.toMap(Scheme::getId, Scheme::getType));
31697 amit.gupta 1940
        Set<String> serialNumbersConsidered = new HashSet<>();
24631 amit.gupta 1941
 
31697 amit.gupta 1942
        LocalDateTime startDate = LocalDate.of(2018, 3, 1).atStartOfDay();
1943
        LocalDateTime endDate = LocalDate.now().atStartOfDay();
1944
        List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
24598 amit.gupta 1945
 
31697 amit.gupta 1946
        Map<Integer, String> storeNameMap = fofoStoreRepository.getStoresMap();
33256 amit.gupta 1947
        for (Purchase purchase : purchases) {
31697 amit.gupta 1948
            float amountToRollback = 0;
31886 tejbeer 1949
            String description = "Adjustment of Duplicate Scheme for Purchase Invoice " + purchase.getPurchaseReference();
1950
            Map<Integer, String> inventorySerialNumberMap = inventoryItemRepository.selectByPurchaseId(purchase.getId()).stream().filter(ii -> ii.getSerialNumber() != null).collect(Collectors.toMap(InventoryItem::getId, InventoryItem::getSerialNumber));
31697 amit.gupta 1951
            if (inventorySerialNumberMap.size() > 0) {
33256 amit.gupta 1952
                for (Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
31697 amit.gupta 1953
                    String serialNumber = inventorySerialNumberEntry.getValue();
1954
                    int inventoryItemId = inventorySerialNumberEntry.getKey();
1955
                    if (serialNumbersConsidered.contains(serialNumber)) {
1956
                        // This will rollback scheme for differenct orders for same serial
31886 tejbeer 1957
                        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 1958
                        Collections.reverse(sios);
1959
                        for (SchemeInOut sio : sios) {
1960
                            sio.setRolledBackTimestamp(LocalDateTime.now());
1961
                            amountToRollback += sio.getAmount();
1962
                            // sio.setSchemeType(SchemeType.OUT);
1963
                            sio.setSerialNumber(serialNumber);
1964
                            rolledbackSios.add(sio);
1965
                        }
1966
                        description = description.concat(" " + serialNumber + " ");
1967
                    } else {
1968
                        serialNumbersConsidered.add(serialNumber);
1969
                        List<Integer> schemesConsidered = new ArrayList<>();
31886 tejbeer 1970
                        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 1971
                        Collections.reverse(sios);
1972
                        for (SchemeInOut sio : sios) {
1973
                            if (!schemesConsidered.contains(sio.getSchemeId())) {
1974
                                schemesConsidered.add(sio.getSchemeId());
1975
                                continue;
1976
                            }
1977
                            sio.setRolledBackTimestamp(LocalDateTime.now());
1978
                            amountToRollback += sio.getAmount();
1979
                            // sio.setSchemeType(SchemeType.OUT);
1980
                            sio.setSerialNumber(serialNumber);
1981
                            sio.setStoreCode(storeNameMap.get(purchase.getFofoId()));
1982
                            sio.setReference(purchase.getId());
1983
                            rolledbackSios.add(sio);
1984
                        }
1985
                    }
24592 amit.gupta 1986
 
31697 amit.gupta 1987
                }
1988
            }
1989
            if (amountToRollback > 0) {
1990
                // Address address =
1991
                // addressRepository.selectAllByRetailerId(purchase.getFofoId(), 0, 10).get(0);
1992
                UserWalletHistory uwh = new UserWalletHistory();
1993
                uwh.setAmount(Math.round(amountToRollback));
1994
                uwh.setDescription(description);
1995
                uwh.setTimestamp(LocalDateTime.now());
1996
                uwh.setReferenceType(WalletReferenceType.SCHEME_IN);
1997
                uwh.setReference(purchase.getId());
1998
                uwh.setWalletId(userWalletMap.get(purchase.getFofoId()));
1999
                uwh.setFofoId(purchase.getFofoId());
2000
                uwh.setStoreCode(storeNameMap.get(purchase.getFofoId()));
2001
                userWalletHistory.add(uwh);
2002
            }
33256 amit.gupta 2003
        }
31697 amit.gupta 2004
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
31886 tejbeer 2005
                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 2006
 
31697 amit.gupta 2007
        ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
31886 tejbeer 2008
                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 2009
 
31886 tejbeer 2010
        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 2011
 
31697 amit.gupta 2012
        throw new Exception();
24615 amit.gupta 2013
 
31697 amit.gupta 2014
    }
24615 amit.gupta 2015
 
31697 amit.gupta 2016
    public void dryRunOutSchemeReco() throws Exception {
2017
        List<UserWalletHistory> userWalletHistory = new ArrayList<>();
2018
        List<SchemeInOut> rolledbackSios = new ArrayList<>();
31886 tejbeer 2019
        Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
2020
        Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream().collect(Collectors.toMap(Scheme::getId, Scheme::getType));
31697 amit.gupta 2021
        LocalDateTime startDate = LocalDate.of(2019, 5, 1).atStartOfDay();
2022
        LocalDateTime endDate = LocalDate.now().atStartOfDay();
2023
        List<FofoOrder> allOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
2024
        // Collections.reverse(allOrders);
2025
        // List<FofoOrder> allOrders =
2026
        // List<FofoOrder> allOrders =
2027
        // Arrays.asList(fofoOrderRepository.selectByInvoiceNumber("UPGZ019/25"));
2028
        Set<String> serialNumbersConsidered = new HashSet<>();
33256 amit.gupta 2029
        for (FofoOrder fofoOrder : allOrders) {
31697 amit.gupta 2030
            String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
2031
            Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
2032
            float amountToRollback = 0;
2033
            List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
2034
            orderItems.forEach(x -> {
31886 tejbeer 2035
                inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null).collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
31697 amit.gupta 2036
            });
2037
            if (inventorySerialNumberMap.size() > 0) {
33256 amit.gupta 2038
                for (Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
31697 amit.gupta 2039
                    String serialNumber = inventorySerialNumberEntry.getValue();
2040
                    int inventoryItemId = inventorySerialNumberEntry.getKey();
2041
                    if (serialNumbersConsidered.contains(serialNumber)) {
2042
                        // This will rollback scheme for differenct orders for same serial
33256 amit.gupta 2043
                        List<SchemeInOut> sios = new ArrayList<>();
2044
                        for (SchemeInOut schemeInOut : schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId)))) {
2045
                            if (schemeInOut.getRolledBackTimestamp() == null && schemeTypeMap.get(schemeInOut.getSchemeId()).equals(SchemeType.OUT)) {
2046
                                sios.add(schemeInOut);
2047
                            }
2048
                        }
31697 amit.gupta 2049
                        Collections.reverse(sios);
2050
                        for (SchemeInOut sio : sios) {
2051
                            sio.setRolledBackTimestamp(LocalDateTime.now());
2052
                            amountToRollback += sio.getAmount();
2053
                            // sio.setSchemeType(SchemeType.OUT);
2054
                            sio.setSerialNumber(serialNumber);
2055
                            sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
2056
                            sio.setReference(fofoOrder.getId());
2057
                            rolledbackSios.add(sio);
2058
                        }
2059
                        description = description.concat(" " + serialNumber + " ");
2060
                    } else {
2061
                        serialNumbersConsidered.add(serialNumber);
2062
                        List<Integer> schemesConsidered = new ArrayList<>();
31886 tejbeer 2063
                        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 2064
                        Collections.reverse(sios);
2065
                        for (SchemeInOut sio : sios) {
2066
                            if (!schemesConsidered.contains(sio.getSchemeId())) {
2067
                                schemesConsidered.add(sio.getSchemeId());
2068
                                continue;
2069
                            }
2070
                            sio.setRolledBackTimestamp(LocalDateTime.now());
2071
                            amountToRollback += sio.getAmount();
2072
                            // sio.setSchemeType(SchemeType.OUT);
2073
                            sio.setReference(fofoOrder.getId());
2074
                            sio.setSerialNumber(serialNumber);
2075
                            sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
2076
                            rolledbackSios.add(sio);
2077
                        }
2078
                    }
24615 amit.gupta 2079
 
31697 amit.gupta 2080
                }
2081
            }
2082
            if (amountToRollback > 0) {
2083
                UserWalletHistory uwh = new UserWalletHistory();
2084
                uwh.setAmount(Math.round(amountToRollback));
2085
                uwh.setDescription(description);
2086
                uwh.setTimestamp(LocalDateTime.now());
2087
                uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
2088
                uwh.setReference(fofoOrder.getId());
2089
                uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
2090
                uwh.setFofoId(fofoOrder.getFofoId());
2091
                uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
2092
                userWalletHistory.add(uwh);
2093
            }
33256 amit.gupta 2094
        }
24615 amit.gupta 2095
 
31697 amit.gupta 2096
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
31886 tejbeer 2097
                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 2098
 
31697 amit.gupta 2099
        ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
31886 tejbeer 2100
                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 2101
 
31886 tejbeer 2102
        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 2103
 
31697 amit.gupta 2104
        throw new Exception();
2105
    }
24615 amit.gupta 2106
 
31697 amit.gupta 2107
    public void dryRunSchemeOutReco1() throws Exception {
2108
        List<Integer> references = Arrays.asList(6744, 7347, 8320, 8891, 9124, 9217, 9263, 9379);
2109
        List<UserWalletHistory> userWalletHistory = new ArrayList<>();
2110
        List<SchemeInOut> rolledbackSios = new ArrayList<>();
31886 tejbeer 2111
        Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
2112
        Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream().collect(Collectors.toMap(Scheme::getId, Scheme::getType));
33256 amit.gupta 2113
        for (Integer reference : references) {
31697 amit.gupta 2114
            FofoOrder fofoOrder = null;
2115
            try {
2116
                fofoOrder = fofoOrderRepository.selectByOrderId(reference);
2117
            } catch (Exception e) {
25927 amit.gupta 2118
 
31697 amit.gupta 2119
            }
2120
            String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
2121
            Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
2122
            float amountToRollback = 0;
2123
            List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
2124
            orderItems.forEach(x -> {
31886 tejbeer 2125
                inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null).collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
31697 amit.gupta 2126
            });
2127
            if (inventorySerialNumberMap.size() > 0) {
31886 tejbeer 2128
                List<SchemeInOut> sios = schemeInOutRepository.selectByInventoryItemIds(inventorySerialNumberMap.keySet()).stream().filter(x -> schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT)).collect(Collectors.toList());
31697 amit.gupta 2129
                LOGGER.info("Found {} duplicate schemeouts for Orderid {}", sios.size(), fofoOrder.getId());
2130
                UserWalletHistory uwh = new UserWalletHistory();
31886 tejbeer 2131
                Map<Integer, List<SchemeInOut>> inventoryIdSouts = sios.stream().collect(groupingBy(SchemeInOut::getInventoryItemId, Collectors.toList()));
33256 amit.gupta 2132
                for (Entry<Integer, List<SchemeInOut>> inventorySioEntry : inventoryIdSouts.entrySet()) {
31697 amit.gupta 2133
                    List<SchemeInOut> outList = inventorySioEntry.getValue();
2134
                    if (outList.size() > 1) {
24683 amit.gupta 2135
 
31697 amit.gupta 2136
                    }
2137
                }
2138
                uwh.setAmount(Math.round(amountToRollback));
2139
                uwh.setDescription(description);
2140
                uwh.setTimestamp(LocalDateTime.now());
2141
                uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
2142
                uwh.setReference(fofoOrder.getId());
2143
                uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
2144
                uwh.setFofoId(fofoOrder.getFofoId());
2145
                uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
2146
                userWalletHistory.add(uwh);
2147
            }
33256 amit.gupta 2148
        }
26945 amit.gupta 2149
 
31697 amit.gupta 2150
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
31886 tejbeer 2151
                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 2152
 
31697 amit.gupta 2153
        ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
31886 tejbeer 2154
                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 2155
 
31886 tejbeer 2156
        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 2157
 
31697 amit.gupta 2158
        throw new Exception();
25880 amit.gupta 2159
 
31697 amit.gupta 2160
    }
30982 tejbeer 2161
 
31697 amit.gupta 2162
    public void sendDailySalesNotificationToPartner(Integer fofoIdInt) throws Exception {
30982 tejbeer 2163
 
31697 amit.gupta 2164
        LocalDateTime now = LocalDateTime.now();
2165
        LocalDateTime from = now.with(LocalTime.MIN);
2166
        String timeString = "Today %s";
2167
        // Send yesterday's report
2168
        /*
2169
         * if (now.getHour() < 13) { timeString = "Yesterday %s"; from =
2170
         * now.minusDays(1).; now = from.with(LocalTime.MAX);
2171
         *
2172
         * }
2173
         */
30982 tejbeer 2174
 
31697 amit.gupta 2175
        List<Integer> fofoIds = null;
31886 tejbeer 2176
        Map<Integer, FofoStore> fofoStoreMap = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getId(), x -> x));
30982 tejbeer 2177
 
24653 govind 2178
 
31697 amit.gupta 2179
        if (fofoIdInt == null) {
2180
            fofoIds = new ArrayList<>(fofoStoreMap.keySet());
2181
        } else {
2182
            fofoIds = Arrays.asList(fofoIdInt);
2183
        }
2184
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
28368 tejbeer 2185
 
31886 tejbeer 2186
        Map<Integer, Float> partnerPolicyAmountMap = insurancePolicyRepository.selectAmountSumGroupByRetailerId(now, null);
31697 amit.gupta 2187
        Map<Integer, Long> partnerPolicyQtyMap = insurancePolicyRepository.selectQtyGroupByRetailerId(now, null);
28368 tejbeer 2188
 
31886 tejbeer 2189
        Map<Integer, Double> spPartnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0, true);
28377 tejbeer 2190
 
31886 tejbeer 2191
        Map<Integer, Double> spPartner3DaysOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from.minusDays(3), now, 0, true);
31697 amit.gupta 2192
        Map<Integer, Long> spPartnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, true);
28368 tejbeer 2193
 
31886 tejbeer 2194
        Map<Integer, Double> partnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0, false);
31697 amit.gupta 2195
        Map<Integer, Long> partnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, false);
28377 tejbeer 2196
 
31697 amit.gupta 2197
        //4 days + current day running
2198
        Map<Integer, Double> partnerBilledValueMap = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(from.minusDays(4), now);
28377 tejbeer 2199
 
31697 amit.gupta 2200
        Map<Integer, SaleTargetReportModel> saleTargetReportModelMap = new HashMap<>();
2201
        for (int fofoId : fofoIds) {
2202
            SaleTargetReportModel model = new SaleTargetReportModel();
2203
            model.setInsuranceSale(
2204
                    partnerPolicyAmountMap.containsKey(fofoId) ? partnerPolicyAmountMap.get(fofoId).doubleValue() : 0);
2205
            model.setInsruanceQty(partnerPolicyQtyMap.containsKey(fofoId) ? partnerPolicyQtyMap.get(fofoId) : 0);
2206
            model.setSecondary(partnerBilledValueMap.containsKey(fofoId) ? partnerBilledValueMap.get(fofoId) : 0);
2207
            model.setSmartphoneSale(spPartnerOrderValMap.containsKey(fofoId) ? spPartnerOrderValMap.get(fofoId) : 0);
2208
            model.setSmartphoneQty(spPartnerOrderQtyMap.containsKey(fofoId) ? spPartnerOrderQtyMap.get(fofoId) : 0);
2209
            model.setTotalSale(partnerOrderValMap.containsKey(fofoId) ? partnerOrderValMap.get(fofoId) : 0);
2210
            model.setTotalQty(partnerOrderQtyMap.containsKey(fofoId) ? partnerOrderQtyMap.get(fofoId) : 0);
2211
            model.setPast3daysSale(
2212
                    spPartner3DaysOrderValMap.containsKey(fofoId) ? spPartner3DaysOrderValMap.get(fofoId) : 0);
2213
            model.setFofoId(fofoId);
2214
            model.setCode(fofoStoreMap.get(fofoId).getCode());
31724 amit.gupta 2215
            model.setActivationType(fofoStoreMap.get(fofoId).getActivationType());
31697 amit.gupta 2216
            saleTargetReportModelMap.put(fofoId, model);
2217
        }
28377 tejbeer 2218
 
31697 amit.gupta 2219
        Map<Integer, FofoReportingModel> partnerSalesHeadersMap = this.getPartnerIdSalesHeaders();
2220
        for (Integer fofoId : fofoIds) {
2221
            SaleTargetReportModel model = saleTargetReportModelMap.get(fofoId);
28368 tejbeer 2222
 
31697 amit.gupta 2223
            // com.spice.profitmandi.dao.entity.user.User user =
2224
            // userUserRepository.selectById(fofoId);
28377 tejbeer 2225
 
31697 amit.gupta 2226
            // Address address = addressRepository.selectById(user.getAddressId());
28377 tejbeer 2227
 
31697 amit.gupta 2228
            String title = "Sale Update";
31886 tejbeer 2229
            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 2230
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
2231
            sendNotificationModel.setCampaignName("Sales update alert");
2232
            sendNotificationModel.setTitle(title);
2233
            sendNotificationModel.setMessage(messageTemplate);
2234
            sendNotificationModel.setType("url");
2235
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
2236
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
2237
            sendNotificationModel.setMessageType(MessageType.notification);
2238
            int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
2239
            sendNotificationModel.setUserIds(Arrays.asList(userId));
2240
            notificationService.sendNotification(sendNotificationModel);
2241
            String whatsappMessageTemplate = String.format(
31886 tejbeer 2242
                    "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 2243
            // notificationService.sendWhatsappMessage(whatsappMessageTemplate, title,
2244
            // address.getPhoneNumber());
28377 tejbeer 2245
 
31697 amit.gupta 2246
        }
2247
        // String saleReport = this.getDailySalesReportHtml(partnerSalesHeadersMap,
2248
        // saleTargetReportModelMap);
2249
        this.getStateWiseSales(saleTargetReportModelMap, partnerSalesHeadersMap);
2250
    }
28377 tejbeer 2251
 
31697 amit.gupta 2252
    public void checkRazorPayPaymentStatus() throws Exception {
31886 tejbeer 2253
        List<PendingOrder> pendingOrder = pendingOrderRepository.selectAllByStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PENDING);
28377 tejbeer 2254
 
31697 amit.gupta 2255
        for (PendingOrder po : pendingOrder) {
2256
            RazorPay razorPay = razorPayRepository.selectByOrdeId(po.getId());
2257
            List<PendingOrderItem> poItems = pendingOrderItemRepository.selectByOrderId(po.getId());
28369 tejbeer 2258
 
31697 amit.gupta 2259
            LOGGER.info("razorPay" + razorPay);
2260
            if (razorPay != null) {
2261
                List<Payment> payments = razorPaymentService.fetchOrderForPayment(razorPay.getRazorOrderId());
28368 tejbeer 2262
 
31697 amit.gupta 2263
                if (!payments.isEmpty()) {
2264
                    List<String> statusList = new ArrayList<>();
2265
                    for (Payment payment : payments) {
25880 amit.gupta 2266
 
31697 amit.gupta 2267
                        JSONObject jsonObj = new JSONObject(payment.toString());
25880 amit.gupta 2268
 
31697 amit.gupta 2269
                        String status = jsonObj.getString("status");
25880 amit.gupta 2270
 
31697 amit.gupta 2271
                        statusList.add(status);
25865 amit.gupta 2272
 
31697 amit.gupta 2273
                    }
2274
                    LOGGER.info("statusList" + statusList);
26941 amit.gupta 2275
 
31697 amit.gupta 2276
                    if (statusList.contains("authorized") || statusList.contains("captured")) {
2277
                        po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
2278
                        po.setPaidAmount(po.getTotalAmount());
2279
                        for (PendingOrderItem poi : poItems) {
2280
                            poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
2281
                        }
2282
                        Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(po);
26941 amit.gupta 2283
 
31697 amit.gupta 2284
                        CustomRetailer customRetailer = retailerService.getFofoRetailer(po.getFofoId());
2285
                        Customer customer = customerRepository.selectById(po.getCustomerId());
2286
                        String[] customerEmail = null;
2287
                        if (customer.getEmailId() != null) {
2288
                            customerEmail = new String[]{customer.getEmailId()};
2289
                        }
31886 tejbeer 2290
                        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 2291
                        List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
2292
                        if (authUserEmails != null) {
2293
                            authUserEmails = new ArrayList<>();
2294
                        }
2295
                        authUserEmails.addAll(bccTo);
26945 amit.gupta 2296
 
31697 amit.gupta 2297
                        // emailService.sendMailWithAttachments("Order Created with SmartDukaan",
2298
                        // "order-confirm.vm",
2299
                        // emailModel, customerEmail, null, authUserEmails.toArray(new String[0]));
26945 amit.gupta 2300
 
31697 amit.gupta 2301
                    } else if (statusList.contains("refunded") || statusList.contains("failed")) {
2302
                        for (PendingOrderItem poi : poItems) {
2303
                            poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
2304
                        }
25865 amit.gupta 2305
 
31697 amit.gupta 2306
                        po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
2307
                    }
25865 amit.gupta 2308
 
31697 amit.gupta 2309
                }
2310
                // LOGGER.info("payment" + payments);
25865 amit.gupta 2311
 
31697 amit.gupta 2312
            }
2313
        }
2314
    }
25865 amit.gupta 2315
 
31697 amit.gupta 2316
    public static class SaleTargetReportModel {
2317
        private double totalSale;
2318
        private long totalQty;
2319
        private double past3daysSale;
2320
        private int fofoId;
2321
        private String code;
31724 amit.gupta 2322
        private ActivationType activationType;
25865 amit.gupta 2323
 
31724 amit.gupta 2324
 
2325
        @Override
2326
        public boolean equals(Object o) {
2327
            if (this == o) return true;
2328
            if (o == null || getClass() != o.getClass()) return false;
2329
            SaleTargetReportModel that = (SaleTargetReportModel) o;
2330
            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;
2331
        }
2332
 
2333
        @Override
2334
        public int hashCode() {
2335
            return Objects.hash(totalSale, totalQty, past3daysSale, fofoId, code, activationType, secondary, smartphoneSale, smartphoneQty, insuranceSale, insruanceQty);
2336
        }
2337
 
2338
        public ActivationType getActivationType() {
2339
            return activationType;
2340
        }
2341
 
2342
        public void setActivationType(ActivationType activationType) {
2343
            this.activationType = activationType;
2344
        }
2345
 
31697 amit.gupta 2346
        public double getSecondary() {
2347
            return secondary;
2348
        }
25865 amit.gupta 2349
 
31697 amit.gupta 2350
        public void setSecondary(double secondary) {
2351
            this.secondary = secondary;
2352
        }
25865 amit.gupta 2353
 
31697 amit.gupta 2354
        private double secondary;
25865 amit.gupta 2355
 
31697 amit.gupta 2356
        public int getFofoId() {
2357
            return fofoId;
2358
        }
25865 amit.gupta 2359
 
31697 amit.gupta 2360
        @Override
2361
        public String toString() {
31886 tejbeer 2362
            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 2363
        }
25865 amit.gupta 2364
 
31697 amit.gupta 2365
        public String getCode() {
2366
            return code;
2367
        }
25865 amit.gupta 2368
 
31697 amit.gupta 2369
        public void setCode(String code) {
2370
            this.code = code;
2371
        }
25865 amit.gupta 2372
 
31697 amit.gupta 2373
        public void setFofoId(int fofoId) {
2374
            this.fofoId = fofoId;
2375
        }
25872 tejbeer 2376
 
31697 amit.gupta 2377
        private double smartphoneSale;
2378
        private long smartphoneQty;
2379
        private double insuranceSale;
2380
        private long insruanceQty;
26945 amit.gupta 2381
 
31697 amit.gupta 2382
        public long getTotalQty() {
2383
            return totalQty;
2384
        }
30765 tejbeer 2385
 
31697 amit.gupta 2386
        public void setTotalQty(long totalQty) {
2387
            this.totalQty = totalQty;
2388
        }
2389
 
2390
        public double getPast3daysSale() {
2391
            return past3daysSale;
2392
        }
2393
 
2394
        public void setPast3daysSale(double past3daysSale) {
2395
            this.past3daysSale = past3daysSale;
2396
        }
2397
 
2398
        public double getTotalSale() {
2399
            return totalSale;
2400
        }
2401
 
2402
        public void setTotalSale(double totalSale) {
2403
            this.totalSale = totalSale;
2404
        }
2405
 
2406
        public double getSmartphoneSale() {
2407
            return smartphoneSale;
2408
        }
2409
 
2410
        public void setSmartphoneSale(double smartphoneSale) {
2411
            this.smartphoneSale = smartphoneSale;
2412
        }
2413
 
2414
        public long getSmartphoneQty() {
2415
            return smartphoneQty;
2416
        }
2417
 
2418
        public void setSmartphoneQty(long smartphoneQty) {
2419
            this.smartphoneQty = smartphoneQty;
2420
        }
2421
 
2422
        public double getInsuranceSale() {
2423
            return insuranceSale;
2424
        }
2425
 
2426
        public void setInsuranceSale(double insuranceSale) {
2427
            this.insuranceSale = insuranceSale;
2428
        }
2429
 
2430
        public long getInsruanceQty() {
2431
            return insruanceQty;
2432
        }
2433
 
2434
        public void setInsruanceQty(long insruanceQty) {
2435
            this.insruanceQty = insruanceQty;
2436
        }
2437
 
2438
    }
2439
 
32482 amit.gupta 2440
    private void getStateWiseSales
2441
            (Map<Integer, SaleTargetReportModel> saleTargetReportModelMap, Map<Integer, FofoReportingModel> partnerSalesHeadersMap) throws
2442
            Exception {
31697 amit.gupta 2443
        String timeString = "Today %s";
2444
        LocalDateTime now = LocalDateTime.now();
2445
 
2446
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
31886 tejbeer 2447
        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 2448
 
2449
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false);
2450
 
31746 amit.gupta 2451
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
2452
            String email = storeGuyEntry.getKey();
2453
            Set<Integer> fofoIds = storeGuyEntry.getValue();
2454
            LOGGER.info("fofoIds {}", fofoIds);
24683 amit.gupta 2455
 
31746 amit.gupta 2456
            if (!fofoIds.isEmpty()) {
31886 tejbeer 2457
                List<FofoStore> stores = fofoStoreRepository.selectActivePartnersByRetailerIds(new ArrayList<>(fofoIds));
26945 amit.gupta 2458
 
31724 amit.gupta 2459
                Map<String, List<Integer>> stateMap = stores.stream().collect(groupingBy(
2460
                        x -> x.getCode().substring(0, 2), mapping(x -> x.getId(), Collectors.toList())));
31697 amit.gupta 2461
                List<List<Serializable>> stateWiseSales = new ArrayList<>();
33452 amit.gupta 2462
                for (Entry<String, List<Integer>> stateMapEntry : stateMap.entrySet()) {
31886 tejbeer 2463
                    long totalQty = stateMapEntry.getValue().stream().collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getTotalQty()));
2464
                    double totalSale = stateMapEntry.getValue().stream().collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getTotalSale()));
2465
                    long smartPhoneQty = stateMapEntry.getValue().stream().collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getSmartphoneQty()));
31697 amit.gupta 2466
                    double smartPhoneSale = stateMapEntry.getValue().stream().collect(
2467
                            Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getSmartphoneSale()));
2468
                    stateWiseSales.add(
2469
                            Arrays.asList(stateMapEntry.getKey(), smartPhoneQty, smartPhoneSale, totalQty, totalSale));
2470
                }
2471
                StringBuilder sb = new StringBuilder();
2472
                sb.append("<html><body>");
2473
                sb.append("<p>Statewise Sale Report:</p><br/><table style=\"border-collapse: collapse;\">");
31886 tejbeer 2474
                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 2475
                for (List<Serializable> stateSale : stateWiseSales) {
2476
                    sb.append("<tr>");
2477
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(0) + "</td>");
2478
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(1) + "</td>");
2479
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(2) + "</td>");
2480
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(3) + "</td>");
2481
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(4) + "</td>");
2482
                    sb.append("</tr>");
2483
                }
2484
                sb.append("</tbody></table><br><br>");
26945 amit.gupta 2485
 
31697 amit.gupta 2486
                sb.append("<p>Partnerwise Report:</p><br/><table style=\"border-collapse: collapse;\">");
31886 tejbeer 2487
                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 2488
 
2489
 
31886 tejbeer 2490
                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 2491
 
31697 amit.gupta 2492
                String subject = String.format("Sale till %s", String.format(timeString, now.format(timeFormatter)));
31169 tejbeer 2493
 
31886 tejbeer 2494
                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 2495
                List<List<?>> rows = new ArrayList<>();
2496
                for (Integer fofoId : sortedSaleTargetReport) {
2497
                    FofoReportingModel fofoReportingModel = partnerSalesHeadersMap.get(fofoId);
31886 tejbeer 2498
                    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 2499
                    ));
31169 tejbeer 2500
 
31724 amit.gupta 2501
                    //Now try to populate html rows
2502
                    if (!saleTargetReportModelMap.get(fofoId).getActivationType().equals(ActivationType.ACTIVE)) {
31697 amit.gupta 2503
                        continue;
2504
                    }
2505
                    if (saleTargetReportModelMap.get(fofoId).getSecondary() == 0) {
2506
                        sb.append("<tr style='background-color:#D21F3C;color:white'>");
2507
                    } else {
2508
                        sb.append("<tr>");
2509
                    }
31886 tejbeer 2510
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getCode() + "</td>");
2511
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getBusinessName() + "</td>");
2512
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getBusinessManager() + "</td>");
2513
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getRegionalManager() + "</td>");
2514
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getTerritoryManager() + "</td>");
2515
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSecondary() + "</td>");
2516
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getTotalSale() + "</td>");
2517
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSmartphoneSale() + "</td>");
2518
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSmartphoneQty() + "</td>");
31697 amit.gupta 2519
                    sb.append("</tr>");
24841 govind 2520
 
25300 tejbeer 2521
 
31697 amit.gupta 2522
                }
2523
                sb.append("</tr>");
2524
                sb.append("</body></html>");
2525
                String statewiseSaleReport = sb.toString();
25300 tejbeer 2526
 
2527
 
31697 amit.gupta 2528
                ByteArrayOutputStream baos = null;
2529
                try {
2530
                    baos = FileUtil.getCSVByteStream(headers, rows);
2531
                } catch (Exception e2) {
2532
                    e2.printStackTrace();
2533
                }
2534
                Attachment attachment = new Attachment("PartnerSalePerformance.csv", new ByteArrayResource(baos.toByteArray()));
2535
                Utils.sendHtmlMailWithAttachments(googleMailSender, new String[]{email}, null, "Statewise " + subject, statewiseSaleReport, attachment);
2536
            }
2537
        }
2538
    }
29668 tejbeer 2539
 
32350 amit.gupta 2540
 
32482 amit.gupta 2541
    private void sendMailOfHtmlFormat(JavaMailSender sender, String[] email, String body, String cc[], String subject) throws
2542
            MessagingException, ProfitMandiBusinessException, IOException {
32350 amit.gupta 2543
        MimeMessage message = sender.createMimeMessage();
31697 amit.gupta 2544
        MimeMessageHelper helper = new MimeMessageHelper(message);
2545
        helper.setSubject(subject);
2546
        helper.setText(body, true);
2547
        helper.setTo(email);
2548
        if (cc != null) {
2549
            helper.setCc(cc);
2550
        }
2551
        InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
2552
        helper.setFrom(senderAddress);
2553
        mailSender.send(message);
2554
    }
25694 amit.gupta 2555
 
31697 amit.gupta 2556
    public void sendNotification() throws Exception {
32610 amit.gupta 2557
        List<PushNotifications> pushNotifications = pushNotificationRepository.selectAllPendingNotifications();
31697 amit.gupta 2558
        if (!pushNotifications.isEmpty()) {
2559
            for (PushNotifications pushNotification : pushNotifications) {
2560
                Device device = deviceRepository.selectById(pushNotification.getDeviceId());
31886 tejbeer 2561
                NotificationCampaign notificationCampaign = notificationCampaignRepository.selectById(pushNotification.getNotificationCampaignid());
2562
                SimpleCampaignParams scp = gson.fromJson(notificationCampaign.getImplementationParams(), SimpleCampaignParams.class);
31697 amit.gupta 2563
                Campaign campaign = new SimpleCampaign(scp);
2564
                String result_url = campaign.getUrl() + "&user_id=" + device.getUser_id();
2565
                JSONObject json = new JSONObject();
2566
                json.put("to", device.getFcmId());
2567
                JSONObject jsonObj = new JSONObject();
2568
                jsonObj.put("message", campaign.getMessage());
2569
                jsonObj.put("title", campaign.getTitle());
2570
                jsonObj.put("type", campaign.getType());
2571
                jsonObj.put("url", result_url);
2572
                jsonObj.put("time_to_live", campaign.getExpireTimestamp());
2573
                jsonObj.put("image", campaign.getImageUrl());
2574
                jsonObj.put("largeIcon", "large_icon");
2575
                jsonObj.put("smallIcon", "small_icon");
2576
                jsonObj.put("vibrate", 1);
2577
                jsonObj.put("pid", pushNotification.getId());
2578
                jsonObj.put("sound", 1);
2579
                jsonObj.put("priority", "high");
2580
                json.put("data", jsonObj);
2581
                try {
2582
                    CloseableHttpClient client = HttpClients.createDefault();
2583
                    HttpPost httpPost = new HttpPost(FCM_URL);
25694 amit.gupta 2584
 
31697 amit.gupta 2585
                    httpPost.setHeader("Content-Type", "application/json; utf-8");
2586
                    httpPost.setHeader("authorization", "key=" + FCM_API_KEY);
2587
                    StringEntity entity = new StringEntity(json.toString());
2588
                    httpPost.setEntity(entity);
2589
                    CloseableHttpResponse response = client.execute(httpPost);
30858 amit.gupta 2590
 
31697 amit.gupta 2591
                    if (response.getStatusLine().getStatusCode() == 200) {
2592
                        pushNotification.setSentTimestamp(LocalDateTime.now());
2593
                    } else {
2594
                        pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
2595
                        LOGGER.info("message" + "not sent");
2596
                        response.toString();
2597
                    }
25694 amit.gupta 2598
 
31697 amit.gupta 2599
                } catch (Exception e) {
2600
                    e.printStackTrace();
2601
                    pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
2602
                    LOGGER.info("message " + "not sent " + e.getMessage());
2603
                }
2604
            }
2605
        }
2606
    }
25721 tejbeer 2607
 
31697 amit.gupta 2608
    public void grouping() throws Exception {
2609
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yyyy hh:mm");
2610
        List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByStatus(PriceDropImeiStatus.APPROVED);
31886 tejbeer 2611
        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 2612
        Map<Integer, CustomRetailer> retailersMap = retailerService.getFofoRetailers(false);
2613
        for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
2614
            if (priceDropIMEI.getPartnerId() == 0)
2615
                continue;
2616
            HashSet<String> imeis = new HashSet<>();
2617
            PriceDrop priceDrop = priceDropRepository.selectById(priceDropIMEI.getPriceDropId());
2618
            imeis.add(priceDropIMEI.getImei());
31886 tejbeer 2619
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(priceDropIMEI.getPartnerId(), imeis, false);
31697 amit.gupta 2620
            if (inventoryItems.size() == 0) {
2621
                LOGGER.info("Need to investigate partnerId - {} imeis - {}", priceDropIMEI.getPartnerId(), imeis);
2622
                continue;
2623
            }
2624
            InventoryItem inventoryItem = inventoryItems.get(0);
2625
            CustomRetailer customRetailer = retailersMap.get(inventoryItem.getFofoId());
31886 tejbeer 2626
            if (inventoryItem.getLastScanType().equals(ScanType.DOA_OUT) || inventoryItem.getLastScanType().equals(ScanType.PURCHASE_RET)) {
31697 amit.gupta 2627
                // check if pricedrop has been rolled out
31886 tejbeer 2628
                List<UserWalletHistory> uwh = walletService.getAllByReference(inventoryItem.getFofoId(), priceDropIMEI.getPriceDropId(), WalletReferenceType.PRICE_DROP);
31697 amit.gupta 2629
                if (uwh.size() > 0) {
2630
                    Item item = itemRepository.selectById(inventoryItem.getItemId());
31886 tejbeer 2631
                    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 2632
                }
2633
            }
2634
        }
2635
    }
25721 tejbeer 2636
 
31697 amit.gupta 2637
    public void toffeeRollback() throws Exception {
2638
        toffeeService.cancelPolicyCopy("110143521986");
2639
        toffeeService.getOrderId("110143521986");
2640
    }
27212 tejbeer 2641
 
31697 amit.gupta 2642
    public void attachToffeeInvoices() throws Exception {
31886 tejbeer 2643
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(3, Optional.of(false));
31697 amit.gupta 2644
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
2645
            String invoiceNumber = insurancePolicy.getInvoiceNumber();
2646
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2647
            InvoicePdfModel pdfModel = orderService.getInvoicePdfModel(fofoOrder.getId());
2648
            java.io.ByteArrayOutputStream byteArrayOutputStream = new java.io.ByteArrayOutputStream();
2649
            PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
31886 tejbeer 2650
            String pdfInvoiceString = "data:application/pdf;base64," + Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());
2651
            boolean attached = toffeeService.attachInvoice(insurancePolicy.getPolicyNumber().split("#")[1], pdfInvoiceString);
31697 amit.gupta 2652
            if (attached) {
2653
                insurancePolicy.setPosted(true);
2654
            }
2655
        }
2656
    }
25721 tejbeer 2657
 
31697 amit.gupta 2658
    public void sendBAGPendingPolicies() throws Exception {
31886 tejbeer 2659
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(4, Optional.of(false));
31697 amit.gupta 2660
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
2661
            String invoiceNumber = insurancePolicy.getInvoiceNumber();
2662
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2663
            FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId()).get(0);
2664
            CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
2665
            Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
2666
            BAGInsuranceModel bagInsuranceModel = new BAGInsuranceModel();
2667
            // bagInsuranceModel.setModelId();
2668
            bagInsuranceModel.setAddressLine1(customerAddress.getLine1());
2669
            bagInsuranceModel.setAddressLine2(customerAddress.getLine2());
2670
            bagInsuranceModel.setCity(customerAddress.getCity());
2671
            bagInsuranceModel.setBrandWarranty("1 Year");
2672
            Item item = itemRepository.selectById(fofoOrderItem.getId());
2673
            bagInsuranceModel.setModelName(item.getItemDescription());
2674
            bagInsuranceModel.setDateOfPurchase(fofoOrder.getFormattedDate());
2675
            bagInsuranceModel.setEmail(customer.getEmailId());
2676
            bagInsuranceModel.setImei1(insurancePolicy.getSerialNumber());
2677
            bagInsuranceModel.setFirstName(customer.getFirstName());
2678
            bagInsuranceModel.setLastName(customer.getLastName());
2679
            bagInsuranceModel.setMobileNumber(customer.getMobileNumber());
2680
            bagInsuranceModel.setPlanId("");
2681
            insurancePolicy.setPosted(true);
2682
        }
2683
    }
25721 tejbeer 2684
 
31697 amit.gupta 2685
    public void schemeRollback(List<String> schemeIds) throws Exception {
2686
        List<Integer> schemeIdsInt = schemeIds.stream().map(x -> Integer.parseInt(x)).collect(Collectors.toList());
31886 tejbeer 2687
        Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIdsInt, 0, schemeIds.size()).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
31697 amit.gupta 2688
        List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectBySchemeIds(new HashSet<>(schemeIdsInt));
2689
        for (SchemeInOut sio : schemeInOuts) {
2690
            Scheme scheme = schemesMap.get(sio.getSchemeId());
2691
            if (scheme.getType().equals(SchemeType.IN)) {
25721 tejbeer 2692
 
31697 amit.gupta 2693
            } else if (scheme.getType().equals(SchemeType.OUT)) {
2694
                InventoryItem inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
2695
                List<ScanRecord> sr = scanRecordRepository.selectByInventoryItemId(sio.getInventoryItemId());
31886 tejbeer 2696
                ScanRecord scanRecord = sr.stream().filter(x -> x.getType().equals(ScanType.SALE)).max((x1, x2) -> x1.getCreateTimestamp().compareTo(x2.getCreateTimestamp())).get();
2697
                if (scanRecord.getCreateTimestamp().isAfter(scheme.getEndDateTime()) || scanRecord.getCreateTimestamp().isBefore(scheme.getStartDateTime())) {
31697 amit.gupta 2698
                    sio.setRolledBackTimestamp(LocalDateTime.now());
2699
                    FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(scanRecord.getOrderId());
31886 tejbeer 2700
                    String rollbackReason = "Scheme reversed for " + itemRepository.selectById(inventoryItem.getItemId()).getItemDescription() + "/Inv - " + fofoOrder.getInvoiceNumber();
2701
                    walletService.rollbackAmountFromWallet(scanRecord.getFofoId(), sio.getAmount(), scanRecord.getOrderId(), WalletReferenceType.SCHEME_OUT, rollbackReason, LocalDateTime.now());
2702
                    System.out.printf("Amount %f,SchemeId %d,Reason %s\n", sio.getAmount(), sio.getSchemeId(), rollbackReason);
31697 amit.gupta 2703
                }
2704
            }
2705
        }
2706
        // throw new Exception();
2707
    }
25721 tejbeer 2708
 
31697 amit.gupta 2709
    public void checkfocusedModelInPartnerStock() throws Exception {
25721 tejbeer 2710
 
31886 tejbeer 2711
        List<Integer> fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
2712
        Map<Integer, Map<Integer, List<SaholicCIS>>> warehouseItemAvailabilityMap = saholicInventoryService.getSaholicStock();
31697 amit.gupta 2713
        Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
2714
        Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = this.getPartnerIdSalesHeaders();
25721 tejbeer 2715
 
31886 tejbeer 2716
        Map<Integer, Map<Integer, List<SaholicPOItem>>> warehousePoItemAvailabilityMap = saholicInventoryService.getSaholicPOItems();
31697 amit.gupta 2717
        Map<Integer, List<FocusedModelShortageModel>> focusedModelShortageReportMap = new HashMap<>();
2718
        for (Integer fofoId : fofoIds) {
2719
            List<FocusedModelShortageModel> focusedModelShortageList = new ArrayList<>();
2720
            focusedModelShortageReportMap.put(fofoId, focusedModelShortageList);
2721
            CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
2722
            Map<Integer, Integer> processingOrderMap = null;
2723
            Map<Integer, Integer> catalogIdAndQtyMap = null;
2724
            Map<Integer, Integer> grnPendingOrdersMap = null;
25721 tejbeer 2725
 
31886 tejbeer 2726
            Map<Integer, Integer> currentInventorySnapshot = currentInventorySnapshotRepository.selectByFofoId(fofoId).stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
25721 tejbeer 2727
 
31697 amit.gupta 2728
            if (!currentInventorySnapshot.isEmpty()) {
31886 tejbeer 2729
                catalogIdAndQtyMap = itemRepository.selectByIds(currentInventorySnapshot.keySet()).stream().collect(groupingBy(x -> x.getCatalogItemId(), Collectors.summingInt(x -> currentInventorySnapshot.get(x.getId()))));
25800 tejbeer 2730
 
31697 amit.gupta 2731
            }
25800 tejbeer 2732
 
31886 tejbeer 2733
            Map<Integer, Integer> grnPendingOrders = orderRepository.selectPendingGrnOrders(fofoId).stream().collect(groupingBy(x -> x.getLineItem().getItemId(), Collectors.summingInt(x -> x.getLineItem().getQuantity())));
31697 amit.gupta 2734
            if (!grnPendingOrders.isEmpty()) {
31886 tejbeer 2735
                grnPendingOrdersMap = itemRepository.selectByIds(grnPendingOrders.keySet()).stream().collect(groupingBy(x -> x.getCatalogItemId(), Collectors.summingInt(x -> grnPendingOrders.get(x.getId()))));
25721 tejbeer 2736
 
31697 amit.gupta 2737
            }
25721 tejbeer 2738
 
31886 tejbeer 2739
            Map<Integer, Integer> processingOrder = orderRepository.selectOrders(fofoId, orderStatusList).stream().collect(groupingBy(x -> x.getLineItem().getItemId(), Collectors.summingInt(x -> x.getLineItem().getQuantity())));
31697 amit.gupta 2740
            if (!processingOrder.isEmpty()) {
31886 tejbeer 2741
                processingOrderMap = itemRepository.selectByIds(processingOrder.keySet()).stream().collect(groupingBy(x -> x.getCatalogItemId(), Collectors.summingInt(x -> processingOrder.get(x.getId()))));
25721 tejbeer 2742
 
31697 amit.gupta 2743
            }
25721 tejbeer 2744
 
31886 tejbeer 2745
            List<String> brands = mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name")).collect(Collectors.toList());
28526 tejbeer 2746
 
31886 tejbeer 2747
            List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId()).collect(Collectors.toList());
31697 amit.gupta 2748
            LOGGER.info("regionIds" + regionIds);
2749
            if (regionIds.size() == 0) {
2750
                LOGGER.info("No region found for partner {}", fofoId);
2751
                continue;
2752
            }
31886 tejbeer 2753
            Map<Integer, Optional<Integer>> focusedCatalogIdAndQtyMap = focusedModelRepository.selectAllByRegionIds(regionIds).stream().collect(groupingBy(FocusedModel::getCatalogId, mapping(FocusedModel::getObsMinimumQty, Collectors.maxBy(Integer::compareTo))));
25721 tejbeer 2754
 
31697 amit.gupta 2755
            LOGGER.info("focusedCatalogIdAndQtyMap" + focusedCatalogIdAndQtyMap);
32060 amit.gupta 2756
 
32048 tejbeer 2757
            Map<String, RetailerBlockBrands> retailerBlockBrands = retailerBlockBrandsRepository.selectAllByRetailer(fofoId).stream().collect(Collectors.toMap(x -> x.getBlockBrands(), x -> x));
31388 amit.gupta 2758
 
32048 tejbeer 2759
 
33452 amit.gupta 2760
            for (Entry<Integer, Optional<Integer>> entry : focusedCatalogIdAndQtyMap.entrySet()) {
31697 amit.gupta 2761
                int minQty = entry.getValue().get();
2762
                int inStockQty = 0;
2763
                int processingQty = 0;
2764
                int grnPendingQty = 0;
2765
                int allColorNetAvailability = 0;
2766
                int allColorPoAvailability = 0;
2767
                if (processingOrderMap != null) {
31886 tejbeer 2768
                    processingQty = (processingOrderMap.get(entry.getKey()) == null) ? 0 : processingOrderMap.get(entry.getKey());
31388 amit.gupta 2769
 
31697 amit.gupta 2770
                }
2771
                if (grnPendingOrdersMap != null) {
31886 tejbeer 2772
                    grnPendingQty = (grnPendingOrdersMap.get(entry.getKey()) == null) ? 0 : grnPendingOrdersMap.get(entry.getKey());
25721 tejbeer 2773
 
31697 amit.gupta 2774
                }
2775
                if (catalogIdAndQtyMap != null) {
31886 tejbeer 2776
                    inStockQty = (catalogIdAndQtyMap.get(entry.getKey()) == null) ? 0 : catalogIdAndQtyMap.get(entry.getKey());
27213 tejbeer 2777
 
31697 amit.gupta 2778
                }
25721 tejbeer 2779
 
31697 amit.gupta 2780
                int grnStockQty = grnPendingQty + inStockQty;
2781
                int totalQty = processingQty + grnPendingQty + inStockQty;
27208 tejbeer 2782
 
31697 amit.gupta 2783
                int shortageQty = minQty - totalQty;
2784
                List<Item> items = itemRepository.selectAllByCatalogItemId(entry.getKey());
28528 tejbeer 2785
 
31697 amit.gupta 2786
                TagListing tagListing = tagListingRepository.selectByCatalogId(entry.getKey());
27208 tejbeer 2787
 
31697 amit.gupta 2788
                FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
25721 tejbeer 2789
 
31886 tejbeer 2790
                Map<Integer, List<SaholicCIS>> itemAvailabilityMap = warehouseItemAvailabilityMap.get(fofoStore.getWarehouseId());
27233 tejbeer 2791
 
31886 tejbeer 2792
                Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = warehousePoItemAvailabilityMap.get(fofoStore.getWarehouseId());
29801 manish 2793
 
31697 amit.gupta 2794
                for (Item item : items) {
2795
                    List<SaholicCIS> currentAvailability = null;
2796
                    List<SaholicPOItem> poItemAvailability = null;
2797
                    if (itemAvailabilityMap != null) {
2798
                        currentAvailability = itemAvailabilityMap.get(item.getId());
2799
                    }
25721 tejbeer 2800
 
31697 amit.gupta 2801
                    if (poItemAvailabilityMap != null) {
2802
                        poItemAvailability = poItemAvailabilityMap.get(item.getId());
2803
                    }
2804
                    if (currentAvailability != null) {
31886 tejbeer 2805
                        allColorNetAvailability += currentAvailability.stream().collect(Collectors.summingInt(SaholicCIS::getNetavailability));
31697 amit.gupta 2806
                    }
25800 tejbeer 2807
 
31697 amit.gupta 2808
                    if (poItemAvailability != null) {
31886 tejbeer 2809
                        allColorPoAvailability += poItemAvailability.stream().collect(Collectors.summingInt(SaholicPOItem::getUnfulfilledQty));
31697 amit.gupta 2810
                    }
25800 tejbeer 2811
 
31697 amit.gupta 2812
                }
33820 ranu 2813
                LOGGER.info("partnerIdSalesHeadersMap {}",partnerIdSalesHeadersMap);
31697 amit.gupta 2814
                FocusedModelShortageModel fm = new FocusedModelShortageModel();
2815
                fm.setFofoId(fofoId);
2816
                fm.setStoreCode(fofoStore.getCode());
2817
                fm.setStoreName(customRetailer.getBusinessName());
2818
                fm.setBrandName(items.get(0).getBrand());
2819
                fm.setModelName(items.get(0).getModelName());
2820
                fm.setModelNumber(items.get(0).getModelNumber());
2821
                fm.setGrnStockQty(grnStockQty);
2822
                fm.setPendingIndentQty(processingQty);
2823
                fm.setShortageQty(shortageQty);
2824
                fm.setPoAvailability(allColorPoAvailability);
2825
                fm.setDp(tagListing.getSellingPrice());
2826
                fm.setWarehouseName(warehouseMap.get(customRetailer.getWarehouseId()));
33820 ranu 2827
                if(partnerIdSalesHeadersMap.get(fofoId) != null){
2828
                    fm.setStateManager(partnerIdSalesHeadersMap.get(fofoId).getRegionalManager());
2829
                    fm.setTerritoryManager(partnerIdSalesHeadersMap.get(fofoId).getTerritoryManager());
2830
                }else {
2831
                    LOGGER.info("fofoId - {}",fofoId);
2832
                    fm.setStateManager("");
2833
                    fm.setTerritoryManager("");
2834
                }
2835
 
31697 amit.gupta 2836
                fm.setItemName(items.get(0).getBrand() + items.get(0).getModelNumber() + items.get(0).getModelName());
2837
                fm.setAvailability(allColorNetAvailability);
25721 tejbeer 2838
 
31697 amit.gupta 2839
                focusedModelShortageList.add(fm);
2840
            }
25721 tejbeer 2841
 
31697 amit.gupta 2842
        }
2843
        if (!focusedModelShortageReportMap.isEmpty()) {
2844
            String fileName = "Stock Alert-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
2845
            Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
2846
            Map<String, List<List<?>>> emailRowsMap = new HashMap<>();
25721 tejbeer 2847
 
31697 amit.gupta 2848
            focusedModelShortageReportMap.entrySet().forEach(x -> {
2849
                storeGuyMap.entrySet().forEach(y -> {
28526 tejbeer 2850
 
31697 amit.gupta 2851
                    if (y.getValue().contains(x.getKey())) {
2852
                        if (!emailRowsMap.containsKey(y.getKey())) {
2853
                            emailRowsMap.put(y.getKey(), new ArrayList<>());
2854
                        }
31886 tejbeer 2855
                        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 2856
                        emailRowsMap.get(y.getKey()).addAll(fms);
29995 tejbeer 2857
 
31697 amit.gupta 2858
                    }
29995 tejbeer 2859
 
31697 amit.gupta 2860
                });
25721 tejbeer 2861
 
31697 amit.gupta 2862
            });
25721 tejbeer 2863
 
31886 tejbeer 2864
            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 2865
            emailRowsMap.entrySet().forEach(entry -> {
25721 tejbeer 2866
 
31697 amit.gupta 2867
                ByteArrayOutputStream baos = null;
2868
                try {
2869
                    baos = FileUtil.getCSVByteStream(headers, entry.getValue());
2870
                } catch (Exception e2) {
2871
                    e2.printStackTrace();
2872
                }
2873
                String[] sendToArray = new String[]{
25721 tejbeer 2874
 
33820 ranu 2875
                        entry.getKey(), "apurve.shrivastava@smartdukaan.com", "puneet.bisht@smartdukaan.com","ranu.rajput@smartdukaan.com"
25721 tejbeer 2876
 
31697 amit.gupta 2877
                };
25721 tejbeer 2878
 
31886 tejbeer 2879
 
31697 amit.gupta 2880
                try {
31886 tejbeer 2881
                    Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Stock Alert", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
31697 amit.gupta 2882
                } catch (Exception e1) { // TODO Auto-generated catch block
2883
                    e1.printStackTrace();
2884
                }
25721 tejbeer 2885
 
31697 amit.gupta 2886
            });
2887
        }
2888
    }
25721 tejbeer 2889
 
31697 amit.gupta 2890
    private String getNotificationMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2891
        StringBuilder sb = new StringBuilder();
2892
        sb.append("Focused Model Shortage in Your Stock : \n");
2893
        for (FocusedModelShortageModel entry : focusedModelShortageModel) {
25721 tejbeer 2894
 
31697 amit.gupta 2895
            sb.append(entry.getItemName() + "-" + entry.getShortageQty());
2896
            sb.append(String.format("%n", ""));
2897
        }
2898
        return sb.toString();
2899
    }
25721 tejbeer 2900
 
31697 amit.gupta 2901
    private void sendMailWithAttachments(String subject, String messageText, String email) throws Exception {
2902
        MimeMessage message = mailSender.createMimeMessage();
2903
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
25721 tejbeer 2904
 
31697 amit.gupta 2905
        helper.setSubject(subject);
2906
        helper.setText(messageText, true);
2907
        helper.setTo(email);
2908
        InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
2909
        helper.setFrom(senderAddress);
2910
        mailSender.send(message);
25721 tejbeer 2911
 
31697 amit.gupta 2912
    }
25721 tejbeer 2913
 
31697 amit.gupta 2914
    private String getMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2915
        StringBuilder sb = new StringBuilder();
31886 tejbeer 2916
        sb.append("<html><body><p>Alert</p><p>Focused Model Shortage in Your Stock:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
2917
        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 2918
        for (FocusedModelShortageModel entry : focusedModelShortageModel) {
25721 tejbeer 2919
 
31697 amit.gupta 2920
            sb.append("<tr>");
2921
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getItemName() + "</td>");
25936 amit.gupta 2922
 
31697 amit.gupta 2923
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getShortageQty() + "</td>");
26790 tejbeer 2924
 
31697 amit.gupta 2925
            sb.append("</tr>");
25927 amit.gupta 2926
 
31697 amit.gupta 2927
        }
26790 tejbeer 2928
 
31697 amit.gupta 2929
        sb.append("</tbody></table></body></html>");
26945 amit.gupta 2930
 
31697 amit.gupta 2931
        return sb.toString();
2932
    }
26945 amit.gupta 2933
 
31697 amit.gupta 2934
    public void notifyLead() throws Exception {
31886 tejbeer 2935
        List<Lead> leadsToNotify = leadRepository.selectLeadsScheduledBetweenDate(null, LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
2936
        Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
31697 amit.gupta 2937
        LOGGER.info("authUserEmailMap {}", authUserEmailMap);
31886 tejbeer 2938
        Map<String, Integer> dtrEmailMap = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
25982 amit.gupta 2939
 
31697 amit.gupta 2940
        LOGGER.info("dtrEmailMap {}", dtrEmailMap);
26283 tejbeer 2941
 
31697 amit.gupta 2942
        Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26283 tejbeer 2943
 
33452 amit.gupta 2944
        for (Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
31697 amit.gupta 2945
            int authId = authUserEmail.getKey();
2946
            String email = authUserEmail.getValue();
2947
            authUserKeyMap.put(authId, dtrEmailMap.get(email));
2948
        }
2949
        LOGGER.info("authUserKeyMap", authUserKeyMap);
2950
        LOGGER.info("leadsToNotify {}", leadsToNotify);
26283 tejbeer 2951
 
31697 amit.gupta 2952
        String templateMessage = "Lead followup for %s %s, %s, %s is due by %s";
2953
        for (Lead lead : leadsToNotify) {
2954
            if (authUserKeyMap.get(lead.getAssignTo()) == null) {
2955
                LOGGER.info("Assignee no longer part of system {}", lead.getAssignTo());
2956
                continue;
2957
            }
2958
            String title = "Leads followup Reminder";
31886 tejbeer 2959
            String notificationMessage = String.format(templateMessage, lead.getFirstName(), lead.getLastName(), lead.getAddress(), lead.getLeadMobile(), leadTimeFormatter.format(lead.getScheduledTimestamp()));
31697 amit.gupta 2960
            String url = "https://app.smartdukaan.com/pages/home/leadUpdate?leadId=" + lead.getId();
2961
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
2962
            sendNotificationModel.setCampaignName("Lead Reminder");
2963
            sendNotificationModel.setTitle(title);
2964
            sendNotificationModel.setMessage(notificationMessage);
2965
            sendNotificationModel.setType("url");
2966
            sendNotificationModel.setUrl(url);
2967
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2968
            sendNotificationModel.setMessageType(MessageType.reminder);
2969
            sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(lead.getAssignTo())));
2970
            System.out.println(sendNotificationModel);
2971
            notificationService.sendNotification(sendNotificationModel);
2972
        }
2973
    }
26790 tejbeer 2974
 
32350 amit.gupta 2975
    @Autowired
2976
    AuthService authService;
2977
 
2978
    public void sendUnscheduledFollowUpMail() throws Exception {
2979
        List<Lead> missedScheduleLeads = leadRepository.selectLeadsScheduledBetweenDate(null, LocalDate.now().atStartOfDay().minusDays(30), LocalDateTime.now().toLocalDate().atStartOfDay());
2980
        List<Lead> leadsScheduledForToday = leadRepository.selectLeadsScheduledBetweenDate(null, LocalDate.now().atStartOfDay(), LocalDate.now().atTime(LocalTime.MAX));
2981
        List<Integer> authIds = missedScheduleLeads.stream().map(x -> x.getAssignTo()).distinct().collect(Collectors.toList());
2982
        LOGGER.info(authIds.size());
2983
        Map<Integer, AuthUser> authUserMap = authRepository.selectAllAuthUserByIds(authIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
2984
        LOGGER.info(authUserMap.size());
2985
        //if(true) return;
2986
 
2987
        missedScheduleLeads = missedScheduleLeads.stream().sorted(Comparator.comparing(Lead::getState, String.CASE_INSENSITIVE_ORDER).thenComparing(Lead::getAssignTo).thenComparing(Lead::getScheduledTimestamp)).collect(Collectors.toList());
2988
        //leadsScheduledForToday
2989
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
2990
        LOGGER.info("Auth Users Size - {}", authUsers.size());
2991
        for (AuthUser authUser : authUsers) {
2992
            LOGGER.info("Auth Name - {}", authUser.getFullName());
2993
            List<Integer> reporteeAuthIds = authService.getAllReportees(authUser.getId());
2994
            reporteeAuthIds.add(authUser.getId());
2995
            StringBuilder sb = new StringBuilder();
2996
            sb.append("<html><body>");
2997
            List<Lead> authMissedScheduledLeads = missedScheduleLeads.stream().filter(x -> reporteeAuthIds.contains(x.getAssignTo())).collect(Collectors.toList());
2998
            LOGGER.info("authMissedScheduledLeads {}", authMissedScheduledLeads.size());
2999
            if (authMissedScheduledLeads.size() > 0) {
3000
                addMissedScheduledLeadsTable(sb, authMissedScheduledLeads, authUserMap);
3001
                sb.append("</body></html>");
3002
 
3003
                String subject = "Lead Updates Summary";
32421 amit.gupta 3004
                String[] email = Arrays.asList(authUser.getEmailId()).toArray(new String[1]);
3005
                //String[] email = Arrays.asList("amit.gupta@smartdukaan.com").toArray(new String[1]);
32350 amit.gupta 3006
                this.sendMailOfHtmlFormat(googleMailSender, email, sb.toString(), null, subject);
32421 amit.gupta 3007
                //break;
32350 amit.gupta 3008
            }
3009
        }
3010
 
3011
    }
3012
 
32482 amit.gupta 3013
    private void addMissedScheduledLeadsTable(StringBuilder
3014
                                                      sb, List<Lead> missedScheduleLeads, Map<Integer, AuthUser> authUserMap) {
32350 amit.gupta 3015
        sb.append("<h3>Leads That Missed the schedule</h3>");
32439 tejbeer 3016
        sb.append("<table style='border:1px solid black' cellspacing='0'>").append("<tr>").append("<th style='border:1px solid black;padding: 5px'>").append("Lead Id").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("Lead Name").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("Mobile No").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("City").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("State").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("Created On").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("Assigned To").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("Scheduled On").append("</th>").append("</tr>");
32350 amit.gupta 3017
        for (Lead lead : missedScheduleLeads) {
32439 tejbeer 3018
            sb.append("<tr style='background-color:").append(lead.getColor()).append("'>").append("<td style='border:1px solid black;padding: 5px'>").append(lead.getId()).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(lead.getFullName()).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(lead.getLeadMobile()).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(lead.getCity()).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(lead.getState()).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(FormattingUtils.formatDate(lead.getCreatedTimestamp())).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(
3019
                    authUserMap.containsKey(lead.getAssignTo()) ? authUserMap.get(lead.getAssignTo()).getFullName() : lead.getAssignTo()).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(FormattingUtils.formatDate(lead.getScheduledTimestamp())).append("</td>").append("</tr>");
32350 amit.gupta 3020
        }
3021
        sb.append("</table>");
3022
    }
3023
 
31697 amit.gupta 3024
    public void notifyVisits() throws Exception {
31886 tejbeer 3025
        List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository.selectVisitsScheduledBetweenDate(LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
3026
        Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
3027
        Map<String, Integer> dtrEmailMap = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
31697 amit.gupta 3028
        Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26790 tejbeer 3029
 
33452 amit.gupta 3030
        for (Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
31697 amit.gupta 3031
            int authId = authUserEmail.getKey();
3032
            String email = authUserEmail.getValue();
3033
            authUserKeyMap.put(authId, dtrEmailMap.get(email));
3034
        }
3035
        String visitTemplate = "Planned visit to franchisee %s is due by %s";
3036
        String followupTemplate = "Lead followup for franchisee %s is due by %s";
3037
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("MMM 7, EEEE h:m a");
3038
        for (FranchiseeVisit visit : franchiseeVisits) {
3039
            if (authUserKeyMap.containsKey(visit.getAuthId())) {
3040
                continue;
3041
            }
3042
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
3043
            String message = null;
3044
            if (visit.getFranchiseActivityId() == 0) {
31886 tejbeer 3045
                message = String.format(visitTemplate, visit.getPartnerName(), timeFormatter.format(visit.getScheduleTimestamp()));
31697 amit.gupta 3046
                sendNotificationModel.setCampaignName("Franchisee visit Reminder");
3047
            } else {
31886 tejbeer 3048
                message = String.format(followupTemplate, visit.getPartnerName(), timeFormatter.format(visit.getScheduleTimestamp()));
31697 amit.gupta 3049
                sendNotificationModel.setCampaignName("Franchisee followup Reminder");
3050
            }
3051
            sendNotificationModel.setMessage(message);
3052
            sendNotificationModel.setType("url");
3053
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
3054
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
3055
            sendNotificationModel.setMessageType(MessageType.reminder);
3056
            sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(visit.getAuthId())));
3057
            // notificationService.sendNotification(sendNotificationModel);
3058
        }
3059
    }
26792 tejbeer 3060
 
31697 amit.gupta 3061
    public void ticketClosed() throws Exception {
26790 tejbeer 3062
 
31697 amit.gupta 3063
        List<Ticket> tickets = ticketRepository.selectAllNotClosedTicketsWithStatus(ActivityType.RESOLVED);
3064
        for (Ticket ticket : tickets) {
3065
            if (ticket.getUpdateTimestamp().toLocalDate().isBefore(LocalDate.now().minusDays(7))) {
3066
                ticket.setCloseTimestamp(LocalDateTime.now());
3067
                ticket.setLastActivity(ActivityType.RESOLVED_ACCEPTED);
3068
                ticket.setUpdateTimestamp(LocalDateTime.now());
3069
                ticketRepository.persist(ticket);
3070
            }
3071
        }
26790 tejbeer 3072
 
31697 amit.gupta 3073
    }
26790 tejbeer 3074
 
31697 amit.gupta 3075
    public void checkValidateReferral() throws Exception {
26790 tejbeer 3076
 
31697 amit.gupta 3077
        List<Refferal> referrals = refferalRepository.selectByStatus(RefferalStatus.pending);
3078
        LOGGER.info("referrals" + referrals);
3079
        if (!referrals.isEmpty()) {
3080
            String subject = "Referral Request";
3081
            String messageText = this.getMessageForReferral(referrals);
26790 tejbeer 3082
 
31697 amit.gupta 3083
            MimeMessage message = mailSender.createMimeMessage();
3084
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
3085
            String[] email = {"kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com"};
3086
            helper.setSubject(subject);
3087
            helper.setText(messageText, true);
3088
            helper.setTo(email);
3089
            InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
3090
            helper.setFrom(senderAddress);
3091
            mailSender.send(message);
26790 tejbeer 3092
 
31697 amit.gupta 3093
        }
3094
    }
26790 tejbeer 3095
 
31697 amit.gupta 3096
    private String getMessageForReferral(List<Refferal> referrals) {
3097
        StringBuilder sb = new StringBuilder();
31886 tejbeer 3098
        sb.append("<html><body><p>Alert</p><p>Pending Referrals:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
3099
        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 3100
        for (Refferal entry : referrals) {
26790 tejbeer 3101
 
31697 amit.gupta 3102
            sb.append("<tr>");
3103
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeName() + "</td>");
30421 tejbeer 3104
 
31697 amit.gupta 3105
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeEmail() + "</td>");
3106
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getFirstName() + "</td>");
3107
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMobile() + "</td>");
3108
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCity() + "</td>");
3109
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getState() + "</td>");
30421 tejbeer 3110
 
31697 amit.gupta 3111
            sb.append("</tr>");
30421 tejbeer 3112
 
31697 amit.gupta 3113
        }
30421 tejbeer 3114
 
31697 amit.gupta 3115
        sb.append("</tbody></table></body></html>");
30421 tejbeer 3116
 
31697 amit.gupta 3117
        return sb.toString();
3118
    }
30421 tejbeer 3119
 
32832 amit.gupta 3120
    private String getMessageForRBMEscalatedPartners(List<PartnerCollectionRemark> pcrs) throws
32482 amit.gupta 3121
            ProfitMandiBusinessException {
31697 amit.gupta 3122
        StringBuilder sb = new StringBuilder();
32832 amit.gupta 3123
        sb.append("<html><body><p>Alert</p><p>Escalated by RBM-L1:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
3124
        sb.append("<tbody>" +
3125
                "<tr>" +
3126
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>" +
3127
                "<th style='border:1px solid black;padding: 5px'>Escalated Since</th>" +
3128
                "<th style='border:1px solid black;padding: 5px'>Message</th>" +
3129
                "</tr>");
30421 tejbeer 3130
 
31697 amit.gupta 3131
        for (PartnerCollectionRemark entry : pcrs) {
30421 tejbeer 3132
 
31697 amit.gupta 3133
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
30421 tejbeer 3134
 
31697 amit.gupta 3135
            sb.append("<tr>");
31886 tejbeer 3136
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
3137
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
32832 amit.gupta 3138
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMessage() + "</td>");
28205 tejbeer 3139
 
31697 amit.gupta 3140
            sb.append("</tr>");
28205 tejbeer 3141
 
31697 amit.gupta 3142
        }
28205 tejbeer 3143
 
31697 amit.gupta 3144
        sb.append("</tbody></table></body></html>");
28205 tejbeer 3145
 
31697 amit.gupta 3146
        return sb.toString();
3147
    }
28208 tejbeer 3148
 
32795 amit.gupta 3149
    private String getMessageForSalesEscalatedPartners(List<PartnerCollectionRemark> pcrs) throws
3150
            ProfitMandiBusinessException {
3151
        StringBuilder sb = new StringBuilder();
3152
        sb.append("<html><body><p>Alert</p><p>Escalated to Sales Team:-</p>" + "<br/>" +
3153
                "<table style='border:1px solid black ;padding: 5px';>");
3154
        sb.append("<tbody>" +
3155
                "<tr>" +
3156
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>" +
3157
                "<th style='border:1px solid black;padding: 5px'>Escalated Since</th>" +
3158
                "<th style='border:1px solid black;padding: 5px'>Message</th>" +
3159
                "</tr>");
3160
        for (PartnerCollectionRemark entry : pcrs) {
3161
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
3162
            sb.append("<tr>");
3163
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
3164
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
3165
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMessage() + "</td>");
3166
            sb.append("</tr>");
3167
        }
3168
 
3169
        sb.append("</tbody></table></body></html>");
3170
 
3171
        return sb.toString();
3172
    }
3173
 
33078 ranu 3174
    private String getMessageForUnauthorizedBuying(List<NonSdBuying> nsb) throws
3175
            ProfitMandiBusinessException {
3176
        StringBuilder sb = new StringBuilder();
3177
        sb.append("<html><body><p>Alert</p><p>Unauthorized Buying-</p>" + "<br/>" +
3178
                "<table style='border:1px solid black ;padding: 5px';>");
3179
        sb.append("<tbody>" +
3180
                "<tr>" +
3181
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>" +
3182
                "<th style='border:1px solid black;padding: 5px'>Brand Name</th>" +
3183
                "<th style='border:1px solid black;padding: 5px'>Brand Value</th>" +
3184
                "<th style='border:1px solid black;padding: 5px'>Created At</th>" +
3185
                "<th style='border:1px solid black;padding: 5px'>Reason</th>" +
3186
                "</tr>");
3187
        for (NonSdBuying entry : nsb) {
3188
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
3189
            List<Integer> brandIds = Collections.singletonList(entry.getBrandId());
3190
            BrandCatalog brandsDisplay = brandsRepository.selectByIds(brandIds).get(0);
3191
            sb.append("<tr>");
3192
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
3193
            sb.append("<td style='border:1px solid black;padding: 5px'>" + brandsDisplay.getName() + "</td>");
3194
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getBrandValue() + "</td>");
3195
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
3196
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getReason() + "</td>");
3197
            sb.append("</tr>");
3198
        }
3199
 
3200
        sb.append("</tbody></table></body></html>");
3201
 
3202
        return sb.toString();
3203
    }
3204
 
31697 amit.gupta 3205
    public void reverseWallet() throws Exception {
3206
        LocalDate localDate = LocalDate.of(2020, 10, 28);
31886 tejbeer 3207
        List<UserWalletHistory> uwhList = userWalletHistoryRepository.selectAllByDateType(localDate.atStartOfDay(), localDate.plusDays(1).atStartOfDay(), Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
31697 amit.gupta 3208
        for (UserWalletHistory uwh : uwhList) {
3209
            if (uwh.getBusinessTimestamp().getMonth().equals(Month.SEPTEMBER)) {
3210
                UserWallet uw = userWalletRepository.selectById(uwh.getWalletId());
3211
                // LOGGER.info("UWH - {}", uwh);
3212
                // amount += uwh.getAmount();
3213
                // System.out.println("Amount is - " + amount);
3214
                // walletService.rollbackAmountFromWallet(uw.getUserId(), uwh.getAmount(),
3215
                // uwh.getReference(), uwh.getReferenceType(), "Margin reversal for error prone
3216
                // run", uwh.getBusinessTimestamp());
3217
                int orderId = uwh.getReference();
3218
                FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
3219
                int inventoryItemId = 0;
3220
                // fofoOrderRepository.delete(fofoOrder);
3221
                List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
3222
                /*
3223
                 * List<PaymentOptionTransaction> paymentOptionTransactions =
3224
                 * paymentOptionTransactionRepository.selectByReferenceIdAndType(fofoOrder.getId
3225
                 * (), PaymentOptionReferenceType.ORDER); for(PaymentOptionTransaction
3226
                 * paymentOptionTransaction : paymentOptionTransactions) {
3227
                 * //paymentOptionTransactionRepository.delete(paymentOptionTransaction); }
3228
                 */
3229
                for (FofoOrderItem foi : fofoOrderItems) {
3230
                    // fofoOrderItemRepository.delete(foi);
3231
                    List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(foi.getId());
3232
                    for (FofoLineItem fli : flis) {
3233
                        // fofoLineItemRepository.delete(fli);
3234
                        inventoryItemId = fli.getInventoryItemId();
3235
                    }
3236
                }
3237
                List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(
33452 amit.gupta 3238
                        Stream.of(inventoryItemId).collect(Collectors.toSet()));
31697 amit.gupta 3239
                for (SchemeInOut sio : schemeInOuts) {
3240
                    if (sio.getCreateTimestamp().toLocalDate().equals(localDate)) {
3241
                        LOGGER.info("SIO - {}", sio);
3242
                        sio.setRolledBackTimestamp(LocalDateTime.now());
3243
                    }
3244
                }
28208 tejbeer 3245
 
31697 amit.gupta 3246
            }
3247
        }
28208 tejbeer 3248
 
31697 amit.gupta 3249
    }
28208 tejbeer 3250
 
31697 amit.gupta 3251
    public void partnerProblemAlert() throws Exception {
3252
        LocalDateTime curDate = LocalDate.now().atStartOfDay();
3253
        Map<Integer, Double> lmtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
3254
                curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1), 0, false);
31886 tejbeer 3255
        Map<Integer, Double> mtdSales = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX), 0, false);
3256
        Map<Integer, PartnerDailyInvestment> pdi = partnerDailyInvestmentRepository.selectAll(LocalDate.now()).stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
28205 tejbeer 3257
 
31697 amit.gupta 3258
        for (Entry<Integer, Double> ls : lmtdSale.entrySet()) {
28208 tejbeer 3259
 
31697 amit.gupta 3260
            double lmtdTwentyPercentSale = ls.getValue() * 0.2;
28208 tejbeer 3261
 
31697 amit.gupta 3262
            LOGGER.info("lmtdTwentyPercentSale" + lmtdTwentyPercentSale);
28208 tejbeer 3263
 
31697 amit.gupta 3264
            double mtdSale = mtdSales.get(ls.getKey()) == null ? 0 : mtdSales.get(ls.getKey());
28205 tejbeer 3265
 
31697 amit.gupta 3266
            LOGGER.info("mtdSale" + mtdSale);
28205 tejbeer 3267
 
31886 tejbeer 3268
            double totalSixtyPercentInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getTotalInvestment() * 0.6;
28205 tejbeer 3269
 
31697 amit.gupta 3270
            LOGGER.info("totalSixtyPercentInvestment" + totalSixtyPercentInvestment);
28205 tejbeer 3271
 
31697 amit.gupta 3272
            double stockInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getInStockAmount();
28205 tejbeer 3273
 
31697 amit.gupta 3274
            LOGGER.info("stockInvestment" + stockInvestment);
28205 tejbeer 3275
 
31697 amit.gupta 3276
            boolean Investmentvalue = partnerInvestmentService.isInvestmentBelow(ls.getKey(), 25);
28205 tejbeer 3277
 
31697 amit.gupta 3278
            PartnerProblem partnerProblem = partnerProblemRepository.selectByFofoId(ls.getKey());
28205 tejbeer 3279
 
31697 amit.gupta 3280
            if (partnerProblem == null) {
3281
                partnerProblem = new PartnerProblem();
3282
                partnerProblem.setFofoId(ls.getKey());
3283
                if (mtdSale < lmtdTwentyPercentSale) {
3284
                    partnerProblem.setMtd(1);
3285
                }
3286
                if (Investmentvalue) {
3287
                    partnerProblem.setInvestment(1);
3288
                }
28205 tejbeer 3289
 
31697 amit.gupta 3290
                if (stockInvestment < totalSixtyPercentInvestment) {
3291
                    partnerProblem.setInvestment(1);
3292
                }
28205 tejbeer 3293
 
31697 amit.gupta 3294
                partnerProblemRepository.persist(partnerProblem);
3295
            } else {
3296
                if (mtdSale < lmtdTwentyPercentSale) {
3297
                    partnerProblem.setMtd(partnerProblem.getMtd() + 1);
28213 tejbeer 3298
 
31697 amit.gupta 3299
                } else {
3300
                    partnerProblem.setMtd(0);
28227 tejbeer 3301
 
31697 amit.gupta 3302
                }
3303
                if (Investmentvalue) {
3304
                    partnerProblem.setInvestment(partnerProblem.getInvestment() + 1);
3305
                } else {
3306
                    partnerProblem.setInvestment(0);
28227 tejbeer 3307
 
31697 amit.gupta 3308
                }
3309
                if (stockInvestment < totalSixtyPercentInvestment) {
3310
                    partnerProblem.setStockInvestment(partnerProblem.getStockInvestment() + 1);
3311
                } else {
3312
                    partnerProblem.setStockInvestment(0);
3313
                }
28213 tejbeer 3314
 
31697 amit.gupta 3315
            }
28213 tejbeer 3316
 
31697 amit.gupta 3317
        }
28213 tejbeer 3318
 
31886 tejbeer 3319
        List<PartnerProblem> partnerProblems = partnerProblemRepository.selectAll().stream().filter(x -> x.getMtd() + x.getInvestment() + x.getStockInvestment() > 0).collect(Collectors.toList());
28205 tejbeer 3320
 
31697 amit.gupta 3321
        partnerProblems = partnerProblems.stream().sorted((x1, x2) -> {
31886 tejbeer 3322
            return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment() + x2.getStockInvestment() ? 1 : -1;
31697 amit.gupta 3323
        }).collect(Collectors.toList());
28205 tejbeer 3324
 
31697 amit.gupta 3325
        Map<Integer, PartnerProblem> partnerProblemMap = partnerProblems.stream().sorted((x1, x2) -> {
31886 tejbeer 3326
            return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment() + x2.getStockInvestment() ? 1 : -1;
31697 amit.gupta 3327
        }).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
28205 tejbeer 3328
 
31697 amit.gupta 3329
        Map<Integer, CustomRetailer> customRetailers = retailerService.getAllFofoRetailers();
28205 tejbeer 3330
 
31697 amit.gupta 3331
        List<Integer> assignTo = Arrays.asList(15, 9, 54, 53);
28205 tejbeer 3332
 
31886 tejbeer 3333
        Map<Integer, AuthUser> assignAuthUserMap = authRepository.selectAllAuthUserByIds(assignTo).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
28222 tejbeer 3334
 
31886 tejbeer 3335
        List<String> sendTo = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com", "sm@smartdukaan.com");
31697 amit.gupta 3336
        LOGGER.info("partnerProblem" + partnerProblems);
3337
        StringBuilder sb = new StringBuilder();
3338
        sb.append("<htl><body>");
3339
        sb.append(
3340
                "<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 3341
        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 3342
 
31697 amit.gupta 3343
                + "	    				</tr>");
28218 tejbeer 3344
 
31697 amit.gupta 3345
        for (PartnerProblem pp : partnerProblems) {
3346
            int value = pp.getFofoId() % 4;
28218 tejbeer 3347
 
31697 amit.gupta 3348
            Map<EscalationType, AuthUser> authUserMap = csService.getAuthUserAndEsclationByPartnerId(pp.getFofoId());
3349
            LOGGER.info("authUserMap" + authUserMap);
3350
            sb.append("<tr>");
31886 tejbeer 3351
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
3352
            sb.append("<td style='border:1px solid black;padding: 5px'>" + assignAuthUserMap.get(assignTo.get(value)).getName() + "</td>");
31697 amit.gupta 3353
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
3354
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
3355
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
31886 tejbeer 3356
            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 3357
 
31697 amit.gupta 3358
            sb.append("</tr>");
3359
        }
3360
        sb.append("</tbody></table><br><br>");
3361
        String subject = "Partner Problem Alert!";
3362
        String[] email = sendTo.toArray(new String[sendTo.size()]);
28227 tejbeer 3363
 
32350 amit.gupta 3364
        this.sendMailOfHtmlFormat(googleMailSender, email, sb.toString(), null, subject);
28227 tejbeer 3365
 
31697 amit.gupta 3366
        Map<Integer, List<Integer>> authUserPartnerMapping = csService.getAuthUserIdPartnerIdMapping();
28224 tejbeer 3367
 
31697 amit.gupta 3368
        for (Entry<Integer, List<Integer>> authUserPartner : authUserPartnerMapping.entrySet()) {
3369
            AuthUser authUser = authRepository.selectById(authUserPartner.getKey());
3370
            for (Integer patnerId : authUserPartner.getValue()) {
3371
                if (partnerProblemMap.get(patnerId) != null) {
28230 tejbeer 3372
 
31697 amit.gupta 3373
                    StringBuilder sbbuilder = new StringBuilder();
3374
                    sbbuilder.append("<hml><body>");
3375
                    sb.append(
3376
                            "<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 3377
                    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 3378
 
31697 amit.gupta 3379
                            + "	    				</tr>");
28205 tejbeer 3380
 
31697 amit.gupta 3381
                    for (Integer partnerId : authUserPartner.getValue()) {
3382
                        if (partnerProblemMap.get(partnerId) != null) {
3383
                            PartnerProblem pp = partnerProblemMap.get(partnerId);
3384
                            sbbuilder.append("<tr>");
31886 tejbeer 3385
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
3386
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
31697 amit.gupta 3387
                            sbbuilder.append(
3388
                                    "<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
31886 tejbeer 3389
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
28790 amit.gupta 3390
 
31697 amit.gupta 3391
                            sbbuilder.append("</tr>");
3392
                        }
28790 amit.gupta 3393
 
31697 amit.gupta 3394
                    }
3395
                    sbbuilder.append("</tbody></table><br><br>");
29488 manish 3396
 
32350 amit.gupta 3397
                    this.sendMailOfHtmlFormat(googleMailSender, new String[]{authUser.getEmailId()}, sbbuilder.toString(), null, subject);
31697 amit.gupta 3398
                }
29488 manish 3399
 
31697 amit.gupta 3400
            }
3401
        }
3402
    }
28775 amit.gupta 3403
 
31697 amit.gupta 3404
    @Autowired
3405
    WarehouseRepository warehouseRepository;
29488 manish 3406
 
33256 amit.gupta 3407
    public void getVendorWarehouses(int warehouseId) throws ProfitMandiBusinessException {
31697 amit.gupta 3408
        LOGGER.info("Warehouses - {}", warehouseRepository.getVendorWarehouses().get(warehouseId));
29488 manish 3409
 
31697 amit.gupta 3410
    }
29488 manish 3411
 
31697 amit.gupta 3412
    public void checkImeiActivation() {
29801 manish 3413
 
31697 amit.gupta 3414
        try {
3415
            vivoImeiActivationService.checkImeiActivation();
3416
        } catch (ProfitMandiBusinessException e) {
3417
            // TODO Auto-generated catch block
3418
            e.printStackTrace();
3419
        } catch (IOException e) {
3420
            // TODO Auto-generated catch block
3421
            e.printStackTrace();
3422
        } catch (Exception e) {
3423
            // TODO Auto-generated catch block
3424
            e.printStackTrace();
3425
        }
29807 manish 3426
 
31697 amit.gupta 3427
    }
29801 manish 3428
 
31697 amit.gupta 3429
    public void checkItelImeiActivation(LocalDate date, Integer day) {
3430
        LOGGER.info("Hello - {}", "hhh");
29488 manish 3431
 
31697 amit.gupta 3432
        try {
3433
            itelImeiActivationService.checkItelImeiActivation(date, day);
3434
        } catch (ProfitMandiBusinessException e) {
3435
            // TODO Auto-generated catch block
3436
            e.printStackTrace();
3437
        } catch (IOException e) {
3438
            // TODO Auto-generated catch block
3439
            e.printStackTrace();
3440
        } catch (Exception e) {
3441
            // TODO Auto-generated catch block
3442
            e.printStackTrace();
3443
        }
29488 manish 3444
 
31697 amit.gupta 3445
    }
29488 manish 3446
 
32482 amit.gupta 3447
    public void selectFinServiceFollowUpDateByCurrDate(LocalDate currentDate) throws
3448
            MessagingException, ProfitMandiBusinessException, IOException {
31697 amit.gupta 3449
        LOGGER.info("selectfinServiceFollow - {}", "selectfinServiceFollowUpDateByCurrDate");
29308 tejbeer 3450
 
31697 amit.gupta 3451
        serviceConfigService.selectFinServicePartnerfollowUpDateByCurrentDate(currentDate);
29252 amit.gupta 3452
 
31697 amit.gupta 3453
    }
29451 manish 3454
 
31697 amit.gupta 3455
    public void checkTecnoImeiActivation(LocalDate date, Integer day) {
3456
        LOGGER.info("Hello - {}", "hhh");
29308 tejbeer 3457
 
31697 amit.gupta 3458
        try {
3459
            tecnoImeiActivation.checkTecnoImeiActivation(date, day);
3460
        } catch (ProfitMandiBusinessException e) {
3461
            // TODO Auto-generated catch block
3462
            e.printStackTrace();
3463
        } catch (IOException e) {
3464
            // TODO Auto-generated catch block
3465
            e.printStackTrace();
3466
        } catch (Exception e) {
3467
            // TODO Auto-generated catch block
3468
            e.printStackTrace();
3469
        }
29308 tejbeer 3470
 
31697 amit.gupta 3471
    }
29441 tejbeer 3472
 
31697 amit.gupta 3473
    public void checkCancellationMargin() throws Exception {
3474
        LocalDateTime startDate = LocalDate.of(2021, 4, 1).atStartOfDay();
3475
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectCancelledBetweenSaleDate(startDate, LocalDateTime.now());
3476
        LOGGER.info("Total Orders =  {}", fofoOrders.size());
3477
        for (FofoOrder fofoOrder : fofoOrders) {
31886 tejbeer 3478
            List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.SCHEME_OUT);
3479
            history.addAll(userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.ACTIVATION_SCHEME));
31697 amit.gupta 3480
            int walletSum = history.stream().mapToInt(x -> x.getAmount()).sum();
3481
            if (Math.abs(walletSum) > 1) {
3482
                // LOGGER.info("Cancelled invoice {}, Order Id = {}, = havent rolledback, Value
3483
                // = {}", fofoOrder.getInvoiceNumber(), fofoOrder.getId(), walletSum);
3484
                List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
3485
                List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(fofoOrderItems.get(0).getId());
3486
                FofoLineItem fli = flis.get(0);
3487
                if (StringUtils.isEmpty(fli.getSerialNumber()))
3488
                    continue;
31886 tejbeer 3489
                List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(fli.getInventoryItemId())));
31697 amit.gupta 3490
                InventoryItem inventoryItem = inventoryItemRepository.selectById(fli.getInventoryItemId());
31886 tejbeer 3491
                double schemeSum = schemeInOuts.stream().filter(x -> x.getRolledBackTimestamp() == null).mapToDouble(x -> x.getAmount()).sum();
31697 amit.gupta 3492
                /*
3493
                 * if(inventoryItem.getGoodQuantity()==1) {
3494
                 * LOGGER.info("GoodQty, Serial Number {}, InventoryItem = {}, Billed on {}",
3495
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3496
                 * inventoryItem.getUpdateTimestamp()); } else
3497
                 * if(inventoryItem.getBadQuantity()==1){
3498
                 * LOGGER.info("Bad Qty, Serial Number {}, InventoryItem = {}, Billed on {}",
3499
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3500
                 * inventoryItem.getUpdateTimestamp()); } else if
3501
                 * (inventoryItem.getLastScanType().equals(ScanType.SALE)) { LOGGER.
3502
                 * info("Problem Sold, Serial Number {}, InventoryItem = {}, Billed on {}",
3503
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3504
                 * inventoryItem.getUpdateTimestamp()); }
3505
                 */
31886 tejbeer 3506
                if (inventoryItem.getLastScanType().equals(ScanType.SALE) || inventoryItem.getLastScanType().equals(ScanType.SALE_RET)) {
3507
                    Map<String, Double> map = schemeInOuts.stream().collect(
3508
                            groupingBy(
3509
                                    x -> DateTimeFormatter.ofPattern("yyyyMMddHH").format(x.getCreateTimestamp()) + "- " + x.getSchemeId(), Collectors.summingDouble(x -> x.getAmount())));
33452 amit.gupta 3510
                    for (Entry<String, Double> entry : map.entrySet()) {
31697 amit.gupta 3511
                        LOGGER.info("{} = {}", entry.getKey(), entry.getValue());
3512
                    }
31886 tejbeer 3513
                    LOGGER.info("id- {}, imei- {}, lastScan = {}, Scheme sum - {}", inventoryItem.getId(), inventoryItem.getSerialNumber(), inventoryItem.getLastScanType(), schemeSum);
31697 amit.gupta 3514
                }
3515
            }
3516
        }
29441 tejbeer 3517
 
31697 amit.gupta 3518
    }
29308 tejbeer 3519
 
31697 amit.gupta 3520
    public static String readFileAsString(String file) throws Exception {
3521
        String data = "";
3522
        data = new String(Files.readAllBytes(Paths.get(file)));
3523
        return data;
3524
    }
29308 tejbeer 3525
 
31697 amit.gupta 3526
    @Autowired
3527
    private PartnerCollectionRemarkRepository partnerCollectionRemarkRepository;
30421 tejbeer 3528
 
32832 amit.gupta 3529
    //RBM L2 Escalations
32482 amit.gupta 3530
    public void reviewUncontactablePartner() throws
3531
            ProfitMandiBusinessException, MessagingException, UnsupportedEncodingException {
30421 tejbeer 3532
 
31697 amit.gupta 3533
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
30421 tejbeer 3534
 
32832 amit.gupta 3535
        List<Integer> partnerLastCollectionRemarkIds = partnerCollectionRemarkRepository.selectMaxRemarkId(new ArrayList<>(customRetailerMap.keySet()));
30859 tejbeer 3536
 
32832 amit.gupta 3537
        if (!partnerLastCollectionRemarkIds.isEmpty()) {
3538
            List<PartnerCollectionRemark> partnerCollectionRemarks = partnerCollectionRemarkRepository.selectByIds(partnerLastCollectionRemarkIds);
30421 tejbeer 3539
 
33064 ranu 3540
            Map<Integer, PartnerCollectionRemark> rbmEscalatedRemarksMap = partnerCollectionRemarks.stream().filter(x -> x.getRemark().equals(CollectionRemark.RBM_L2_ESCALATION)).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
32832 amit.gupta 3541
            Map<Integer, PartnerCollectionRemark> salesEscalatedRemarksMap = partnerCollectionRemarks.stream().filter(x -> x.getRemark().equals(CollectionRemark.SALES_ESCALATION)).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
30859 tejbeer 3542
 
32832 amit.gupta 3543
 
3544
            if (!rbmEscalatedRemarksMap.isEmpty()) {
3545
                //
33452 amit.gupta 3546
                for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_RBM), true).entrySet()) {
32832 amit.gupta 3547
                    List<PartnerCollectionRemark> filteredRows = storeGuyEntry.getValue().stream()
3548
                            .map(x -> rbmEscalatedRemarksMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
3549
                    String subject = "Partners escalated to RBM-L2";
3550
                    String messageText = this.getMessageForRBMEscalatedPartners(filteredRows);
3551
 
31697 amit.gupta 3552
                    MimeMessage message = mailSender.createMimeMessage();
3553
                    MimeMessageHelper helper = new MimeMessageHelper(message, true);
3554
                    String[] email = new String[]{storeGuyEntry.getKey()};
30859 tejbeer 3555
 
31697 amit.gupta 3556
                    helper.setSubject(subject);
3557
                    helper.setText(messageText, true);
3558
                    helper.setTo(email);
31886 tejbeer 3559
                    InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
31697 amit.gupta 3560
                    helper.setFrom(senderAddress);
3561
                    mailSender.send(message);
30859 tejbeer 3562
 
31697 amit.gupta 3563
                    LOGGER.info("filteredRows {}", filteredRows);
30859 tejbeer 3564
 
31697 amit.gupta 3565
                }
3566
            }
32832 amit.gupta 3567
            if (!salesEscalatedRemarksMap.isEmpty()) {
3568
                //
33452 amit.gupta 3569
                for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_RBM), true).entrySet()) {
32832 amit.gupta 3570
                    List<PartnerCollectionRemark> filteredRows = storeGuyEntry.getValue().stream()
3571
                            .map(x -> salesEscalatedRemarksMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
3572
                    String subject = "Partners escalated to Sales";
3573
                    String messageText = this.getMessageForSalesEscalatedPartners(filteredRows);
30936 tejbeer 3574
 
32832 amit.gupta 3575
                    MimeMessage message = mailSender.createMimeMessage();
3576
                    MimeMessageHelper helper = new MimeMessageHelper(message, true);
3577
                    String[] email = new String[]{storeGuyEntry.getKey()};
3578
 
3579
                    helper.setSubject(subject);
3580
                    helper.setText(messageText, true);
3581
                    helper.setTo(email);
3582
                    InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
3583
                    helper.setFrom(senderAddress);
3584
                    mailSender.send(message);
3585
 
3586
                    LOGGER.info("filteredRows {}", filteredRows);
3587
 
3588
                }
3589
            }
3590
 
31697 amit.gupta 3591
        }
3592
    }
30936 tejbeer 3593
 
33078 ranu 3594
 
31697 amit.gupta 3595
    @Autowired
33078 ranu 3596
    private NonSdBuyingRepository nonSdBuyingRepository;
3597
 
3598
    //Non Sd Buying
3599
    public void reviewNonSdBuyingBrand() throws
3600
            ProfitMandiBusinessException, MessagingException, UnsupportedEncodingException {
3601
        List<NonSdBuying> nonSdByuingActiveList = nonSdBuyingRepository.selectAllActiveNonSDBuyingList(true);
3602
        Map<Integer, NonSdBuying> unAuthorizedBuyingMap = nonSdByuingActiveList.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
3603
 
3604
        if (!unAuthorizedBuyingMap.isEmpty()) {
33452 amit.gupta 3605
            for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_SALES), true).entrySet()) {
33078 ranu 3606
                List<NonSdBuying> unAuthorizedfilteredRows = storeGuyEntry.getValue().stream()
3607
                        .map(x -> unAuthorizedBuyingMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
33112 amit.gupta 3608
                if (!unAuthorizedfilteredRows.isEmpty()) {
33078 ranu 3609
                    String subject = "Unauthorized Buying";
3610
                    String messageText = this.getMessageForUnauthorizedBuying(unAuthorizedfilteredRows);
3611
 
3612
                    MimeMessage message = mailSender.createMimeMessage();
3613
                    MimeMessageHelper helper = new MimeMessageHelper(message, true);
3614
                    String[] email = new String[]{storeGuyEntry.getKey()};
3615
 
3616
                    helper.setSubject(subject);
3617
                    helper.setText(messageText, true);
3618
                    helper.setTo(email);
3619
                    InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
3620
                    helper.setFrom(senderAddress);
3621
                    mailSender.send(message);
3622
                    LOGGER.info("unAuthorizedfilteredRows {}", unAuthorizedfilteredRows);
3623
                }
3624
 
3625
 
3626
            }
3627
 
3628
        }
3629
    }
3630
 
3631
    @Autowired
31697 amit.gupta 3632
    private LoanRepository loanRepository;
31020 tejbeer 3633
 
31697 amit.gupta 3634
    @Autowired
3635
    private LoanStatementRepository loanStatementRepository;
30859 tejbeer 3636
 
31697 amit.gupta 3637
    @Autowired
3638
    private SDCreditService sdCreditService;
30859 tejbeer 3639
 
31697 amit.gupta 3640
    @Autowired
3641
    private SDCreditRequirementRepository sdCreditRequirementRepository;
30859 tejbeer 3642
 
31697 amit.gupta 3643
    @Autowired
3644
    private CurrentPartnerDailyInvestmentRepository currentPartnerDailyInvestmentRepository;
30859 tejbeer 3645
 
31697 amit.gupta 3646
    @Autowired
3647
    private TransactionRepository transactionRepository;
30859 tejbeer 3648
 
31697 amit.gupta 3649
    @Autowired
3650
    private SanctionRequestRepository sanctionRequestRepository;
30859 tejbeer 3651
 
31697 amit.gupta 3652
    public void calculateInterestAccured() throws ProfitMandiBusinessException {
3653
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30859 tejbeer 3654
 
32724 amit.gupta 3655
        for (Loan loan : loans) {
3656
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
3657
            Map<LoanReferenceType, Double> loanStatusAmount = loanStatements.stream().collect(groupingBy(
3658
                    x -> x.getLoanReferenceType(), Collectors.summingDouble(x -> x.getAmount().doubleValue())));
30936 tejbeer 3659
 
32724 amit.gupta 3660
            int freeDays = loan.getFreeDays();
30936 tejbeer 3661
 
32724 amit.gupta 3662
            LocalDateTime freeDaysLimitDate = loan.getCreatedOn().plusDays(freeDays);
30936 tejbeer 3663
 
32724 amit.gupta 3664
            LOGGER.info("freeDaysLimitDate {}", freeDaysLimitDate);
3665
            if (LocalDateTime.now().isAfter(freeDaysLimitDate)) {
3666
                int loanStatementId = loanStatementRepository.selectLatestLoanSatement(loan.getFofoId(), loan.getId());
3667
                LOGGER.info("loanStatementId {}", loanStatementId);
3668
                if (loanStatementId != 0) {
3669
                    this.calculateInterest(loan, loanStatusAmount, loanStatementId);
31697 amit.gupta 3670
                } else {
32724 amit.gupta 3671
                    sdCreditService.addInterest(freeDaysLimitDate.toLocalDate(), LocalDate.now(), loan, loanStatusAmount);
31697 amit.gupta 3672
                }
32724 amit.gupta 3673
            }
31518 amit.gupta 3674
 
31697 amit.gupta 3675
        }
30936 tejbeer 3676
 
32724 amit.gupta 3677
 
31697 amit.gupta 3678
    }
30936 tejbeer 3679
 
31697 amit.gupta 3680
    @Autowired
3681
    FofoPaymentRepository fofoPaymentRepository;
30936 tejbeer 3682
 
31697 amit.gupta 3683
    @Autowired
3684
    CCAvenuePaymentService ccAvenuePaymentService;
30936 tejbeer 3685
 
31697 amit.gupta 3686
    public void settleCCAvePayments() throws Exception {
31886 tejbeer 3687
        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 3688
        for (FofoPayment fofoPayment : fofoPayments) {
3689
            ccAvenuePaymentService.updatePayment(fofoPayment);
3690
        }
3691
    }
30859 tejbeer 3692
 
31697 amit.gupta 3693
    /*
3694
     * public void getCCAvenuePendingOrderStatus(int pendingOrderId) { PendingOrder
3695
     * pendingOrder = pendingOrderRepository.selectById(pendingOrderId);
3696
     * ccAvenuePaymentService.getPaymentStatusMap(pendingOrder); }
3697
     */
30859 tejbeer 3698
 
32482 amit.gupta 3699
    private void calculateInterest(Loan loan, Map<LoanReferenceType, Double> loanStatusAmount,
3700
                                   int loanStatementId) throws ProfitMandiBusinessException {
31697 amit.gupta 3701
        LoanStatement loanStatement = loanStatementRepository.selectById(loanStatementId);
30859 tejbeer 3702
 
31697 amit.gupta 3703
        if (loanStatement.getLoanId() == loan.getId()) {
30859 tejbeer 3704
 
31886 tejbeer 3705
            sdCreditService.addInterest(loanStatement.getCreatedAt().toLocalDate(), LocalDate.now(), loan, loanStatusAmount);
30859 tejbeer 3706
 
31697 amit.gupta 3707
        } else {
3708
            throw new ProfitMandiBusinessException("loanstament", loanStatement.getLoanId(), "Invalid LoanId");
3709
        }
3710
    }
31175 tejbeer 3711
 
31697 amit.gupta 3712
    public void loanSettlement() throws Exception {
33664 amit.gupta 3713
        List<Loan> blockedLoans = loanRepository.selectAllActiveLoan().stream().filter(x -> x.getFreeDays() >= 365).collect(toList());
3714
        List<Loan> loans = loanRepository.selectAllActiveLoan().stream().filter(x -> x.getFreeDays() < 365).collect(toList());
3715
        //Settle blocked loans only when normal loans are settled
3716
        loans.addAll(blockedLoans);
33817 amit.gupta 3717
        //TODO:Remove this code
3718
        Loan specificLoan = loanRepository.selectByLoanId(20230);
3719
        loans.add(0, specificLoan);
3720
        //TODO:Upto here
31697 amit.gupta 3721
        if (!loans.isEmpty()) {
30859 tejbeer 3722
 
31697 amit.gupta 3723
            for (Loan loan : loans) {
33664 amit.gupta 3724
                double settledAmount = sdCreditService.settleLoan(loan);
31020 tejbeer 3725
 
33664 amit.gupta 3726
                List<SanctionRequest> sanctionRequests = sanctionRequestRepository.selectHoldSanctionByFofoId(loan.getFofoId());
3727
                for (SanctionRequest sanctionRequest : sanctionRequests) {
30859 tejbeer 3728
 
33664 amit.gupta 3729
                    List<Order> orders = orderRepository.selectAllByTransactionId(sanctionRequest.getTransactionId());
3730
                    if (orders.size() == 0) {
3731
                        LOGGER.info("Could not find orders - for Sanction Request {}", sanctionRequest);
3732
                        continue;
3733
                    }
31175 tejbeer 3734
 
33664 amit.gupta 3735
                    if (settledAmount >= sanctionRequest.getPendingAmount().doubleValue()) {
3736
                        settledAmount -= sanctionRequest.getPendingAmount().doubleValue();
3737
                        sanctionRequest.setPendingAmount(BigDecimal.valueOf(0));
3738
                        this.sendUnholdEmail(orders);
31697 amit.gupta 3739
                    } else {
33664 amit.gupta 3740
                        double pendinAmount = sanctionRequest.getPendingAmount().doubleValue() - settledAmount;
33706 amit.gupta 3741
                        System.out.println("Pending Amount - " + pendinAmount);
33664 amit.gupta 3742
                        sanctionRequest.setPendingAmount(BigDecimal.valueOf(pendinAmount));
3743
                        break;
30999 tejbeer 3744
 
31697 amit.gupta 3745
                    }
31020 tejbeer 3746
 
32439 tejbeer 3747
                }
3748
            }
31020 tejbeer 3749
 
32439 tejbeer 3750
        }
31020 tejbeer 3751
 
33664 amit.gupta 3752
 
32439 tejbeer 3753
    }
31020 tejbeer 3754
 
3755
 
32439 tejbeer 3756
    private void sendUnholdEmail(List<Order> orders) throws Exception {
30859 tejbeer 3757
 
3758
 
32439 tejbeer 3759
        orders.forEach(x -> x.setShipmentHold(false));
33452 amit.gupta 3760
        orders = orders.stream().filter(x -> x.getRefundTimestamp() != null).collect(Collectors.toList());
33506 amit.gupta 3761
        if (orders.size() > 0) {
33427 amit.gupta 3762
 
33664 amit.gupta 3763
            double totalAmount = orders.stream().collect(Collectors.summingDouble(x -> x.getTotalAmount()));
30859 tejbeer 3764
 
33506 amit.gupta 3765
            List<String> authUserEmail = csService.getAuthUserIdByPartnerId(orders.get(0).getRetailerId()).stream().map(x -> x.getEmailId()).collect(Collectors.toList());
3766
            authUserEmail.add("vinay.p@smartdukaan.com");
3767
            authUserEmail.add("shivam.gupta@smartdukaan.com");
30859 tejbeer 3768
 
33506 amit.gupta 3769
            String[] emailTo = authUserEmail.toArray(new String[authUserEmail.size()]);
30859 tejbeer 3770
 
33506 amit.gupta 3771
            String[] ccTo = {"tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com"};
30859 tejbeer 3772
 
33664 amit.gupta 3773
            String subject = "Dispatch held orders of - " + (orders.get(0).getRetailerName());
3774
            String message = String.format("Dear Team, \n" + "kindly note the material for the " + orders.get(0).getRetailerName() + "of Rs." + totalAmount + "is unhold now and needs to be dispatched.");
3775
            Utils.sendMailWithAttachments(mailSender, emailTo, ccTo, subject, message);
33506 amit.gupta 3776
        }
30859 tejbeer 3777
 
32439 tejbeer 3778
 
31697 amit.gupta 3779
    }
30859 tejbeer 3780
 
32307 amit.gupta 3781
    public void dailyLoanAlert() throws Exception {
31697 amit.gupta 3782
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30859 tejbeer 3783
 
31697 amit.gupta 3784
        Map<Integer, Double> partnerLoanAmount = new HashMap<>();
30859 tejbeer 3785
 
31697 amit.gupta 3786
        if (!loans.isEmpty()) {
30859 tejbeer 3787
 
31697 amit.gupta 3788
            for (Loan loan : loans) {
30859 tejbeer 3789
 
31697 amit.gupta 3790
                List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
30859 tejbeer 3791
 
31886 tejbeer 3792
                double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
31697 amit.gupta 3793
                if (partnerLoanAmount.get(loan.getFofoId()) != null) {
3794
                    amount += partnerLoanAmount.get(loan.getFofoId());
3795
                    partnerLoanAmount.put(loan.getFofoId(), amount);
3796
                } else {
3797
                    partnerLoanAmount.put(loan.getFofoId(), amount);
3798
                }
30965 tejbeer 3799
 
31697 amit.gupta 3800
            }
30965 tejbeer 3801
 
31697 amit.gupta 3802
        }
30859 tejbeer 3803
 
31697 amit.gupta 3804
        if (!partnerLoanAmount.isEmpty()) {
30965 tejbeer 3805
 
31697 amit.gupta 3806
            for (Entry<Integer, Double> partnerLoanAmountEnrty : partnerLoanAmount.entrySet()) {
30859 tejbeer 3807
 
31697 amit.gupta 3808
                int fofoId = partnerLoanAmountEnrty.getKey();
30859 tejbeer 3809
 
31697 amit.gupta 3810
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(fofoId);
30859 tejbeer 3811
 
31697 amit.gupta 3812
                Address address = addressRepository.selectById(user.getAddressId());
30896 amit.gupta 3813
 
31697 amit.gupta 3814
                String title = "Alert Credit Outstanding!";
3815
                String url = "http://app.smartdukaan.com/pages/home/credit";
31886 tejbeer 3816
                String message = "Your total pending Loan amount is Rs." + FormattingUtils.formatDecimal(Math.abs(partnerLoanAmountEnrty.getValue())) + ".";
31697 amit.gupta 3817
                notificationService.sendNotification(fofoId, title, MessageType.notification, title, message, url);
30913 tejbeer 3818
 
32841 amit.gupta 3819
                //notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30913 tejbeer 3820
 
31697 amit.gupta 3821
            }
30917 tejbeer 3822
 
31697 amit.gupta 3823
        }
30917 tejbeer 3824
 
31697 amit.gupta 3825
    }
30920 tejbeer 3826
 
31697 amit.gupta 3827
    public void processActivatedImeisForSchemes() throws ProfitMandiBusinessException {
3828
        schemeService.processActivatedImeisForSchemes();
3829
    }
30920 tejbeer 3830
 
33112 amit.gupta 3831
    @Autowired
33355 amit.gupta 3832
    SidbiService sidbiService;
33112 amit.gupta 3833
 
33364 amit.gupta 3834
    public void processSidbiDeductions() throws ProfitMandiBusinessException {
33434 amit.gupta 3835
        //sidbiService.migrateSanctions();
33355 amit.gupta 3836
        sidbiService.processDeductions();
3837
    }
3838
 
31697 amit.gupta 3839
    public void updatePartnerLimit() throws ProfitMandiBusinessException {
3840
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
33355 amit.gupta 3841
        Map<Integer, BigDecimal> fofoSidbiLimitMap = sidbiService.getSuggestedLimitMap();
31886 tejbeer 3842
        Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
33159 amit.gupta 3843
        Map<Integer, CreditAccount> creditAccountMap = creditAccountRepository.selectAllByGateways(Arrays.asList(Gateway.SIDBI, Gateway.SDDIRECT))
33112 amit.gupta 3844
                .stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31886 tejbeer 3845
        Map<Integer, CurrentPartnerDailyInvestment> currentPartnerDailyInvestmentMap = currentPartnerDailyInvestmentRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31697 amit.gupta 3846
        for (Entry<Integer, CustomRetailer> customRetailerEntry : customRetailerMap.entrySet()) {
3847
            int fofoId = customRetailerEntry.getKey();
3848
            LocalDateTime firstBillingDate = transactionRepository.getFirstBillingDate(fofoId);
33287 amit.gupta 3849
 
33112 amit.gupta 3850
            CreditAccount creditAccount = creditAccountMap.get(fofoId);
3851
 
31697 amit.gupta 3852
            CurrentPartnerDailyInvestment currentPartnerDailyInvestment = currentPartnerDailyInvestmentMap.get(fofoId);
33355 amit.gupta 3853
            BigDecimal suggestedAmount = this.getSuggestedAmount(creditAccount, currentPartnerDailyInvestment, fofoSidbiLimitMap.get(fofoId));
33112 amit.gupta 3854
            SDCreditRequirement sdCreditRequirement = sdCreditRequirementMap.get(fofoId);
30929 tejbeer 3855
 
31697 amit.gupta 3856
            LOGGER.info("suggestedAmount {} ", suggestedAmount);
30913 tejbeer 3857
 
31697 amit.gupta 3858
            if (sdCreditRequirement == null) {
3859
                sdCreditRequirement = new SDCreditRequirement();
3860
                sdCreditRequirement.setFofoId(fofoId);
3861
                sdCreditRequirement.setCreditDays(15);
33452 amit.gupta 3862
                sdCreditRequirement.setInterestRate(ProfitMandiConstants.NEW_INTEREST_RATE);
31697 amit.gupta 3863
                sdCreditRequirement.setRisk(CreditRisk.HIGH_RISK);
3864
                sdCreditRequirement.setUtilizedAmount(BigDecimal.ZERO);
3865
                sdCreditRequirement.setCreateTimestamp(LocalDateTime.now());
3866
                sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
3867
                sdCreditRequirementRepository.persist(sdCreditRequirement);
3868
            }
30913 tejbeer 3869
 
31697 amit.gupta 3870
            CreditRisk creditRisk = sdCreditService.getCurrentRisk(sdCreditRequirement, firstBillingDate);
30913 tejbeer 3871
 
31697 amit.gupta 3872
            sdCreditRequirement.setRisk(creditRisk);
30913 tejbeer 3873
 
31697 amit.gupta 3874
            sdCreditRequirement.setSuggestedLimit(suggestedAmount);
3875
            sdCreditRequirement.setLimit(suggestedAmount);
3876
            BigDecimal utilizedLimit = new BigDecimal(sdCreditService.getUtilizationAmount(fofoId));
30934 tejbeer 3877
 
31697 amit.gupta 3878
            BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);
30934 tejbeer 3879
 
31697 amit.gupta 3880
            LOGGER.info("utilizedLimit {} ", utilizedLimit);
30913 tejbeer 3881
 
31697 amit.gupta 3882
            LOGGER.info("availableLimit {} ", availableLimit);
30913 tejbeer 3883
 
31697 amit.gupta 3884
            sdCreditRequirement.setUtilizedAmount(utilizedLimit);
30929 tejbeer 3885
 
31697 amit.gupta 3886
            sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
30929 tejbeer 3887
 
31697 amit.gupta 3888
            if (creditAccount != null) {
30929 tejbeer 3889
 
31697 amit.gupta 3890
                creditAccount.setInterestRate(sdCreditRequirement.getInterestRate().floatValue());
3891
                creditAccount.setSanctionedAmount(sdCreditRequirement.getLimit().floatValue());
3892
                creditAccount.setAvailableAmount(availableLimit.floatValue());
3893
                creditAccount.setFreeDays(sdCreditRequirement.getFreeDays());
3894
                creditAccount.setUpdatedOn(LocalDateTime.now());
3895
            }
30929 tejbeer 3896
 
31697 amit.gupta 3897
        }
31177 tejbeer 3898
 
31697 amit.gupta 3899
    }
30929 tejbeer 3900
 
33355 amit.gupta 3901
    private BigDecimal getSuggestedAmount(CreditAccount creditAccount, CurrentPartnerDailyInvestment currentPartnerDailyInvestment, BigDecimal sidbiLimit) {
33112 amit.gupta 3902
        BigDecimal suggestedAmount = BigDecimal.ZERO;
3903
        //1 LAC
3904
        double limitValue = 100000;
33295 amit.gupta 3905
        if (creditAccount == null || creditAccount.getGateway().equals(Gateway.SDDIRECT)) {
33112 amit.gupta 3906
 
3907
            if (currentPartnerDailyInvestment != null) {
3908
                suggestedAmount = BigDecimal.valueOf(Math.min(currentPartnerDailyInvestment.getTotalInvestment() * 0.1, limitValue));
3909
            }
3910
            if (suggestedAmount.doubleValue() < 0) {
3911
                suggestedAmount = BigDecimal.ZERO;
3912
            }
33355 amit.gupta 3913
        } else if (creditAccount.getGateway().equals(Gateway.SIDBI) && sidbiLimit != null) {
33112 amit.gupta 3914
            //Left
33355 amit.gupta 3915
            suggestedAmount = sidbiLimit;
33112 amit.gupta 3916
        }
3917
        return suggestedAmount;
3918
    }
3919
 
31697 amit.gupta 3920
    public void notifyDefaultLoans() throws ProfitMandiBusinessException, MessagingException, IOException {
30929 tejbeer 3921
 
31697 amit.gupta 3922
        sdCreditService.updateRisk();
3923
        List<Loan> defaultLoans = sdCreditService.getDefaultLoan();
3924
        if (!defaultLoans.isEmpty()) {
3925
            this.sendDefaultLoanAlert(defaultLoans);
3926
        }
30929 tejbeer 3927
 
31697 amit.gupta 3928
    }
30929 tejbeer 3929
 
32482 amit.gupta 3930
    public void sendDefaultLoanAlert(List<Loan> defaultLoans) throws
3931
            ProfitMandiBusinessException, MessagingException, IOException {
31697 amit.gupta 3932
        String subject = "Default Partners";
30931 tejbeer 3933
 
31886 tejbeer 3934
        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 3935
 
33452 amit.gupta 3936
        for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false).entrySet()) {
31697 amit.gupta 3937
            List<Loan> filteredRows = new ArrayList<>();
3938
            for (Loan loan : defaultLoans) {
30929 tejbeer 3939
 
31697 amit.gupta 3940
                if (storeGuyEntry.getValue().contains(loan.getFofoId())) {
30929 tejbeer 3941
 
31697 amit.gupta 3942
                    filteredRows.add(loan);
3943
                }
3944
            }
3945
            if (!filteredRows.isEmpty()) {
33628 tejus.loha 3946
                String[] email = new String[]{storeGuyEntry.getKey()};
31697 amit.gupta 3947
                String messageText = this.getMessageForDueDateExtend(filteredRows);
32350 amit.gupta 3948
                this.sendMailOfHtmlFormat(googleMailSender, email, messageText, null, subject);
30982 tejbeer 3949
 
31697 amit.gupta 3950
            }
30936 tejbeer 3951
 
31697 amit.gupta 3952
        }
33628 tejus.loha 3953
        String messageText = this.getMessageForDueDateExtend(defaultLoans);
3954
        this.sendMailOfHtmlFormat(googleMailSender, new String[]{"puneet.wahi@smartdukaan.com"}, messageText, null, subject);
30982 tejbeer 3955
 
31697 amit.gupta 3956
        for (Loan defaultLoan : defaultLoans) {
3957
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
30929 tejbeer 3958
 
31886 tejbeer 3959
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30929 tejbeer 3960
 
31697 amit.gupta 3961
            com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(defaultLoan.getFofoId());
30936 tejbeer 3962
 
31697 amit.gupta 3963
            Address address = addressRepository.selectById(user.getAddressId());
30936 tejbeer 3964
 
31697 amit.gupta 3965
            String title = "Loan Amount Overdue!";
3966
            String url = "http://app.smartdukaan.com/pages/home/credit";
31886 tejbeer 3967
            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!!";
3968
            notificationService.sendNotification(defaultLoan.getFofoId(), title, MessageType.notification, title, message, url);
30936 tejbeer 3969
 
31697 amit.gupta 3970
            // notificationService.sendWhatsappMessage(message, title,
3971
            // address.getPhoneNumber());
30929 tejbeer 3972
 
31697 amit.gupta 3973
        }
3974
    }
30929 tejbeer 3975
 
31697 amit.gupta 3976
    private String getMessageForDueDateExtend(List<Loan> loans) throws ProfitMandiBusinessException {
33553 ranu 3977
        Map<Integer, com.spice.profitmandi.dao.model.FofoReportingModel> fofoReportingModelMap = csService.getPartnerIdSalesHeaders();
3978
        Map<Integer, FofoRBMReportingModel> fofoRbmReportingModelMap = csService.getPartnerIdRBMHeaders();
3979
        List<AST> asts = astRepository.selectAll();
3980
        Map<Integer, AST> astMap = asts.stream()
3981
                .collect(Collectors.toMap(AST::getId, ast -> ast));
31697 amit.gupta 3982
        StringBuilder sb = new StringBuilder();
3983
        sb.append(
33553 ranu 3984
                "<html><body><p>Alert</p><p>Default Partners :-</p>" + "<br/><p>EveryDay Rs.100 charged as Penalty</p>" + "<br/>" +
3985
                        "<table style='border:1px solid black ;padding: 5px';>");
3986
        sb.append("<tbody>\n" +
3987
                "<tr>\n" +
3988
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>\n" +
33555 ranu 3989
                "<th style='border:1px solid black;padding: 5px'>State Name</th>\n" +
3990
                "<th style='border:1px solid black;padding: 5px'>Area</th>\n" +
3991
                "<th style='border:1px solid black;padding: 5px'>Territory</th>\n" +
33553 ranu 3992
                "<th style='border:1px solid black;padding: 5px'>due date</th>\n" +
3993
                "<th style='border:1px solid black;padding: 5px'>Days</th>\n" +
33664 amit.gupta 3994
                "<th style='border:1px solid black;padding: 5px'>Pending Amount</th>\n" +
33810 ranu 3995
                "<th style='border:1px solid black;padding: 5px'>RBM L2</th>\n" +
33553 ranu 3996
                "<th style='border:1px solid black;padding: 5px'>RBM L1</th>\n" +
3997
                "<th style='border:1px solid black;padding: 5px'>Sales L1</th>\n" +
3998
                "<th style='border:1px solid black;padding: 5px'>Sales L2</th>\n" +
3999
                "</tr>");
31697 amit.gupta 4000
        for (Loan entry : loans) {
30929 tejbeer 4001
 
31697 amit.gupta 4002
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(entry.getId());
30929 tejbeer 4003
 
31886 tejbeer 4004
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30929 tejbeer 4005
 
31697 amit.gupta 4006
            long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getDueDate().toLocalDate(), LocalDateTime.now());
30929 tejbeer 4007
 
31697 amit.gupta 4008
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
30929 tejbeer 4009
 
31697 amit.gupta 4010
            sb.append("<tr>");
31886 tejbeer 4011
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
33555 ranu 4012
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getAddress().getState() + "</td>");
4013
            sb.append("<td style='border:1px solid black;padding: 5px'>" + astMap.get(customRetailer.getAstId()).getArea() + "</td>");
4014
            sb.append("<td style='border:1px solid black;padding: 5px'>" + astMap.get(customRetailer.getAstId()).getTerritory() + "</td>");
31886 tejbeer 4015
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getDueDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
31697 amit.gupta 4016
            sb.append("<td style='border:1px solid black;padding: 5px'>" + noOfdaysBetween + "</td>");
31886 tejbeer 4017
            sb.append("<td style='border:1px solid black;padding: 5px'>" + new DecimalFormat("#.##").format(Math.abs(amount)) + "</td>");
33553 ranu 4018
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoRbmReportingModelMap.get(entry.getFofoId()).getL1Manager() + "</td>");
4019
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoRbmReportingModelMap.get(entry.getFofoId()).getL2Manager() + "</td>");
4020
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoReportingModelMap.get(entry.getFofoId()).getTerritoryManager() + "</td>");
4021
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoReportingModelMap.get(entry.getFofoId()).getRegionalManager() + "</td>");
31397 tejbeer 4022
 
33555 ranu 4023
 
31697 amit.gupta 4024
            sb.append("</tr>");
31397 tejbeer 4025
 
31697 amit.gupta 4026
        }
31397 tejbeer 4027
 
31697 amit.gupta 4028
        sb.append("</tbody></table></body></html>");
31397 tejbeer 4029
 
31697 amit.gupta 4030
        return sb.toString();
4031
    }
31397 tejbeer 4032
 
31697 amit.gupta 4033
    private String getMessageForDueDateCross(List<Loan> loans) throws ProfitMandiBusinessException {
33161 ranu 4034
        Map<Integer, com.spice.profitmandi.dao.model.FofoReportingModel> fofoReportingModelMap = csService.getPartnerIdSalesHeaders();
33452 amit.gupta 4035
        Map<Integer, FofoRBMReportingModel> fofoRbmReportingModelMap = csService.getPartnerIdRBMHeaders();
33553 ranu 4036
        List<AST> asts = astRepository.selectAll();
4037
        Map<Integer, AST> astMap = asts.stream()
4038
                .collect(Collectors.toMap(AST::getId, ast -> ast));
4039
 
31697 amit.gupta 4040
        StringBuilder sb = new StringBuilder();
33161 ranu 4041
        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/>" +
4042
                "<table style='border:1px solid black ;padding: 5px';>");
4043
        sb.append("<tbody>\n" + "<tr>\n" +
33256 amit.gupta 4044
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>\n" +
4045
                "<th style='border:1px solid black;padding: 5px'>State Name</th>\n" +
33555 ranu 4046
                "<th style='border:1px solid black;padding: 5px'>Area</th>\n" +
33553 ranu 4047
                "<th style='border:1px solid black;padding: 5px'>Territory</th>\n" +
33256 amit.gupta 4048
                "<th style='border:1px solid black;padding: 5px'>due date</th>\n" +
4049
                "<th style='border:1px solid black;padding: 5px'>Days</th>\n" +
4050
                "<th style='border:1px solid black;padding: 5px'>Pending Amount</th>\n" +
33810 ranu 4051
                "<th style='border:1px solid black;padding: 5px'>RBM L2</th>\n" +
33256 amit.gupta 4052
                "<th style='border:1px solid black;padding: 5px'>RBM L1</th>\n" +
4053
                "<th style='border:1px solid black;padding: 5px'>Sales L1</th>\n" +
4054
                "<th style='border:1px solid black;padding: 5px'>Sales L2</th>\n" +
33161 ranu 4055
                "</tr>");
31397 tejbeer 4056
 
31697 amit.gupta 4057
        for (Loan entry : loans) {
31397 tejbeer 4058
 
31697 amit.gupta 4059
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(entry.getId());
31397 tejbeer 4060
 
31886 tejbeer 4061
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
31397 tejbeer 4062
 
31697 amit.gupta 4063
            long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getDueDate().toLocalDate(), LocalDateTime.now());
31397 tejbeer 4064
 
31697 amit.gupta 4065
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
31397 tejbeer 4066
 
31697 amit.gupta 4067
            sb.append("<tr>");
31886 tejbeer 4068
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
33162 ranu 4069
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getAddress().getState() + "</td>");
33553 ranu 4070
            sb.append("<td style='border:1px solid black;padding: 5px'>" + astMap.get(customRetailer.getAstId()).getArea() + "</td>");
4071
            sb.append("<td style='border:1px solid black;padding: 5px'>" + astMap.get(customRetailer.getAstId()).getTerritory() + "</td>");
30936 tejbeer 4072
 
31886 tejbeer 4073
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getDueDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
31697 amit.gupta 4074
            sb.append("<td style='border:1px solid black;padding: 5px'>" + noOfdaysBetween + "</td>");
31886 tejbeer 4075
            sb.append("<td style='border:1px solid black;padding: 5px'>" + new DecimalFormat("#.##").format(Math.abs(amount)) + "</td>");
33161 ranu 4076
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoRbmReportingModelMap.get(entry.getFofoId()).getL1Manager() + "</td>");
4077
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoRbmReportingModelMap.get(entry.getFofoId()).getL2Manager() + "</td>");
4078
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoReportingModelMap.get(entry.getFofoId()).getTerritoryManager() + "</td>");
4079
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoReportingModelMap.get(entry.getFofoId()).getRegionalManager() + "</td>");
31697 amit.gupta 4080
            sb.append("</tr>");
4081
        }
31397 tejbeer 4082
 
31697 amit.gupta 4083
        sb.append("</tbody></table></body></html>");
31397 tejbeer 4084
 
31697 amit.gupta 4085
        return sb.toString();
4086
    }
31397 tejbeer 4087
 
32307 amit.gupta 4088
    public void notifyLoanDueDateCross() throws Exception {
31397 tejbeer 4089
 
31697 amit.gupta 4090
        List<Loan> dueDateCrossLoans = sdCreditService.getDueDateCrossLoan();
4091
        if (!dueDateCrossLoans.isEmpty()) {
4092
            this.sendDueDateCrossLoanAlert(dueDateCrossLoans);
4093
        }
31397 tejbeer 4094
 
31697 amit.gupta 4095
    }
31397 tejbeer 4096
 
32307 amit.gupta 4097
    private void sendDueDateCrossLoanAlert(List<Loan> dueDateCrossLoans) throws Exception {
31886 tejbeer 4098
        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 4099
 
33452 amit.gupta 4100
        for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false).entrySet()) {
33631 tejus.loha 4101
            List<Loan> filteredRows = new ArrayList<>();
31697 amit.gupta 4102
            for (Loan loan : dueDateCrossLoans) {
30936 tejbeer 4103
 
31697 amit.gupta 4104
                if (storeGuyEntry.getValue().contains(loan.getFofoId())) {
30982 tejbeer 4105
 
31697 amit.gupta 4106
                    filteredRows.add(loan);
4107
                }
4108
            }
4109
            if (!filteredRows.isEmpty()) {
4110
                String messageText = this.getMessageForDueDateCross(filteredRows);
33628 tejus.loha 4111
                String[] email = new String[]{storeGuyEntry.getKey()};
30982 tejbeer 4112
 
32350 amit.gupta 4113
                this.sendMailOfHtmlFormat(googleMailSender, email, messageText, null, "Due Date Cross");
30936 tejbeer 4114
 
31697 amit.gupta 4115
            }
30936 tejbeer 4116
 
31697 amit.gupta 4117
        }
33631 tejus.loha 4118
        String messageText = this.getMessageForDueDateCross(dueDateCrossLoans);
33628 tejus.loha 4119
        this.sendMailOfHtmlFormat(googleMailSender, new String[]{"puneet.wahi@smartdukaan.com"}, messageText, null, "Due Date Cross");
4120
 
4121
 
31697 amit.gupta 4122
        if (!dueDateCrossLoans.isEmpty()) {
4123
            for (Loan loan : dueDateCrossLoans) {
30936 tejbeer 4124
 
31697 amit.gupta 4125
                long noOfdaysBetween = ChronoUnit.DAYS.between(loan.getDueDate().toLocalDate(), LocalDate.now());
30989 tejbeer 4126
 
31697 amit.gupta 4127
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(loan.getFofoId());
30989 tejbeer 4128
 
31697 amit.gupta 4129
                Address address = addressRepository.selectById(user.getAddressId());
30982 tejbeer 4130
 
31697 amit.gupta 4131
                LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
30982 tejbeer 4132
 
31697 amit.gupta 4133
                List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
30936 tejbeer 4134
 
31886 tejbeer 4135
                double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30936 tejbeer 4136
 
31697 amit.gupta 4137
                String url = "http://app.smartdukaan.com/pages/home/credit";
30936 tejbeer 4138
 
31697 amit.gupta 4139
                String title = "Alert!";
31886 tejbeer 4140
                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 4141
 
31886 tejbeer 4142
                notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title, message, url);
30936 tejbeer 4143
 
32841 amit.gupta 4144
                //notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 4145
 
31697 amit.gupta 4146
            }
4147
        }
30982 tejbeer 4148
 
31697 amit.gupta 4149
    }
30936 tejbeer 4150
 
32307 amit.gupta 4151
    public void alertForDueDate() throws Exception {
30936 tejbeer 4152
 
31697 amit.gupta 4153
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30936 tejbeer 4154
 
31697 amit.gupta 4155
        if (!loans.isEmpty()) {
4156
            for (Loan loan : loans) {
30936 tejbeer 4157
 
31697 amit.gupta 4158
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(loan.getFofoId());
30936 tejbeer 4159
 
31697 amit.gupta 4160
                Address address = addressRepository.selectById(user.getAddressId());
30936 tejbeer 4161
 
31697 amit.gupta 4162
                long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), loan.getDueDate().toLocalDate());
30936 tejbeer 4163
 
31697 amit.gupta 4164
                LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
30982 tejbeer 4165
 
31697 amit.gupta 4166
                if (noOfdaysBetween <= 4 && noOfdaysBetween >= 0) {
4167
                    List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
31886 tejbeer 4168
                    double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30936 tejbeer 4169
 
31697 amit.gupta 4170
                    String title = "Alert!";
4171
                    String url = "http://app.smartdukaan.com/pages/home/credit";
4172
                    String message = null;
4173
                    if (noOfdaysBetween == 0) {
30936 tejbeer 4174
 
31886 tejbeer 4175
                        message = "Your total pending Loan amount is Rs." + FormattingUtils.formatDecimal(Math.abs(amount)) + " is due for Today, Pay Now!!";
30982 tejbeer 4176
 
31697 amit.gupta 4177
                    } else {
30982 tejbeer 4178
 
31886 tejbeer 4179
                        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 4180
 
31697 amit.gupta 4181
                    }
31886 tejbeer 4182
                    notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title, message, url);
32841 amit.gupta 4183
                    //notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 4184
 
31697 amit.gupta 4185
                }
4186
            }
4187
        }
30984 tejbeer 4188
 
31697 amit.gupta 4189
    }
30982 tejbeer 4190
 
32307 amit.gupta 4191
    public void userMobileNumberOptIn() throws Exception {
30982 tejbeer 4192
 
31697 amit.gupta 4193
        List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
30982 tejbeer 4194
 
31886 tejbeer 4195
        List<com.spice.profitmandi.dao.entity.user.User> users = userUserRepository.selectByIds(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
30982 tejbeer 4196
 
31886 tejbeer 4197
        List<Address> addresses = addressRepository.selectByIds(users.stream().map(x -> x.getAddressId()).collect(Collectors.toList()));
30982 tejbeer 4198
 
31697 amit.gupta 4199
        LOGGER.info("addresses" + addresses);
30984 tejbeer 4200
 
31697 amit.gupta 4201
        for (Address address : addresses) {
32307 amit.gupta 4202
            notificationService.optIn(address.getPhoneNumber());
30982 tejbeer 4203
 
31697 amit.gupta 4204
        }
30982 tejbeer 4205
 
31697 amit.gupta 4206
    }
30982 tejbeer 4207
 
31697 amit.gupta 4208
    public void authUserMobileNumberOptIn() throws HttpHostConnectException, ProfitMandiBusinessException {
31206 tejbeer 4209
 
31697 amit.gupta 4210
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
4211
        LOGGER.info("authUsers" + authUsers);
31206 tejbeer 4212
 
31697 amit.gupta 4213
        for (AuthUser authUser : authUsers) {
4214
            Map<String, String> requestheaders = new HashMap<>();
4215
            requestheaders.put("Content-Type", "application/x-www-form-urlencoded");
4216
            Map<String, String> requestParams = new HashMap<>();
4217
            requestParams.put("userid", String.valueOf(2000215976));
4218
            requestParams.put("password", "MFRd!BBL");
4219
            requestParams.put("phone_number", authUser.getMobileNumber());
4220
            requestParams.put("auth_scheme", "plain");
4221
            requestParams.put("v", "1.1");
4222
            requestParams.put("format", "json");
31206 tejbeer 4223
 
31697 amit.gupta 4224
            requestParams.put("method", "OPT_IN");
31206 tejbeer 4225
 
31697 amit.gupta 4226
            requestParams.put("channel", "WHATSAPP");
31886 tejbeer 4227
            String response = restClient.get("https://media.smsgupshup.com/GatewayAPI/rest", requestParams, requestheaders);
31697 amit.gupta 4228
            LOGGER.info("response" + response);
4229
        }
31206 tejbeer 4230
 
31697 amit.gupta 4231
    }
31206 tejbeer 4232
 
31697 amit.gupta 4233
    @Autowired
4234
    private HygieneDataRepository hygieneDataRepository;
31209 tejbeer 4235
 
31697 amit.gupta 4236
    public void hygineAlertForPartner() throws ProfitMandiBusinessException, MessagingException, IOException {
31206 tejbeer 4237
 
31697 amit.gupta 4238
        List<String> remarks = new ArrayList<>();
4239
        remarks.add("Out of Service");
4240
        remarks.add("Duplicate number");
4241
        remarks.add("Partner number");
31886 tejbeer 4242
        List<HygieneData> hygieneData = hygieneDataRepository.selectAllByDisposedDateAndRemark(LocalDate.now(), remarks);
31206 tejbeer 4243
 
31697 amit.gupta 4244
        if (!hygieneData.isEmpty()) {
31206 tejbeer 4245
 
31886 tejbeer 4246
            Map<Integer, List<HygieneData>> partnerHygieneDataMap = hygieneData.stream().collect(groupingBy(x -> x.getFofoId()));
31206 tejbeer 4247
 
31697 amit.gupta 4248
            for (Entry<Integer, List<HygieneData>> partnerHygieneDataMapEntry : partnerHygieneDataMap.entrySet()) {
31206 tejbeer 4249
 
31697 amit.gupta 4250
                CustomRetailer customRetailer = retailerService.getFofoRetailer(partnerHygieneDataMapEntry.getKey());
31206 tejbeer 4251
 
31697 amit.gupta 4252
                StringBuilder sb = new StringBuilder();
31886 tejbeer 4253
                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 4254
 
31886 tejbeer 4255
                        + " </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 4256
 
31697 amit.gupta 4257
                        + "<br/><table style='border:1px solid black ;padding: 5px';>");
4258
                sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4259
                sb.append("<th style='border:1px solid black;padding: 5px'>Invoice Number</th>\n");
4260
                sb.append("<th style='border:1px solid black;padding: 5px'>Customer Name</th>\n");
4261
                sb.append("<th style='border:1px solid black;padding: 5px'>Customer Number</th>\n");
4262
                sb.append("</tr>\n");
31206 tejbeer 4263
 
31697 amit.gupta 4264
                List<HygieneData> hygienes = partnerHygieneDataMapEntry.getValue();
31206 tejbeer 4265
 
31697 amit.gupta 4266
                List<Integer> orderIds = hygienes.stream().map(x -> x.getOrderId()).collect(Collectors.toList());
31206 tejbeer 4267
 
31697 amit.gupta 4268
                List<FofoOrder> fofoOrders = fofoOrderRepository.selectAllByOrderIds(orderIds);
31206 tejbeer 4269
 
31697 amit.gupta 4270
                for (FofoOrder fofoOrder : fofoOrders) {
4271
                    Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
4272
                    sb.append("<tr>");
31886 tejbeer 4273
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoOrder.getInvoiceNumber() + "</td>\n");
4274
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customer.getFirstName() + "" + customer.getLastName() + "</td>\n");
4275
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customer.getMobileNumber() + "</td>\n");
31206 tejbeer 4276
 
31697 amit.gupta 4277
                    sb.append("</tr>\n");
4278
                }
31206 tejbeer 4279
 
31697 amit.gupta 4280
                sb.append("</tbody></table></body></html>");
4281
                String subject = "Customer Info - Hygiene Alert";
31206 tejbeer 4282
 
32350 amit.gupta 4283
                this.sendMailOfHtmlFormat(mailSender, new String[]{customRetailer.getEmail()}, sb.toString(), null, subject);
31206 tejbeer 4284
 
31697 amit.gupta 4285
            }
31206 tejbeer 4286
 
31697 amit.gupta 4287
        }
31206 tejbeer 4288
 
31697 amit.gupta 4289
    }
31206 tejbeer 4290
 
33046 amit.gupta 4291
    //
4292
    public void setInventoryItemIdToPriceDropImei() {
4293
        List<PriceDropIMEI> priceDropIMEIList = priceDropIMEIRepository.selectAllMissingInventoryItemIds();
4294
        LOGGER.info("Problems with - {} entries", priceDropIMEIList.size());
4295
        //priceDropIMEIList.stream().collect(C)
4296
        for (PriceDropIMEI priceDropIMEI : priceDropIMEIList) {
4297
            System.out.println(priceDropIMEI.getImei());
4298
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectAllBySerialNumberFofoId(priceDropIMEI.getImei(), priceDropIMEI.getPartnerId());
33051 amit.gupta 4299
            if (inventoryItems.size() == 0) {
33046 amit.gupta 4300
                LOGGER.info("Could not find Grn - FofoID {} , Imei {} ", priceDropIMEI);
33051 amit.gupta 4301
            } else if (inventoryItems.size() > 1) {
33046 amit.gupta 4302
                LOGGER.info("Found 2 such instance for - FofoID {} , Imei {} ", priceDropIMEI.getImei(), priceDropIMEI.getPartnerId());
4303
            } else {
4304
                priceDropIMEI.setInventoryItemId(inventoryItems.get(0).getId());
4305
            }
4306
 
4307
        }
4308
    }
4309
 
33051 amit.gupta 4310
    @Autowired
4311
    SaholicReservationSnapshotRepository saholicReservationSnapshotRepository;
4312
 
33256 amit.gupta 4313
    public void removePartialBillingForTransaction(int transactionId) throws ProfitMandiBusinessException {
33051 amit.gupta 4314
        List<Order> orderList = orderRepository.selectAllByTransactionId(transactionId);
4315
        Map<Integer, Order> orderMap = orderList.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
4316
        //Delete scanRecords
4317
        List<WarehouseScan> warehouseScans = warehouseScanRepository.selectAllByOrderIds(new ArrayList<>(orderMap.keySet()));
4318
        for (WarehouseScan warehouseScan : warehouseScans) {
4319
            warehouseScanRepository.delete(warehouseScan);
4320
            WarehouseInventoryItem warehouseInventoryItem = warehouseInventoryItemRepository.selectById(warehouseScan.getInventoryItemId());
4321
            warehouseInventoryItem.setLastScanType(in.shop2020.warehouse.ScanType.PURCHASE);
4322
            warehouseInventoryItem.setCurrentQuantity(warehouseInventoryItem.getCurrentQuantity() + warehouseScan.getQuantity());
4323
        }
4324
 
4325
        for (Order order : orderList) {
33078 ranu 4326
            if (order.getBillingTimestamp() != null) {
33056 amit.gupta 4327
                order.setStatus(OrderStatus.ACCEPTED);
4328
                order.setStatusDescription("Submitted for Processing");
4329
                order.setBillingTimestamp(null);
4330
                order.setBilledBy(null);
33057 amit.gupta 4331
                order.setSerialNumber(null);
33056 amit.gupta 4332
                order.setJacketNumber(null);
33060 amit.gupta 4333
                order.getLineItem().setSerialNumber(null);
33056 amit.gupta 4334
                List<LineItemImei> lineItemImeis = lineItemImeisRepository.selectByLineItemId(order.getLineItem().getId());
4335
                for (LineItemImei lineItemImei : lineItemImeis) {
4336
                    lineItemImeisRepository.delete(lineItemImei);
4337
                }
4338
                SaholicReservationSnapshot saholicReservationSnapshot = saholicReservationSnapshotRepository
4339
                        .selectByOrderId(order.getId());
4340
                if (saholicReservationSnapshot == null) {
4341
                    saholicInventoryService.addReservationCount(order.getLineItem().getItemId(),
4342
                            order.getFulfilmentWarehouseId(), order.getLineItem().getQuantity(), order.getId());
4343
                }
33055 amit.gupta 4344
            }
33051 amit.gupta 4345
        }
4346
    }
4347
 
31697 amit.gupta 4348
    public void hygineAlertForInternalTeam() throws ProfitMandiBusinessException, MessagingException, IOException {
31206 tejbeer 4349
 
31697 amit.gupta 4350
        List<String> remarks = new ArrayList<>();
4351
        remarks.add("Out of Service");
4352
        remarks.add("Duplicate number");
4353
        remarks.add("Partner number");
31886 tejbeer 4354
        List<HygieneData> hygieneDataLastThreeMonth = hygieneDataRepository.selectDisposedDateAndRemarks(
4355
                LocalDate.now().withDayOfMonth(1).minusMonths(3).atStartOfDay(), LocalDate.now().minusMonths(1).withDayOfMonth(LocalDate.now().minusMonths(1).lengthOfMonth()).atTime(LocalTime.MAX), remarks);
31206 tejbeer 4356
 
31886 tejbeer 4357
        List<HygieneData> hygieneDataRecentMonth = hygieneDataRepository.selectDisposedDateAndRemarks(LocalDate.now().withDayOfMonth(1), remarks);
31697 amit.gupta 4358
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
4359
        Map<Integer, List<HygieneData>> partnerHygieneLastThreeMonthMap = null;
31206 tejbeer 4360
 
31697 amit.gupta 4361
        Map<Integer, List<HygieneData>> partnerHygieneDataRecentMonth = null;
31206 tejbeer 4362
 
31697 amit.gupta 4363
        if (!hygieneDataLastThreeMonth.isEmpty()) {
31886 tejbeer 4364
            partnerHygieneLastThreeMonthMap = hygieneDataLastThreeMonth.stream().collect(groupingBy(x -> x.getFofoId()));
31206 tejbeer 4365
 
31697 amit.gupta 4366
        }
31206 tejbeer 4367
 
31697 amit.gupta 4368
        if (!hygieneDataRecentMonth.isEmpty()) {
31886 tejbeer 4369
            partnerHygieneDataRecentMonth = hygieneDataRecentMonth.stream().collect(groupingBy(x -> x.getFofoId()));
31697 amit.gupta 4370
        }
31206 tejbeer 4371
 
31697 amit.gupta 4372
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
31206 tejbeer 4373
 
31697 amit.gupta 4374
            String email = storeGuyEntry.getKey();
31206 tejbeer 4375
 
31697 amit.gupta 4376
            List<Integer> fofoIds = new ArrayList<>(storeGuyEntry.getValue());
31206 tejbeer 4377
 
31697 amit.gupta 4378
            Map<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthData = new HashMap<>();
4379
            Map<Integer, Map<LocalDate, List<HygieneData>>> partnerDateWiseData = new HashMap<>();
4380
            for (Integer fofoId : fofoIds) {
31206 tejbeer 4381
 
31697 amit.gupta 4382
                partnerYearMonthData.put(fofoId, null);
4383
                partnerDateWiseData.put(fofoId, null);
4384
                if (!partnerHygieneLastThreeMonthMap.isEmpty()) {
4385
                    List<HygieneData> hygienes = partnerHygieneLastThreeMonthMap.get(fofoId);
31206 tejbeer 4386
 
31697 amit.gupta 4387
                    if (hygienes != null) {
31886 tejbeer 4388
                        Map<YearMonth, List<HygieneData>> yearMonthData = hygienes.stream().collect(groupingBy(x -> YearMonth.from(x.getDisposedTimestamp())));
31206 tejbeer 4389
 
31697 amit.gupta 4390
                        partnerYearMonthData.put(fofoId, yearMonthData);
31206 tejbeer 4391
 
31697 amit.gupta 4392
                    }
4393
                    List<HygieneData> dateWiseHygienes = partnerHygieneDataRecentMonth.get(fofoId);
31206 tejbeer 4394
 
31697 amit.gupta 4395
                    if (dateWiseHygienes != null) {
31206 tejbeer 4396
 
31886 tejbeer 4397
                        Map<LocalDate, List<HygieneData>> dateWiseData = hygienes.stream().collect(groupingBy(x -> (x.getDisposedTimestamp()).toLocalDate()));
31206 tejbeer 4398
 
31697 amit.gupta 4399
                        partnerDateWiseData.put(fofoId, dateWiseData);
31206 tejbeer 4400
 
31697 amit.gupta 4401
                    }
31206 tejbeer 4402
 
31697 amit.gupta 4403
                }
31206 tejbeer 4404
 
31697 amit.gupta 4405
            }
31206 tejbeer 4406
 
31697 amit.gupta 4407
            String subject = "Customer Info - Hygiene Alert";
31206 tejbeer 4408
 
31697 amit.gupta 4409
            LOGGER.info("hygieneData {}", partnerDateWiseData.values());
31206 tejbeer 4410
 
31697 amit.gupta 4411
            boolean partnerDateWise = partnerDateWiseData.values().stream().allMatch(Objects::isNull);
31206 tejbeer 4412
 
31697 amit.gupta 4413
            boolean partnerYearMonth = partnerYearMonthData.values().stream().allMatch(Objects::isNull);
31206 tejbeer 4414
 
31697 amit.gupta 4415
            if (!partnerDateWise && !partnerYearMonth) {
4416
                String sb = this.getMessageHygieneAlertForPartner(partnerYearMonthData, partnerDateWiseData);
32350 amit.gupta 4417
                this.sendMailOfHtmlFormat(googleMailSender, new String[]{email}, sb, null, subject);
31697 amit.gupta 4418
            }
31206 tejbeer 4419
 
31697 amit.gupta 4420
        }
31206 tejbeer 4421
 
31697 amit.gupta 4422
    }
31206 tejbeer 4423
 
31697 amit.gupta 4424
    private String getMessageHygieneAlertForPartner(
33256 amit.gupta 4425
            Map<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthData, Map<Integer, Map<LocalDate, List<HygieneData>>> partnerDateWiseData)
4426
            throws ProfitMandiBusinessException {
31206 tejbeer 4427
 
31697 amit.gupta 4428
        Map<Integer, CustomRetailer> customeRetailerMap = retailerService.getAllFofoRetailers();
31206 tejbeer 4429
 
31697 amit.gupta 4430
        LocalDateTime startDate = LocalDate.now().withDayOfMonth(1).atStartOfDay();
4431
        LocalDateTime endDate = LocalDateTime.now();
31206 tejbeer 4432
 
31697 amit.gupta 4433
        LocalDateTime startYearMonth = LocalDate.now().withDayOfMonth(1).minusMonths(3).atStartOfDay();
31886 tejbeer 4434
        LocalDateTime endYearMonth = LocalDate.now().minusMonths(1).withDayOfMonth(LocalDate.now().minusMonths(1).lengthOfMonth()).atTime(LocalTime.MAX);
31206 tejbeer 4435
 
31697 amit.gupta 4436
        DateTimeFormatter dateYearMonthFormatter = DateTimeFormatter.ofPattern("MMM''uu");
31206 tejbeer 4437
 
31697 amit.gupta 4438
        List<YearMonth> yearMonthRange = new ArrayList<>();
4439
        yearMonthRange.add(YearMonth.from(startYearMonth));
31206 tejbeer 4440
 
31697 amit.gupta 4441
        yearMonthRange.add(YearMonth.from(startYearMonth.plusMonths(1)));
31206 tejbeer 4442
 
31697 amit.gupta 4443
        yearMonthRange.add(YearMonth.from(endYearMonth));
31206 tejbeer 4444
 
31697 amit.gupta 4445
        long noOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate.plusDays(1));
31206 tejbeer 4446
 
31886 tejbeer 4447
        List<LocalDate> dateRange = Stream.iterate(startDate.toLocalDate(), date -> date.plusDays(1)).limit(noOfDaysBetween).collect(Collectors.toList());
31206 tejbeer 4448
 
31697 amit.gupta 4449
        StringBuilder sb = new StringBuilder();
31886 tejbeer 4450
        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 4451
 
31697 amit.gupta 4452
                + "<table style='border:1px solid black ;padding: 5px';>");
4453
        sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4454
        sb.append("<th style='border:1px solid black;padding: 5px'>Partner Name</th>\n");
31206 tejbeer 4455
 
31697 amit.gupta 4456
        for (YearMonth yearMonth : yearMonthRange) {
31886 tejbeer 4457
            sb.append("<th style='border:1px solid black;padding: 5px'>" + yearMonth.format(dateYearMonthFormatter) + "</th>\n");
31697 amit.gupta 4458
        }
31206 tejbeer 4459
 
31697 amit.gupta 4460
        for (LocalDate localDate : dateRange) {
4461
            sb.append("<th style='border:1px solid black;padding: 5px'>" + localDate + "</th>\n");
4462
        }
31206 tejbeer 4463
 
31697 amit.gupta 4464
        sb.append("</tr>\n");
31206 tejbeer 4465
 
31886 tejbeer 4466
        for (Entry<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthEntry : partnerYearMonthData.entrySet()) {
31206 tejbeer 4467
 
31697 amit.gupta 4468
            int fofoId = partnerYearMonthEntry.getKey();
31206 tejbeer 4469
 
31697 amit.gupta 4470
            Map<YearMonth, List<HygieneData>> yearMonthData = partnerYearMonthEntry.getValue();
31206 tejbeer 4471
 
31697 amit.gupta 4472
            Map<LocalDate, List<HygieneData>> dateWiseData = partnerDateWiseData.get(fofoId);
31206 tejbeer 4473
 
31697 amit.gupta 4474
            if (yearMonthData == null && dateWiseData == null) {
4475
                continue;
4476
            }
31206 tejbeer 4477
 
31697 amit.gupta 4478
            sb.append("<tr>");
31886 tejbeer 4479
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customeRetailerMap.get(fofoId).getBusinessName() + "</td>\n");
31697 amit.gupta 4480
            for (YearMonth yearMonth : yearMonthRange) {
31206 tejbeer 4481
 
31697 amit.gupta 4482
                if (yearMonthData == null) {
4483
                    sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4484
 
31697 amit.gupta 4485
                } else {
4486
                    List<HygieneData> hygieneList = yearMonthData.get(yearMonth);
31206 tejbeer 4487
 
31697 amit.gupta 4488
                    if (hygieneList != null) {
4489
                        sb.append("<td style='border:1px solid black;padding: 5px'>" + hygieneList.size() + "</td>\n");
31206 tejbeer 4490
 
31697 amit.gupta 4491
                    } else {
4492
                        sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4493
 
31697 amit.gupta 4494
                    }
4495
                }
4496
            }
31206 tejbeer 4497
 
31697 amit.gupta 4498
            for (LocalDate localDate : dateRange) {
31206 tejbeer 4499
 
31697 amit.gupta 4500
                if (dateWiseData == null) {
4501
                    sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4502
 
31697 amit.gupta 4503
                } else {
4504
                    List<HygieneData> hygieneList = dateWiseData.get(localDate);
31206 tejbeer 4505
 
31697 amit.gupta 4506
                    if (hygieneList != null) {
4507
                        sb.append("<td style='border:1px solid black;padding: 5px'>" + hygieneList.size() + "</td>\n");
31218 tejbeer 4508
 
31697 amit.gupta 4509
                    } else {
4510
                        sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31218 tejbeer 4511
 
31697 amit.gupta 4512
                    }
4513
                }
4514
            }
4515
            sb.append("</tr>");
31218 tejbeer 4516
 
31697 amit.gupta 4517
        }
31218 tejbeer 4518
 
31697 amit.gupta 4519
        sb.append("</tbody></table></body></html>");
31218 tejbeer 4520
 
31697 amit.gupta 4521
        return sb.toString();
4522
    }
31218 tejbeer 4523
 
31697 amit.gupta 4524
    @Autowired
4525
    private MonthlyTargetRepository monthlyTargetRepository;
31218 tejbeer 4526
 
31697 amit.gupta 4527
    public void monthlyTargetForPartner() throws MessagingException, ProfitMandiBusinessException, IOException {
31218 tejbeer 4528
 
31697 amit.gupta 4529
        LocalDateTime curDate = LocalDateTime.now();
4530
        List<MonthlyTarget> monthlyTargets = monthlyTargetRepository.selectByDate(YearMonth.now());
31218 tejbeer 4531
 
31886 tejbeer 4532
        Map<Integer, MonthlyTarget> partnersMonthlyTarget = monthlyTargets.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31218 tejbeer 4533
 
31886 tejbeer 4534
        Map<Integer, Double> secondaryMtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
4535
        Map<Integer, Double> todaytertiary = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate, curDate.with(LocalTime.MAX), 0, false);
31218 tejbeer 4536
 
31697 amit.gupta 4537
        String subject = "Monthly Target Vs Achievement";
31218 tejbeer 4538
 
31697 amit.gupta 4539
        for (Entry<Integer, MonthlyTarget> partnerMonthlyTargetEntry : partnersMonthlyTarget.entrySet()) {
31249 tejbeer 4540
 
31697 amit.gupta 4541
            int fofoId = partnerMonthlyTargetEntry.getKey();
31249 tejbeer 4542
 
31697 amit.gupta 4543
            CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
31249 tejbeer 4544
 
31697 amit.gupta 4545
            Double purchaseTarget = partnerMonthlyTargetEntry.getValue().getPurchaseTarget();
31218 tejbeer 4546
 
31697 amit.gupta 4547
            Double saleTarget = partnerMonthlyTargetEntry.getValue().getSaleTarget();
31218 tejbeer 4548
 
31697 amit.gupta 4549
            if (purchaseTarget > 0) {
4550
                Double purchase = secondaryMtd.get(fofoId);
31249 tejbeer 4551
 
31697 amit.gupta 4552
                if (purchase == null) {
4553
                    purchase = 0.0;
4554
                }
31218 tejbeer 4555
 
31697 amit.gupta 4556
                Double balanceTarget = purchaseTarget - purchase;
31218 tejbeer 4557
 
31697 amit.gupta 4558
                if (balanceTarget <= 0) {
4559
                    balanceTarget = 0.0;
4560
                }
31651 tejbeer 4561
 
31697 amit.gupta 4562
                StringBuilder sb = new StringBuilder();
4563
                sb.append("<html><body><p>Dear Partner,\n");
31886 tejbeer 4564
                sb.append("<p>Pls note your agreed monthly target is Rs." + purchaseTarget + " and your achievement till date is Rs." + purchase + "</p>");
31697 amit.gupta 4565
                sb.append("<p>Pls note that your balance target is Rs." + balanceTarget + "</p>\n");
4566
                sb.append(
32350 amit.gupta 4567
                        "<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 4568
 
32350 amit.gupta 4569
                this.sendMailOfHtmlFormat(mailSender, new String[]{customRetailer.getEmail()}, sb.toString(), null, subject);
31697 amit.gupta 4570
            }
31218 tejbeer 4571
 
31697 amit.gupta 4572
        }
31218 tejbeer 4573
 
31697 amit.gupta 4574
    }
31218 tejbeer 4575
 
33444 ranu 4576
 
4577
    public void findAllLiveDemoBrandItemsByBillingDate() throws MessagingException, ProfitMandiBusinessException, IOException {
4578
        LocalDateTime endDate = LocalDate.now().atStartOfDay().minusDays(8);
4579
 
4580
        List<LiveDemoOrderLineItemModel> liveDemoOrderLineItemModels = orderRepository.findAllLiveDemoBrandItemsByBillingDate(endDate.minusDays(60), endDate);
4581
        LOGGER.info("liveDemoOrderLineItemModels {}", liveDemoOrderLineItemModels);
4582
        String subject = "Billed Live Demo Model";
4583
        StringBuilder sb = new StringBuilder();
4584
 
4585
        sb.append("<html><body><p>Hi,\n");
4586
        sb.append("<p>Please check live demo billed order :</p>\n" + " <table style='border:1px solid black ;padding: 5px; border-collapse: collapse;'>");
4587
 
4588
        sb.append("<th style='border:1px solid black;padding: 5px'>Item Id</th>\n");
4589
        sb.append("<th style='border:1px solid black;padding: 5px'>Invoice Number</th>\n");
4590
        sb.append("<th style='border:1px solid black;padding: 5px'>Brand</th>\n");
4591
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Number</th>\n");
4592
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Name</th>\n");
4593
        sb.append("<th style='border:1px solid black;padding: 5px'>Serial Number</th>\n");
4594
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer Name</th>\n");
4595
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer City</th>\n");
4596
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer Pincode</th>\n");
4597
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer State</th>\n");
4598
        sb.append("<th style='border:1px solid black;padding: 5px'>Billing Date</th>\n");
4599
        sb.append("</tr>\n");
4600
        for (LiveDemoOrderLineItemModel liveDemoModel : liveDemoOrderLineItemModels) {
4601
            sb.append("<tr>");
4602
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getItemId() + "</td>\n");
4603
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getInvoiceNumber() + "</td>\n");
4604
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getBrand() + "</td>\n");
4605
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getModelNumber() + "</td>\n");
4606
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getModelName() + "</td>\n");
4607
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getSerialNumber() + "</td>\n");
4608
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getRetailerName() + "</td>\n");
4609
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getRetailerCity() + "</td>\n");
4610
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getRetailerPincode() + "</td>\n");
4611
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getState() + "</td>\n");
4612
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getFormattedBillingDate() + "</td>\n");
4613
 
4614
            sb.append("</tr>\n");
4615
 
33506 amit.gupta 4616
        }
33444 ranu 4617
        List<String> sendTo = Arrays.asList("kamini.sharma@smartdukaan.com", "niranjan.kala@smartdukaan.com",
33506 amit.gupta 4618
                "mohit.gulati@smartdukaan.com", "vinay.p@smartdukaan.com", "shivam.gupta@smartdukaan.com");
33444 ranu 4619
 
4620
 
4621
        String[] email = sendTo.toArray(new String[sendTo.size()]);
4622
        this.sendMailOfHtmlFormat(mailSender, email, sb.toString(), null, subject);
4623
 
4624
    }
4625
 
33464 ranu 4626
    public void findTodayPocoBillingItems() throws MessagingException, ProfitMandiBusinessException, IOException {
4627
        LocalDateTime endDate = LocalDate.now().atStartOfDay().plusDays(1);
4628
        LocalDateTime startDate = LocalDate.now().atStartOfDay().minusDays(1);
33444 ranu 4629
 
33464 ranu 4630
        List<LiveDemoOrderLineItemModel> pocoBillingOrderLineItemModels = orderRepository.findTodayPocoBillingItems(startDate, endDate);
4631
        LOGGER.info("pocoBillingOrderLineItemModels {}", pocoBillingOrderLineItemModels);
4632
        String subject = "Poco Billing";
4633
        StringBuilder sb = new StringBuilder();
4634
 
4635
        sb.append("<html><body><p>Hi,\n");
4636
        sb.append("<p>Please check poco billed order :</p>\n" + " <table style='border:1px solid black ;padding: 5px; border-collapse: collapse;'>");
4637
 
4638
        sb.append("<th style='border:1px solid black;padding: 5px'>Brand</th>\n");
4639
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Number</th>\n");
4640
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Name</th>\n");
4641
        sb.append("<th style='border:1px solid black;padding: 5px'>Serial Number</th>\n");
4642
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer State</th>\n");
4643
        sb.append("<th style='border:1px solid black;padding: 5px'>Billing Date</th>\n");
4644
        sb.append("</tr>\n");
4645
        for (LiveDemoOrderLineItemModel pocoModel : pocoBillingOrderLineItemModels) {
4646
            sb.append("<tr>");
4647
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getBrand() + "</td>\n");
4648
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getModelNumber() + "</td>\n");
4649
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getModelName() + "</td>\n");
4650
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getSerialNumber() + "</td>\n");
4651
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getState() + "</td>\n");
4652
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getFormattedBillingDate() + "</td>\n");
4653
 
4654
            sb.append("</tr>\n");
4655
 
33506 amit.gupta 4656
        }
33664 amit.gupta 4657
        List<String> sendTo = Arrays.asList("uday.singh@smartdukaan.com", "kuldeep.kumar@smartdukaan.com", "nishant.ohri@smartdukaan.com", "ritesh.chauhan1@smartdukaan.com");
33464 ranu 4658
 
4659
        String[] email = sendTo.toArray(new String[sendTo.size()]);
4660
        this.sendMailOfHtmlFormat(mailSender, email, sb.toString(), null, subject);
4661
 
4662
    }
4663
 
4664
 
31697 amit.gupta 4665
    public void monthlyTargetForInternalTeam() throws MessagingException, ProfitMandiBusinessException, IOException {
31218 tejbeer 4666
 
31697 amit.gupta 4667
        LocalDateTime curDate = LocalDateTime.now();
31218 tejbeer 4668
 
31886 tejbeer 4669
        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 4670
 
31697 amit.gupta 4671
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false);
31218 tejbeer 4672
 
31697 amit.gupta 4673
        List<MonthlyTarget> monthlyTargets = monthlyTargetRepository.selectByDate(YearMonth.now());
31218 tejbeer 4674
 
31697 amit.gupta 4675
        Map<Integer, CustomRetailer> customeRetailerMap = retailerService.getAllFofoRetailers();
31218 tejbeer 4676
 
31886 tejbeer 4677
        Map<Integer, MonthlyTarget> partnersMonthlyTarget = monthlyTargets.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31218 tejbeer 4678
 
31886 tejbeer 4679
        Map<Integer, Double> secondaryMtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
4680
        Map<Integer, Double> todaytertiary = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate, curDate.with(LocalTime.MAX), 0, false);
31218 tejbeer 4681
 
31697 amit.gupta 4682
        String subject = "Monthly Target Vs Achievement";
31218 tejbeer 4683
 
31697 amit.gupta 4684
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
31218 tejbeer 4685
 
31697 amit.gupta 4686
            String email = storeGuyEntry.getKey();
31218 tejbeer 4687
 
31697 amit.gupta 4688
            List<Integer> fofoIds = new ArrayList<>(storeGuyEntry.getValue());
4689
            Map<Integer, MonthlyTarget> monthlyTargetAchievement = new HashMap<>();
4690
            for (Integer fofoId : fofoIds) {
31218 tejbeer 4691
 
31697 amit.gupta 4692
                MonthlyTarget monthlyTarget = partnersMonthlyTarget.get(fofoId);
4693
                if (monthlyTarget != null) {
4694
                    Double purchaseTarget = monthlyTarget.getPurchaseTarget();
31218 tejbeer 4695
 
31697 amit.gupta 4696
                    Double saleTarget = monthlyTarget.getSaleTarget();
31218 tejbeer 4697
 
31697 amit.gupta 4698
                    if (purchaseTarget != null && purchaseTarget > 0) {
4699
                        Double purchase = secondaryMtd.get(fofoId);
4700
                        if (purchase == null) {
4701
                            purchase = 0.0;
4702
                        }
4703
                        monthlyTarget.setPurchaseAchievement(purchase);
4704
                        monthlyTargetAchievement.put(fofoId, monthlyTarget);
31218 tejbeer 4705
 
31697 amit.gupta 4706
                    }
4707
                }
4708
            }
31218 tejbeer 4709
 
31697 amit.gupta 4710
            if (!monthlyTargetAchievement.isEmpty()) {
31218 tejbeer 4711
 
31697 amit.gupta 4712
                StringBuilder sb = new StringBuilder();
31218 tejbeer 4713
 
31697 amit.gupta 4714
                sb.append("<html><body><p>Hi,\n");
31886 tejbeer 4715
                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 4716
                sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4717
                sb.append("<th style='border:1px solid black;padding: 5px'>Partner Name</th>\n");
31218 tejbeer 4718
 
31697 amit.gupta 4719
                sb.append("<th style='border:1px solid black;padding: 5px'>Purchase Target</th>\n");
31218 tejbeer 4720
 
31697 amit.gupta 4721
                sb.append("<th style='border:1px solid black;padding: 5px'>Purchase Achievement</th>\n");
4722
                sb.append("</tr>\n");
31218 tejbeer 4723
 
31886 tejbeer 4724
                for (Entry<Integer, MonthlyTarget> monthlyTargetAchievementEntry : monthlyTargetAchievement.entrySet()) {
31697 amit.gupta 4725
                    sb.append("<tr>");
4726
                    int fofoId = monthlyTargetAchievementEntry.getKey();
31218 tejbeer 4727
 
31697 amit.gupta 4728
                    MonthlyTarget monthlyTarget = monthlyTargetAchievementEntry.getValue();
31886 tejbeer 4729
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customeRetailerMap.get(fofoId).getBusinessName() + "</td>\n");
31218 tejbeer 4730
 
31886 tejbeer 4731
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + monthlyTarget.getPurchaseTarget() + "</td>\n");
31218 tejbeer 4732
 
31886 tejbeer 4733
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + monthlyTarget.getPurchaseAchievement() + "</td>\n");
31218 tejbeer 4734
 
31697 amit.gupta 4735
                    sb.append("</tr>\n");
31218 tejbeer 4736
 
31697 amit.gupta 4737
                }
31218 tejbeer 4738
 
32350 amit.gupta 4739
                this.sendMailOfHtmlFormat(googleMailSender, new String[]{email}, sb.toString(), null, subject);
31697 amit.gupta 4740
                // this.sendMailOfHtmlFormat("tejbeer.kaur@smartdukaan.com", sb.toString(),
4741
                // null, subject);
31218 tejbeer 4742
 
31697 amit.gupta 4743
            }
31604 tejbeer 4744
 
31697 amit.gupta 4745
        }
31604 tejbeer 4746
 
31697 amit.gupta 4747
    }
31604 tejbeer 4748
 
32061 amit.gupta 4749
    @Autowired
4750
    private PerformanceService performanceService;
4751
 
4752
 
4753
    public void sendFilteredRetailerPerformance() throws Exception {
4754
        RetailerFilterModel retailerFilterModel = performanceService.getRetailerFilterModel();
4755
 
4756
        Map<Integer, CustomRetailer> customRetailers = retailerService.getFofoRetailers(true);
4757
 
4758
 
4759
        List<RetailerPeformanceFilterModel> partnersPerformance = performanceService.getPerformance(retailerFilterModel, customRetailers);
4760
 
4761
        Map<Integer, RetailerPeformanceFilterModel> partnersPerformanceMap = new HashMap<>();
4762
 
4763
        if (!partnersPerformance.isEmpty()) {
4764
            partnersPerformanceMap = partnersPerformance.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
4765
            performanceService.sendPartnerPerformanceEmail(partnersPerformanceMap, retailerFilterModel, customRetailers);
4766
 
4767
        }
4768
 
4769
 
4770
    }
4771
 
32081 tejbeer 4772
    @Autowired
4773
    private VendorItemPricingRepository vendorItemPricingRepository;
32061 amit.gupta 4774
 
32081 tejbeer 4775
 
4776
    @Autowired
4777
    private VendorCatalogPricingService vendorCatalogPricingService;
4778
 
4779
 
33256 amit.gupta 4780
    public void migrateVendorItemPricing() throws ProfitMandiBusinessException {
32081 tejbeer 4781
 
4782
        List<VendorItemPricing> vendorItemPricings = vendorItemPricingRepository.selectAll();
32350 amit.gupta 4783
        LOGGER.info("At migrate VendorItemPricing");
32092 tejbeer 4784
        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 4785
        for (VendorItemPricing vendorItemPricing : vendorItemPricings) {
4786
            Item item = null;
32092 tejbeer 4787
            if (items.get(vendorItemPricing.getItemId()) != null) {
4788
                item = items.get(vendorItemPricing.getItemId());
4789
            } else {
32084 tejbeer 4790
                continue;
32081 tejbeer 4791
            }
32092 tejbeer 4792
 
32081 tejbeer 4793
            VendorCatalogPricingModel vendorCatalogPricingModel = new VendorCatalogPricingModel();
4794
            vendorCatalogPricingModel.setCatalogId(item.getCatalogItemId());
4795
            vendorCatalogPricingModel.setAuthId(13);
32088 tejbeer 4796
            vendorCatalogPricingModel.setDp(vendorItemPricing.getDp());
32081 tejbeer 4797
 
4798
            vendorCatalogPricingModel.setTp(vendorItemPricing.getTp());
4799
            vendorCatalogPricingModel.setMop(vendorItemPricing.getMop());
32384 amit.gupta 4800
            vendorCatalogPricingModel.setEffectedOn(LocalDate.of(2023, 8, 22));
32081 tejbeer 4801
            vendorCatalogPricingModel.setVendorId(vendorItemPricing.getVendorId());
4802
 
4803
 
4804
            try {
4805
                vendorCatalogPricingService.createVendorCatalogPricingLog(vendorCatalogPricingModel);
4806
            } catch (ProfitMandiBusinessException e) {
4807
                continue;
4808
            }
4809
 
4810
        }
4811
 
4812
    }
4813
 
4814
    public void approveVendorCatalogPricing() {
4815
        List<VendorCatalogPricingLog> vendorCatalogPricingLogs = vendorCatalogPricingLogRepository.selectByStatus(VendorCatalogPricingStatus.PENDING);
4816
 
32084 tejbeer 4817
 
32081 tejbeer 4818
        for (VendorCatalogPricingLog vendorCatalogPricingLog : vendorCatalogPricingLogs) {
32107 tejbeer 4819
            vendorCatalogPricingLog.setStatus(VendorCatalogPricingStatus.APPROVED);
4820
            vendorCatalogPricingLog.setUpdatedTimestamp(LocalDateTime.now());
4821
            vendorCatalogPricingLog.setApprovedBy(13);
4822
            vendorCatalogPricingLog.setApprovedTimestamp(LocalDateTime.now());
32114 tejbeer 4823
            vendorCatalogPricingService.createVendorCatalogPricing(vendorCatalogPricingLog);
4824
        }
32081 tejbeer 4825
 
32114 tejbeer 4826
    }
32108 tejbeer 4827
 
32822 ranu 4828
    public void sendMailWhatsAppAfterLoanDueDate() throws Exception {
4829
        sdCreditService.updateRisk();
4830
        List<Loan> defaultLoans = sdCreditService.getLoanALert();
4831
        if (!defaultLoans.isEmpty()) {
4832
            this.sendLoanAlert(defaultLoans);
4833
        }
32108 tejbeer 4834
 
32822 ranu 4835
 
4836
    }
4837
 
4838
    public void sendLoanAlert(List<Loan> defaultLoans) throws
4839
            Exception {
4840
 
4841
        List<Integer> categoryIds = Arrays.asList(
4842
                ProfitMandiConstants.TICKET_CATEGORY_CATEGORY,
4843
                ProfitMandiConstants.TICKET_CATEGORY_RBM,
4844
                ProfitMandiConstants.TICKET_CATEGORY_SALES,
4845
                ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS,
4846
                ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT);
4847
 
4848
        /*for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false).entrySet()) {
4849
            List<Loan> filteredRows = defaultLoans.stream()
4850
                    .filter(loan -> storeGuyEntry.getValue().contains(loan.getFofoId()))
4851
                    .collect(Collectors.toList());
4852
 
4853
            if (!filteredRows.isEmpty()) {
4854
                for (Loan defaultLoan : filteredRows) {
4855
                    List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
4856
                    double amount = loanStatements.stream().map(LoanStatement::getAmount).collect(Collectors.summingDouble(BigDecimal::doubleValue));
4857
                    String messageText = getMessageForDueDateExtend(defaultLoan,amount);
4858
                   // String[] email = new String[]{storeGuyEntry.getKey()};
33820 ranu 4859
 
32822 ranu 4860
                    sendMailOfHtmlFormat(mailSender, email, messageText, null, subject);
4861
 
4862
                }
4863
            }
4864
        }*/
32842 amit.gupta 4865
        //Send single whatsapp to tv
4866
        String title = "SD Credit Alert!";
32850 amit.gupta 4867
        boolean notYetSent = true;
32822 ranu 4868
        for (Loan defaultLoan : defaultLoans) {
4869
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
4870
 
4871
            double amount = loanStatements.stream().map(LoanStatement::getAmount).collect(Collectors.summingDouble(BigDecimal::doubleValue));
4872
 
4873
            com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(defaultLoan.getFofoId());
4874
 
4875
            Address address = addressRepository.selectById(user.getAddressId());
4876
 
32842 amit.gupta 4877
            //String url = "http://app.smartdukaan.com/pages/home/credit";
32822 ranu 4878
 
32842 amit.gupta 4879
            String message = getMessageForDueDateExtend(defaultLoan, amount);
4880
            String whatsAppMessage = getWhatsAppMessageForDueDateExtend(defaultLoan, amount);
32948 amit.gupta 4881
            if (whatsAppMessage != null) {
32850 amit.gupta 4882
                notificationService.sendWhatsappMessage(whatsAppMessage, title, address.getPhoneNumber());
32948 amit.gupta 4883
                if (notYetSent) {
32850 amit.gupta 4884
                    notificationService.sendWhatsappMessage(whatsAppMessage, title, "9911565032");
4885
                    notYetSent = false;
4886
                }
4887
            }
4888
 
32822 ranu 4889
            String[] email = {user.getEmailId()};
4890
            sendMailOfHtmlFormat(mailSender, email, message, null, "Loan Alert - SmartDukaan");
4891
        }
4892
    }
4893
 
4894
    private String getMessageForDueDateExtend(Loan defaultLoan, double amount) throws ProfitMandiBusinessException {
4895
 
4896
        double absoluteAmount = Math.abs(amount);
4897
        long roundedAmount = Math.round(absoluteAmount);
4898
        String formattedAmount = (amount < 0) ? "" + roundedAmount : "" + roundedAmount;
4899
 
4900
        LocalDate dueDate = defaultLoan.getDueDate().toLocalDate();
4901
        LocalDate defaultDate = defaultLoan.getDueDate().toLocalDate().plusDays(15);
4902
 
4903
        // Retrieve the name of the user associated with the loan
4904
        String name = userUserRepository.selectById(defaultLoan.getFofoId()).getName();
4905
 
4906
        // Initialize a StringBuilder to construct the HTML message
4907
        StringBuilder sb = new StringBuilder();
4908
 
32842 amit.gupta 4909
        if (LocalDate.now().isBefore(dueDate)) {
4910
            long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), defaultLoan.getDueDate().toLocalDate());
32822 ranu 4911
            String payDate = defaultLoan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
4912
            // 5 Days Before Due Date - daily
4913
            if (noOfdaysBetween <= 5) {
4914
                sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br><p>Dear " + name + "</p>");
4915
                sb.append("<p>This is a friendly reminder that your loan payment is due in " + noOfdaysBetween + "days, on " +
4916
                        payDate +
4917
                        ". Please ensure that the payment is made on time to avoid any late fees or penalties.</p>");
4918
                sb.append("<p>As per the terms of your loan agreement, the total amount due is Rs. " + formattedAmount + ". " +
4919
                        "You can make the payment by adding money to your wallet. If you have any questions or need assistance, " +
4920
                        "our customer service team is available to help you.</p>");
4921
                sb.append("<p>Thank you for your cooperation and prompt attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
4922
            }
32842 amit.gupta 4923
        } else if (LocalDate.now().isBefore(defaultDate)) {
32822 ranu 4924
            long noOfdaysBetween = ChronoUnit.DAYS.between(defaultDate, LocalDate.now());
4925
 
4926
            // After Due Date – Alternate days
4927
            if ((noOfdaysBetween % 2 == 0) && (noOfdaysBetween > 5)) {
4928
                sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br><p>Dear " + name + "</p>");
4929
                sb.append("<p>We would like to remind you that your payment for the outstanding balance on your account is now overdue. " +
4930
                        "As per our terms and conditions, a higher interest rate will be levied on the overdue amount Rs. " + formattedAmount + ".</p>");
4931
                sb.append("<p>To avoid further charges and any negative impact on your CIBIL score, we kindly request that you settle the " +
4932
                        "outstanding balance as soon as possible.</p>");
4933
                sb.append("<p>Thank you for your attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
4934
            }
4935
            // 5 Days before default - daily
32842 amit.gupta 4936
            if (noOfdaysBetween <= 5) {
32822 ranu 4937
                sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br>");
4938
                sb.append("<p>Attention: High Alert</p>");
4939
                sb.append("<p>Dear " + name + "</p>");
4940
                sb.append("<p>This is to inform you that the due date for your payment of Rs. " + formattedAmount + " has been crossed, " +
4941
                        "and you are approaching the default date on " + defaultDate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")) + ". " +
4942
                        "Please be aware that this will have a significant impact on your CIBIL score and may result in substantial penalties as well.</p>");
4943
                sb.append("<p>To rectify this situation, it is imperative that you take immediate action. " +
4944
                        "Please make the necessary payment immediately to avoid further consequences.</p>");
4945
                sb.append("<p>Thank you for your attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
4946
            }
32842 amit.gupta 4947
        } else {
32822 ranu 4948
            // Post Default - Daily
32842 amit.gupta 4949
            sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br><p>Dear " + name + "</p>");
4950
            sb.append("<p>We regret to inform you that you are currently in loan default. As a result, " +
4951
                    "higher penalties are being charged, which is also negatively impacting your CIBIL score. " +
4952
                    "It is imperative that you make an immediate payment to rectify this situation.</p>");
4953
            sb.append("<p>Please note that failing to make the payment promptly will result in further consequences, " +
4954
                    "including potential legal action and additional financial penalties. " +
4955
                    "We strongly urge you to take this matter seriously and settle the outstanding amount as soon as possible.</p>");
4956
            sb.append("<p>To make the payment, please add Rs. " + formattedAmount + " to your wallet. We are here to help you resolve this issue and get back on track.</p>");
4957
            sb.append("<p>Thank you for your attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
32822 ranu 4958
 
4959
        }
4960
 
4961
        // Return the constructed HTML message
4962
        sb.append("</body></html>");
4963
        return sb.toString();
4964
    }
4965
 
4966
    private String getWhatsAppMessageForDueDateExtend(Loan defaultLoan, double amount) throws ProfitMandiBusinessException {
4967
 
4968
        double absoluteAmount = Math.abs(amount);
4969
        long roundedAmount = Math.round(absoluteAmount);
4970
        String formattedAmount = (amount < 0) ? "" + roundedAmount : "" + roundedAmount;
4971
 
4972
        LocalDate dueDate = defaultLoan.getDueDate().toLocalDate();
4973
        LocalDate defaultDate = defaultLoan.getDueDate().toLocalDate().plusDays(15);
4974
 
4975
        // Retrieve the name of the user associated with the loan
4976
        String name = userUserRepository.selectById(defaultLoan.getFofoId()).getName();
4977
 
4978
        // Initialize a StringBuilder to construct the HTML message
4979
        String message = null;
4980
 
32842 amit.gupta 4981
        if (LocalDate.now().isBefore(dueDate)) {
32822 ranu 4982
            long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), defaultLoan.getDueDate().toLocalDate());
4983
            String payDate = defaultLoan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
4984
            // 5 Days Before Due Date - daily
4985
            if (noOfdaysBetween <= 5) {
4986
 
4987
                message = "Dear %s, This is a friendly reminder that your loan payment is due in %d days, on %s.\n" +
4988
                        "\n" +
4989
                        "Please ensure that the payment is made on time to avoid any late fees or penalties.As per the terms of your loan agreement, the total amount due is Rs. %s. You can make the payment by adding money to wallet.\n" +
4990
                        "\n" +
4991
                        "If you have any questions or need assistance, our customer service team is available to help you.\n" +
4992
                        "Thank you for your cooperation and prompt attention to this matter.\n" +
4993
                        "\n" +
4994
                        "Team SmartDukaan";
32842 amit.gupta 4995
                message = String.format(message, name, noOfdaysBetween, payDate, formattedAmount);
4996
            }
4997
        } else if (LocalDate.now().isBefore(defaultDate)) {
32822 ranu 4998
            long noOfdaysBetween = ChronoUnit.DAYS.between(defaultDate, LocalDate.now());
4999
            // After Due Date – Alternate days
5000
            if ((noOfdaysBetween % 2 == 0) && (noOfdaysBetween > 5)) {
5001
                message = "Dear %s, We would like to remind you that your payment for the outstanding balance on your account is now overdue. \n" +
5002
                        "As per our terms and conditions, a higher interest rate will be levied on the overdue amount Rs.%s.\n" +
5003
                        "To avoid further charges and any negative impact on your CIBIL score, we kindly request that you settle the outstanding balance as soon as possible.\n" +
5004
                        "Thank you for your attention to this matter. \n" +
5005
                        "\n" +
5006
                        "Team SmartDukaan";
5007
                message = String.format(message, name, formattedAmount);
5008
            }
5009
            // 5 Days before default - daily
32842 amit.gupta 5010
            if (noOfdaysBetween <= 5) {
32822 ranu 5011
                String defaultPayDate = defaultDate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
5012
                message = "Attention: High Alert!! Dear %s, \n" +
5013
                        "\n" +
5014
                        "This is to inform you that the due date for your payment of Rs. %s has been crossed, and as a result, you are now about to reach default date %s.\n" +
5015
                        "Please be aware that this will have a significant impact on your CIBIL score and may result in substantial penalties as well. To rectify this situation, it is imperative that you take immediate action.\n" +
5016
                        "\n" +
5017
                        "Please make the necessary payment immediately to avoid further consequences. Thank you for your attention to this matter.\n" +
5018
                        "\n" +
5019
                        "Team SmartDukaan";
5020
                message = String.format(message, name, formattedAmount, defaultPayDate);
5021
            }
32842 amit.gupta 5022
        } else {
32822 ranu 5023
            // Post Default - Daily
5024
            message = "Dear %s, We regret to inform you that you are currently in loan default. As a result, higher penalties are being charged, which is also negatively impacting your CIBIL score. \n" +
5025
                    "\n" +
5026
                    "It is imperative that you make an immediate payment to rectify this situation. \n" +
5027
                    "\n" +
5028
                    "Please note that failing to make the payment promptly will result in further consequences, including potential legal action and additional financial penalties. \n" +
5029
                    "\n" +
5030
                    "We strongly urge you to take this matter seriously and settle the outstanding amount as soon as possible. \n" +
5031
                    "\n" +
5032
                    "To make the payment, please add Rs. %s  to wallet. We are here to help you resolve this issue and get back on track. Thank you for your attention to this matter. \n" +
5033
                    "\n" +
5034
                    "Team SmartDukaan";
5035
            message = String.format(message, name, formattedAmount);
5036
 
5037
        }
5038
        // Return the constructed HTML message
5039
        return message;
5040
    }
5041
 
32210 jai.hind 5042
}
33664 amit.gupta 5043
// 2284"