Subversion Repositories SmartDukaan

Rev

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

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