Subversion Repositories SmartDukaan

Rev

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