Subversion Repositories SmartDukaan

Rev

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