Subversion Repositories SmartDukaan

Rev

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