diff --git a/pom.xml b/pom.xml
index a2b98a2..85726b4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -161,14 +161,29 @@
0.12.3
runtime
+
+
+ org.projectlombok
+ lombok
+ true
+
-
- org.springframework.boot
- spring-boot-maven-plugin
-
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+
diff --git a/src/main/java/kz/konturai/parser/dto/MarketingAnalysisRequest.java b/src/main/java/kz/konturai/parser/dto/MarketingAnalysisRequest.java
index c5153d0..ee54279 100644
--- a/src/main/java/kz/konturai/parser/dto/MarketingAnalysisRequest.java
+++ b/src/main/java/kz/konturai/parser/dto/MarketingAnalysisRequest.java
@@ -10,10 +10,16 @@ import kz.konturai.parser.validator.ValidAnalysisType;
import kz.konturai.parser.validator.ValidDetailLevel;
import kz.konturai.parser.validator.ValidRegion;
import kz.konturai.parser.validator.ValidTargetAudience;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Map;
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
public class MarketingAnalysisRequest {
@NotBlank(message = "Поле 'businessNiche' обязательно для заполнения")
@@ -52,98 +58,9 @@ public class MarketingAnalysisRequest {
@ValidAnalysisType(message = "Поле 'analysisType' должно содержать один или несколько типов: РЫНОК, КОНКУРЕНТЫ, ЦА, КАНАЛЫ, SWOT")
private List analysisType;
- public MarketingAnalysisRequest() {
- }
-
- public MarketingAnalysisRequest(String businessNiche, String product, Map targetAudience, List region,
- String goal, String detailLevel, String strongSide, String weakSide, List analysisType) {
- this.businessNiche = businessNiche;
- this.product = product;
- this.targetAudience = targetAudience;
- this.region = region;
- this.goal = goal;
- this.detailLevel = detailLevel;
- this.strongSide = strongSide;
- this.weakSide = weakSide;
- this.analysisType = analysisType;
- }
-
- public String getBusinessNiche() {
- return businessNiche;
- }
-
- public void setBusinessNiche(String businessNiche) {
- this.businessNiche = businessNiche;
- }
-
- public String getProduct() {
- return product;
- }
-
- public void setProduct(String product) {
- this.product = product;
- }
-
- public Map getTargetAudience() {
- return targetAudience;
- }
-
- public void setTargetAudience(Map targetAudience) {
- this.targetAudience = targetAudience;
- }
-
- public List getRegion() {
- return region;
- }
-
- public void setRegion(List region) {
- this.region = region;
- }
-
- public String getGoal() {
- return goal;
- }
-
- public void setGoal(String goal) {
- this.goal = goal;
- }
-
- public String getDetailLevel() {
- return detailLevel;
- }
-
- public void setDetailLevel(String detailLevel) {
- this.detailLevel = detailLevel;
- }
-
public DetailLevel getDetailLevelEnum() {
return DetailLevel.fromString(detailLevel);
}
-
- public String getStrongSide() {
- return strongSide;
- }
-
- public void setStrongSide(String strongSide) {
- this.strongSide = strongSide;
- }
-
- public String getWeakSide() {
- return weakSide;
- }
-
- public void setWeakSide(String weakSide) {
- this.weakSide = weakSide;
- }
-
- public List getAnalysisType() {
- return analysisType;
- }
-
- public void setAnalysisType(List analysisType) {
- this.analysisType = analysisType;
- }
-
public List getAnalysisTypeEnums() {
if (analysisType == null) {
return List.of();
diff --git a/src/main/java/kz/konturai/parser/dto/MarketingAnalysisResponseV2.java b/src/main/java/kz/konturai/parser/dto/MarketingAnalysisResponseV2.java
index 3b1c734..c513932 100644
--- a/src/main/java/kz/konturai/parser/dto/MarketingAnalysisResponseV2.java
+++ b/src/main/java/kz/konturai/parser/dto/MarketingAnalysisResponseV2.java
@@ -2,10 +2,14 @@ package kz.konturai.parser.dto;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
+import lombok.Getter;
+import lombok.Setter;
import java.util.List;
import java.util.Map;
+@Setter
+@Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class MarketingAnalysisResponseV2 {
@@ -13,33 +17,8 @@ public class MarketingAnalysisResponseV2 {
private Sections sections;
private List sources;
- public MarketingAnalysisResponseV2() {
- }
-
- public MarketingAnalysisResponseV2(String reportTitle, Sections sections) {
- this.reportTitle = reportTitle;
- this.sections = sections;
- }
-
- public String getReportTitle() {
- return reportTitle;
- }
-
- public void setReportTitle(String reportTitle) {
- this.reportTitle = reportTitle;
- }
-
- public Sections getSections() {
- return sections;
- }
-
- public void setSections(Sections sections) {
- this.sections = sections;
- }
-
- public void setSources(List sources) { this.sources = sources; }
- public List getSources() { return sources; }
-
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class Sections {
private MarketOverview marketOverview;
@@ -55,79 +34,10 @@ public class MarketingAnalysisResponseV2 {
public Sections() {
}
- public MarketOverview getMarketOverview() {
- return marketOverview;
- }
-
- public void setMarketOverview(MarketOverview marketOverview) {
- this.marketOverview = marketOverview;
- }
-
- public TargetAudience getTargetAudience() {
- return targetAudience;
- }
-
- public void setTargetAudience(TargetAudience targetAudience) {
- this.targetAudience = targetAudience;
- }
-
- public CompetitiveEnvironment getCompetitiveEnvironment() {
- return competitiveEnvironment;
- }
-
- public void setCompetitiveEnvironment(CompetitiveEnvironment competitiveEnvironment) {
- this.competitiveEnvironment = competitiveEnvironment;
- }
-
- public DemandAndBehavior getDemandAndBehavior() {
- return demandAndBehavior;
- }
-
- public void setDemandAndBehavior(DemandAndBehavior demandAndBehavior) {
- this.demandAndBehavior = demandAndBehavior;
- }
-
- public CustomerJourney getCustomerJourney() {
- return customerJourney;
- }
-
- public void setCustomerJourney(CustomerJourney customerJourney) {
- this.customerJourney = customerJourney;
- }
-
- public AcquisitionChannels getAcquisitionChannels() {
- return acquisitionChannels;
- }
-
- public void setAcquisitionChannels(AcquisitionChannels acquisitionChannels) {
- this.acquisitionChannels = acquisitionChannels;
- }
-
- public MarketingEconomics getMarketingEconomics() {
- return marketingEconomics;
- }
-
- public void setMarketingEconomics(MarketingEconomics marketingEconomics) {
- this.marketingEconomics = marketingEconomics;
- }
-
- public Bottlenecks getBottlenecks() {
- return bottlenecks;
- }
-
- public void setBottlenecks(Bottlenecks bottlenecks) {
- this.bottlenecks = bottlenecks;
- }
-
- public Recommendations getRecommendations() {
- return recommendations;
- }
-
- public void setRecommendations(Recommendations recommendations) {
- this.recommendations = recommendations;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class MarketOverview {
private String title;
@@ -139,47 +49,10 @@ public class MarketingAnalysisResponseV2 {
public MarketOverview() {
}
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public MarketOverviewMetrics getMetrics() {
- return metrics;
- }
-
- public void setMetrics(MarketOverviewMetrics metrics) {
- this.metrics = metrics;
- }
-
- public MonthlyOnlineIndex getMonthlyOnlineIndex() {
- return monthlyOnlineIndex;
- }
-
- public void setMonthlyOnlineIndex(MonthlyOnlineIndex monthlyOnlineIndex) {
- this.monthlyOnlineIndex = monthlyOnlineIndex;
- }
-
- public Map getGeography() {
- return geography;
- }
-
- public void setGeography(Map geography) {
- this.geography = geography;
- }
-
- public String getConclusion() {
- return conclusion;
- }
-
- public void setConclusion(String conclusion) {
- this.conclusion = conclusion;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class MarketOverviewMetrics {
private String onlineDemandIndex;
@@ -191,47 +64,10 @@ public class MarketingAnalysisResponseV2 {
public MarketOverviewMetrics() {
}
- public String getOnlineDemandIndex() {
- return onlineDemandIndex;
- }
-
- public void setOnlineDemandIndex(String onlineDemandIndex) {
- this.onlineDemandIndex = onlineDemandIndex;
- }
-
- public String getOnlinePotential() {
- return onlinePotential;
- }
-
- public void setOnlinePotential(String onlinePotential) {
- this.onlinePotential = onlinePotential;
- }
-
- public String getDemandGrowthRateYoy() {
- return demandGrowthRateYoy;
- }
-
- public void setDemandGrowthRateYoy(String demandGrowthRateYoy) {
- this.demandGrowthRateYoy = demandGrowthRateYoy;
- }
-
- public String getSeasonalityCoefficientSpring() {
- return seasonalityCoefficientSpring;
- }
-
- public void setSeasonalityCoefficientSpring(String seasonalityCoefficientSpring) {
- this.seasonalityCoefficientSpring = seasonalityCoefficientSpring;
- }
-
- public String getSeasonalityRange() {
- return seasonalityRange;
- }
-
- public void setSeasonalityRange(String seasonalityRange) {
- this.seasonalityRange = seasonalityRange;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class MonthlyOnlineIndex {
private Double january;
@@ -250,103 +86,10 @@ public class MarketingAnalysisResponseV2 {
public MonthlyOnlineIndex() {
}
- public Double getJanuary() {
- return january;
- }
-
- public void setJanuary(Double january) {
- this.january = january;
- }
-
- public Double getFebruary() {
- return february;
- }
-
- public void setFebruary(Double february) {
- this.february = february;
- }
-
- public Double getMarch() {
- return march;
- }
-
- public void setMarch(Double march) {
- this.march = march;
- }
-
- public Double getApril() {
- return april;
- }
-
- public void setApril(Double april) {
- this.april = april;
- }
-
- public Double getMay() {
- return may;
- }
-
- public void setMay(Double may) {
- this.may = may;
- }
-
- public Double getJune() {
- return june;
- }
-
- public void setJune(Double june) {
- this.june = june;
- }
-
- public Double getJuly() {
- return july;
- }
-
- public void setJuly(Double july) {
- this.july = july;
- }
-
- public Double getAugust() {
- return august;
- }
-
- public void setAugust(Double august) {
- this.august = august;
- }
-
- public Double getSeptember() {
- return september;
- }
-
- public void setSeptember(Double september) {
- this.september = september;
- }
-
- public Double getOctober() {
- return october;
- }
-
- public void setOctober(Double october) {
- this.october = october;
- }
-
- public Double getNovember() {
- return november;
- }
-
- public void setNovember(Double november) {
- this.november = november;
- }
-
- public Double getDecember() {
- return december;
- }
-
- public void setDecember(Double december) {
- this.december = december;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class TargetAudience {
private String title;
@@ -360,50 +103,10 @@ public class MarketingAnalysisResponseV2 {
public TargetAudience() {
}
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public TargetAudienceMetrics getMetrics() {
- return metrics;
- }
-
- public void setMetrics(TargetAudienceMetrics metrics) {
- this.metrics = metrics;
- }
-
- public List getSegments() {
- return segments;
- }
-
- public void setSegments(List segments) {
- this.segments = segments;
- }
-
- public Map getAgeStructure() {
- return ageStructure;
- }
-
- public void setAgeStructure(Map ageStructure) {
- this.ageStructure = ageStructure;
- }
-
- public String getConclusion() {
- return conclusion;
- }
-
- public void setConclusion(String conclusion) {
- this.conclusion = conclusion;
- }
-
- public Map getIncomeByAge() { return incomeByAge; }
- public void setIncomeByAge(Map incomeByAge) { this.incomeByAge = incomeByAge; }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class TargetAudienceMetrics {
private String totalAudienceSize;
@@ -413,31 +116,10 @@ public class MarketingAnalysisResponseV2 {
public TargetAudienceMetrics() {
}
- public String getTotalAudienceSize() {
- return totalAudienceSize;
- }
-
- public void setTotalAudienceSize(String totalAudienceSize) {
- this.totalAudienceSize = totalAudienceSize;
- }
-
- public String getLeadingSegmentShare() {
- return leadingSegmentShare;
- }
-
- public void setLeadingSegmentShare(String leadingSegmentShare) {
- this.leadingSegmentShare = leadingSegmentShare;
- }
-
- public String getAboveAverageIncomeShare() {
- return aboveAverageIncomeShare;
- }
-
- public void setAboveAverageIncomeShare(String aboveAverageIncomeShare) {
- this.aboveAverageIncomeShare = aboveAverageIncomeShare;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class AudienceSegment {
private String name;
@@ -451,23 +133,10 @@ public class MarketingAnalysisResponseV2 {
this.share = share;
}
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getShare() {
- return share;
- }
-
- public void setShare(String share) {
- this.share = share;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class CompetitiveEnvironment {
private String title;
@@ -479,47 +148,10 @@ public class MarketingAnalysisResponseV2 {
public CompetitiveEnvironment() {
}
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public CompetitiveEnvironmentMetrics getMetrics() {
- return metrics;
- }
-
- public void setMetrics(CompetitiveEnvironmentMetrics metrics) {
- this.metrics = metrics;
- }
-
- public Map getDigitalVisibilityBenchmarks() {
- return digitalVisibilityBenchmarks;
- }
-
- public void setDigitalVisibilityBenchmarks(Map digitalVisibilityBenchmarks) {
- this.digitalVisibilityBenchmarks = digitalVisibilityBenchmarks;
- }
-
- public Map> getCompetitorStrengths() {
- return competitorStrengths;
- }
-
- public void setCompetitorStrengths(Map> competitorStrengths) {
- this.competitorStrengths = competitorStrengths;
- }
-
- public String getConclusion() {
- return conclusion;
- }
-
- public void setConclusion(String conclusion) {
- this.conclusion = conclusion;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class CompetitiveEnvironmentMetrics {
private String marketShareTraffic;
@@ -530,39 +162,10 @@ public class MarketingAnalysisResponseV2 {
public CompetitiveEnvironmentMetrics() {
}
- public String getMarketShareTraffic() {
- return marketShareTraffic;
- }
-
- public void setMarketShareTraffic(String marketShareTraffic) {
- this.marketShareTraffic = marketShareTraffic;
- }
-
- public String getVisibilityRank() {
- return visibilityRank;
- }
-
- public void setVisibilityRank(String visibilityRank) {
- this.visibilityRank = visibilityRank;
- }
-
- public String getCompetitorShareInContextAds() {
- return competitorShareInContextAds;
- }
-
- public void setCompetitorShareInContextAds(String competitorShareInContextAds) {
- this.competitorShareInContextAds = competitorShareInContextAds;
- }
-
- public String getBenchmarkAstana() {
- return benchmarkAstana;
- }
-
- public void setBenchmarkAstana(String benchmarkAstana) {
- this.benchmarkAstana = benchmarkAstana;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class DemandAndBehavior {
private String title;
@@ -575,55 +178,10 @@ public class MarketingAnalysisResponseV2 {
public DemandAndBehavior() {
}
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public DemandAndBehaviorMetrics getMetrics() {
- return metrics;
- }
-
- public void setMetrics(DemandAndBehaviorMetrics metrics) {
- this.metrics = metrics;
- }
-
- public Map getSearchQueryTypes() {
- return searchQueryTypes;
- }
-
- public void setSearchQueryTypes(Map searchQueryTypes) {
- this.searchQueryTypes = searchQueryTypes;
- }
-
- public Map getDecisionFactors() {
- return decisionFactors;
- }
-
- public void setDecisionFactors(Map decisionFactors) {
- this.decisionFactors = decisionFactors;
- }
-
- public Map getReasonsForRefusal() {
- return reasonsForRefusal;
- }
-
- public void setReasonsForRefusal(Map reasonsForRefusal) {
- this.reasonsForRefusal = reasonsForRefusal;
- }
-
- public String getConclusion() {
- return conclusion;
- }
-
- public void setConclusion(String conclusion) {
- this.conclusion = conclusion;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class DemandAndBehaviorMetrics {
private String searchVolumeGrowth;
@@ -633,31 +191,10 @@ public class MarketingAnalysisResponseV2 {
public DemandAndBehaviorMetrics() {
}
- public String getSearchVolumeGrowth() {
- return searchVolumeGrowth;
- }
-
- public void setSearchVolumeGrowth(String searchVolumeGrowth) {
- this.searchVolumeGrowth = searchVolumeGrowth;
- }
-
- public String getInteractionsBeforePurchase() {
- return interactionsBeforePurchase;
- }
-
- public void setInteractionsBeforePurchase(String interactionsBeforePurchase) {
- this.interactionsBeforePurchase = interactionsBeforePurchase;
- }
-
- public String getRepeatRefusalProbability() {
- return repeatRefusalProbability;
- }
-
- public void setRepeatRefusalProbability(String repeatRefusalProbability) {
- this.repeatRefusalProbability = repeatRefusalProbability;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class CustomerJourney {
private String title;
@@ -669,47 +206,10 @@ public class MarketingAnalysisResponseV2 {
public CustomerJourney() {
}
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public FunnelMetrics getFunnelMetrics() {
- return funnelMetrics;
- }
-
- public void setFunnelMetrics(FunnelMetrics funnelMetrics) {
- this.funnelMetrics = funnelMetrics;
- }
-
- public ConversionRates getConversionRates() {
- return conversionRates;
- }
-
- public void setConversionRates(ConversionRates conversionRates) {
- this.conversionRates = conversionRates;
- }
-
- public FunnelBottlenecks getFunnelBottlenecks() {
- return funnelBottlenecks;
- }
-
- public void setFunnelBottlenecks(FunnelBottlenecks funnelBottlenecks) {
- this.funnelBottlenecks = funnelBottlenecks;
- }
-
- public String getConclusion() {
- return conclusion;
- }
-
- public void setConclusion(String conclusion) {
- this.conclusion = conclusion;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class FunnelMetrics {
private String adTraffic;
@@ -721,47 +221,10 @@ public class MarketingAnalysisResponseV2 {
public FunnelMetrics() {
}
- public String getAdTraffic() {
- return adTraffic;
- }
-
- public void setAdTraffic(String adTraffic) {
- this.adTraffic = adTraffic;
- }
-
- public String getSiteVisitors() {
- return siteVisitors;
- }
-
- public void setSiteVisitors(String siteVisitors) {
- this.siteVisitors = siteVisitors;
- }
-
- public Integer getLeads() {
- return leads;
- }
-
- public void setLeads(Integer leads) {
- this.leads = leads;
- }
-
- public Integer getBookings() {
- return bookings;
- }
-
- public void setBookings(Integer bookings) {
- this.bookings = bookings;
- }
-
- public Integer getPayments() {
- return payments;
- }
-
- public void setPayments(Integer payments) {
- this.payments = payments;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class ConversionRates {
private String leadToBooking;
@@ -771,31 +234,10 @@ public class MarketingAnalysisResponseV2 {
public ConversionRates() {
}
- public String getLeadToBooking() {
- return leadToBooking;
- }
-
- public void setLeadToBooking(String leadToBooking) {
- this.leadToBooking = leadToBooking;
- }
-
- public String getBookingToPayment() {
- return bookingToPayment;
- }
-
- public void setBookingToPayment(String bookingToPayment) {
- this.bookingToPayment = bookingToPayment;
- }
-
- public String getLeadToPaymentTotal() {
- return leadToPaymentTotal;
- }
-
- public void setLeadToPaymentTotal(String leadToPaymentTotal) {
- this.leadToPaymentTotal = leadToPaymentTotal;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class FunnelBottlenecks {
private String leadToBooking;
@@ -804,23 +246,10 @@ public class MarketingAnalysisResponseV2 {
public FunnelBottlenecks() {
}
- public String getLeadToBooking() {
- return leadToBooking;
- }
-
- public void setLeadToBooking(String leadToBooking) {
- this.leadToBooking = leadToBooking;
- }
-
- public String getBookingToPayment() {
- return bookingToPayment;
- }
-
- public void setBookingToPayment(String bookingToPayment) {
- this.bookingToPayment = bookingToPayment;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class AcquisitionChannels {
private String title;
@@ -832,47 +261,10 @@ public class MarketingAnalysisResponseV2 {
public AcquisitionChannels() {
}
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public AcquisitionChannelsMetrics getMetrics() {
- return metrics;
- }
-
- public void setMetrics(AcquisitionChannelsMetrics metrics) {
- this.metrics = metrics;
- }
-
- public Map getChannelShares() {
- return channelShares;
- }
-
- public void setChannelShares(Map channelShares) {
- this.channelShares = channelShares;
- }
-
- public Map getChannelEfficiency() {
- return channelEfficiency;
- }
-
- public void setChannelEfficiency(Map channelEfficiency) {
- this.channelEfficiency = channelEfficiency;
- }
-
- public String getConclusion() {
- return conclusion;
- }
-
- public void setConclusion(String conclusion) {
- this.conclusion = conclusion;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class AcquisitionChannelsMetrics {
private String searchTrafficShare;
@@ -882,31 +274,10 @@ public class MarketingAnalysisResponseV2 {
public AcquisitionChannelsMetrics() {
}
- public String getSearchTrafficShare() {
- return searchTrafficShare;
- }
-
- public void setSearchTrafficShare(String searchTrafficShare) {
- this.searchTrafficShare = searchTrafficShare;
- }
-
- public String getAverageLeadCost() {
- return averageLeadCost;
- }
-
- public void setAverageLeadCost(String averageLeadCost) {
- this.averageLeadCost = averageLeadCost;
- }
-
- public String getGrowthPotential() {
- return growthPotential;
- }
-
- public void setGrowthPotential(String growthPotential) {
- this.growthPotential = growthPotential;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class ChannelEfficiency {
private String cost;
@@ -920,100 +291,29 @@ public class MarketingAnalysisResponseV2 {
this.status = status;
}
- public String getCost() {
- return cost;
- }
-
- public void setCost(String cost) {
- this.cost = cost;
- }
-
- public String getStatus() {
- return status;
- }
-
- public void setStatus(String status) {
- this.status = status;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class MarketingEconomics {
private String title;
private MarketingEconomicsMetrics metrics;
private FinancialPerformance financialPerformance;
private String conclusion;
-
- public MarketingEconomics() {
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public MarketingEconomicsMetrics getMetrics() {
- return metrics;
- }
-
- public void setMetrics(MarketingEconomicsMetrics metrics) {
- this.metrics = metrics;
- }
-
- public FinancialPerformance getFinancialPerformance() {
- return financialPerformance;
- }
-
- public void setFinancialPerformance(FinancialPerformance financialPerformance) {
- this.financialPerformance = financialPerformance;
- }
-
- public String getConclusion() {
- return conclusion;
- }
-
- public void setConclusion(String conclusion) {
- this.conclusion = conclusion;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class MarketingEconomicsMetrics {
private String customerAcquisitionCostCac;
private String repeatSalesConversion;
private String roi;
-
- public MarketingEconomicsMetrics() {
- }
-
- public String getCustomerAcquisitionCostCac() {
- return customerAcquisitionCostCac;
- }
-
- public void setCustomerAcquisitionCostCac(String customerAcquisitionCostCac) {
- this.customerAcquisitionCostCac = customerAcquisitionCostCac;
- }
-
- public String getRepeatSalesConversion() {
- return repeatSalesConversion;
- }
-
- public void setRepeatSalesConversion(String repeatSalesConversion) {
- this.repeatSalesConversion = repeatSalesConversion;
- }
-
- public String getRoi() {
- return roi;
- }
-
- public void setRoi(String roi) {
- this.roi = roi;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class FinancialPerformance {
private MonthYearValue marketingExpenses;
@@ -1022,218 +322,60 @@ public class MarketingAnalysisResponseV2 {
private MonthYearValue revenueFromClient;
private MonthYearValue profitFromClient;
- public FinancialPerformance() {
- }
-
- public MonthYearValue getMarketingExpenses() {
- return marketingExpenses;
- }
-
- public void setMarketingExpenses(MonthYearValue marketingExpenses) {
- this.marketingExpenses = marketingExpenses;
- }
-
- public MonthYearValue getClients() {
- return clients;
- }
-
- public void setClients(MonthYearValue clients) {
- this.clients = clients;
- }
-
- public MonthYearValue getCac() {
- return cac;
- }
-
- public void setCac(MonthYearValue cac) {
- this.cac = cac;
- }
-
- public MonthYearValue getRevenueFromClient() {
- return revenueFromClient;
- }
-
- public void setRevenueFromClient(MonthYearValue revenueFromClient) {
- this.revenueFromClient = revenueFromClient;
- }
-
- public MonthYearValue getProfitFromClient() {
- return profitFromClient;
- }
-
- public void setProfitFromClient(MonthYearValue profitFromClient) {
- this.profitFromClient = profitFromClient;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class MonthYearValue {
private String month;
private String year;
- public MonthYearValue() {
- }
-
public MonthYearValue(String month, String year) {
this.month = month;
this.year = year;
}
- public String getMonth() {
- return month;
- }
-
- public void setMonth(String month) {
- this.month = month;
- }
-
- public String getYear() {
- return year;
- }
-
- public void setYear(String year) {
- this.year = year;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class Bottlenecks {
private String title;
private Map statistics;
private BottlenecksDetails details;
private String conclusion;
-
- public Bottlenecks() {
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public Map getStatistics() {
- return statistics;
- }
-
- public void setStatistics(Map statistics) {
- this.statistics = statistics;
- }
-
- public BottlenecksDetails getDetails() {
- return details;
- }
-
- public void setDetails(BottlenecksDetails details) {
- this.details = details;
- }
-
- public String getConclusion() {
- return conclusion;
- }
-
- public void setConclusion(String conclusion) {
- this.conclusion = conclusion;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class BottlenecksDetails {
private List landing;
private List leadManagement;
private List retention;
-
- public BottlenecksDetails() {
- }
-
- public List getLanding() {
- return landing;
- }
-
- public void setLanding(List landing) {
- this.landing = landing;
- }
-
- public List getLeadManagement() {
- return leadManagement;
- }
-
- public void setLeadManagement(List leadManagement) {
- this.leadManagement = leadManagement;
- }
-
- public List getRetention() {
- return retention;
- }
-
- public void setRetention(List retention) {
- this.retention = retention;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class Recommendations {
private String title;
private List corePillars;
private String conclusion;
-
- public Recommendations() {
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public List getCorePillars() {
- return corePillars;
- }
-
- public void setCorePillars(List corePillars) {
- this.corePillars = corePillars;
- }
-
- public String getConclusion() {
- return conclusion;
- }
-
- public void setConclusion(String conclusion) {
- this.conclusion = conclusion;
- }
}
+ @Setter
+ @Getter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class CorePillar {
private String strategy;
private String action;
-
- public CorePillar() {
- }
-
public CorePillar(String strategy, String action) {
this.strategy = strategy;
this.action = action;
}
- public String getStrategy() {
- return strategy;
- }
-
- public void setStrategy(String strategy) {
- this.strategy = strategy;
- }
-
- public String getAction() {
- return action;
- }
-
- public void setAction(String action) {
- this.action = action;
- }
}
}
diff --git a/src/main/java/kz/konturai/parser/service/MarketingAnalysisService.java b/src/main/java/kz/konturai/parser/service/MarketingAnalysisService.java
index 65b540e..0d2afeb 100644
--- a/src/main/java/kz/konturai/parser/service/MarketingAnalysisService.java
+++ b/src/main/java/kz/konturai/parser/service/MarketingAnalysisService.java
@@ -12,6 +12,7 @@ import kz.konturai.parser.model.MarketingAnalysis;
import kz.konturai.parser.model.MarketingAnalysisV2Document;
import kz.konturai.parser.repository.MarketingAnalysisRepository;
import kz.konturai.parser.repository.MarketingAnalysisV2Repository;
+import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
@@ -31,18 +32,20 @@ import jakarta.annotation.PostConstruct;
import org.springframework.web.reactive.function.client.WebClientResponseException;
@Service
+@RequiredArgsConstructor
public class MarketingAnalysisService {
private static final String KZ_MARKET_CONTEXT =
- "РОЛЬ: Ты — Партнер международной консалтинговой фирмы (Big 4: McKinsey/KPMG) с 50-летним опытом в маркетинге и стратегии.\n" +
- "Твоя специализация: Рынки Центральной Азии (особенно Казахстан).\n" +
- "СТИЛЬ: Уверенный, профессиональный, доказательный, без 'воды'. Используй термины (LTV, CAC, Retention, Unit-economics).\n" +
- "КОНТЕКСТ РЫНКА:\n" +
- "- Страна: Казахстан (Алматы, Астана, Шымкент - ключевые хабы).\n" +
- "- Валюта: Тенге (KZT). Все цены и доходы — только в тенге.\n" +
- "- Инфляция: Реальная потребительская инфляция ~10-12% (официальная ~8%).\n" +
- "- Поведение: Высокая роль Kaspi (QR, рассрочка 0-0-12), Instagram (витрина), WhatsApp (коммуникация).\n" +
- "- Менталитет: 'Уят' (репутация), семейные ценности, склонность к статусному потреблению, чувствительность к цене (акции).\n";
+ "РОЛЬ: Ты — Партнер международной консалтинговой фирмы (Big 4: McKinsey/BCG/PwC) с офисом в Алматы.\n" +
+ "СПЕЦИАЛИЗАЦИЯ: Глубокий анализ рынка Казахстана. Ты мыслишь в Тенге (KZT).\n" +
+ "ТВОИ ЗНАНИЯ О РЫНКЕ KZ (СТРОГИЕ ПРАВИЛА):\n" +
+ "1. SuperApps: Kaspi.kz — это экосистема №1 (Магазин, Travel, Gov, Платежи). Это главный канал продаж для товарки и услуг.\n" +
+ "2. Карты: 2GIS в Казахстане популярнее Google Maps для поиска услуг офлайн. Отзывы в 2GIS критически важны.\n" +
+ "3. Фитнес-рынок: Лидеры — 1Fit (единый абонемент, НЕ переводи это название), Invictus, World Class, FitnessBlitz.\n" +
+ "4. Соцсети: Instagram (Direct/Reels) и TikTok — главные каналы продаж. ВКонтакте и Threads — мертвы для коммерции в РК, ЗАПРЕЩЕНО их рекомендовать.\n" +
+ "5. Экономика: Реальная инфляция ~12-15%. Потребитель чувствителен к цене, любит рассрочки (Kaspi Red/Kredit).\n" +
+ "ВАЛЮТА: Только KZT. Округляй цифры до сотен (например, 15 000 KZT, а не 14 321).\n";
+
private static final String AI_MANDATORY_JSON_USAGE_WARNING = "ВНИМАНИЕ: Если в предоставленном JSON есть данные, ты ОБЯЗАН использовать их и вставить соответствующий тег [[CHART_...]]. "
+ "Никогда не пиши, что данных нет, если JSON не пустой.\n\n";
private static final String AI_ULTIMATE_JSON_PRESENCE_INSTRUCTION = ""
@@ -423,21 +426,6 @@ public class MarketingAnalysisService {
private Semaphore requestSemaphore;
- public MarketingAnalysisService(
- MarketingAnalysisRepository repository,
- MarketingAnalysisV2Repository v2Repository,
- OpenAIAnalyticsService openAIAnalyticsService,
- MinIOService minIOService,
- ResearchPdfService researchPdfService,
- SerperSearchService serperSearchService) {
- this.repository = repository;
- this.v2Repository = v2Repository;
- this.openAIAnalyticsService = openAIAnalyticsService;
- this.minIOService = minIOService;
- this.researchPdfService = researchPdfService;
- this.serperSearchService = serperSearchService;
- }
-
@PostConstruct
public void initializeSemaphore() {
this.requestSemaphore = new Semaphore(maxConcurrentRequests, true);
@@ -473,17 +461,14 @@ public class MarketingAnalysisService {
String topic = (niche != null && !niche.isBlank()) ? niche : (product != null ? product : "ниша");
- // Prefer the requested domains but keep query broad enough to return something.
String preferredSites = "(site:stat.gov.kz OR site:kapital.kz OR site:kursiv.media OR site:forbes.kz OR site:pwc.kz OR site:kpmg.kz)";
- // Added for real estate/auto context if needed
- String extraSites = "OR site:kolesa.kz OR site:krisha.kz OR site:market.kz OR site:hh.kz";
+ String retailSites = "site:2gis.kz OR site:kaspi.kz OR site:market.kz OR site:kolesa.kz OR site:krisha.kz OR site:chocofood.kz";
List