Subversion Repositories SmartDukaan

Rev

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

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