# palsuandoid-hub/analisa_pasar architecture

> Architecture diagram of the GitHub repository palsuandoid-hub/analisa_pasar, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-10-01). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/palsuandoid-hub/analisa_pasar
- Repository: https://github.com/palsuandoid-hub/analisa_pasar

## Overview

Analisa Pasar is a market-intelligence and decision-support system for Indonesian herbal products. Users enter needs, product data, observations, or CSV imports through the CLI or web UI; application use cases preserve evidence and product history, while analytics and scoring assess market opportunity, confidence, economics, missing data, and regulatory risk. The resulting decision and research tasks support monitoring or pilot choices. The README documents optional AI, but the sampled code does not show how it is invoked; several links below reflect SOURCE INDEX references rather than inspected call sites.

Main entry points: [`app/ui/app.py`](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/ui/app.py) (Web UI), [`app/data/repositories.py`](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/data/repositories.py) (Entity repositories), [`app/cli/main.py`](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/cli/main.py) (Command line), [`app/application/use_cases.py`](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/application/use_cases.py) (Application use cases)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["User interfaces"]
  node_cli["Command line<br/>[main.py]"]
  node_web["Web UI<br/>[app.py]"]
end

subgraph group_capture["Data capture"]
  node_usecases["Application use cases<br/>[use_cases.py]"]
  node_csv["CSV connector<br/>[csv_connector.py]"]
  node_manual["Manual connector"]
  node_raw["Raw payload archive<br/>[raw_storage.py]"]
end

subgraph group_analysis["Market analysis"]
  node_trend["Trend analysis<br/>[trend_engine.py]"]
  node_competition["Competition analysis"]
  node_matcher["Product matching<br/>[product_matcher.py]"]
  node_ai["AI provider abstraction<br/>[provider.py]"]
end

subgraph group_decision["Scoring and decisions"]
  node_opportunity["Opportunity scoring"]
  node_confidence["Confidence scoring"]
  node_economics["Economic analysis<br/>[economic_engine.py]"]
  node_missing["Missing-data detection"]
  node_decision_engine["Decision engine<br/>[decision_engine.py]"]
  node_research["Research tasks<br/>[research_engine.py]"]
end

subgraph group_persistence["Domain and storage"]
  node_domain["Market domain models<br/>[market.py]"]
  node_repositories["Entity repositories<br/>[repositories.py]"]
  node_database[("DuckDB<br/>[database.py]")]
  node_migrations["Schema migrations<br/>[migrations.py]"]
  node_config["Application configuration<br/>[config.py]"]
  node_evidence_models["Evidence and product models<br/>[evidence.py]"]
end

node_user(("Market analyst"))
node_ai_service(("AI service"))

node_user -->|"enters data"| node_cli
node_user -->|"uses"| node_web
node_cli -->|"invokes"| node_usecases
node_web -->|"invokes"| node_usecases
node_cli -->|"imports CSV"| node_csv
node_usecases -->|"normalizes imports"| node_csv
node_usecases -->|"accepts manual records"| node_manual
node_usecases -->|"stores raw payloads"| node_raw
node_raw -->|"records payload metadata"| node_database
node_usecases -->|"persists entities"| node_repositories
node_usecases -->|"creates market records"| node_domain
node_usecases -->|"creates evidence"| node_evidence_models
node_repositories -->|"executes queries"| node_database
node_repositories -->|"maps records"| node_domain
node_migrations -->|"initializes schema"| node_database
node_database -->|"uses settings"| node_config
node_trend -->|"reads trend history"| node_repositories
node_competition -->|"reads competitors"| node_repositories
node_matcher -->|"reads products"| node_repositories
node_opportunity -->|"uses trend signals"| node_trend
node_opportunity -->|"uses competition signals"| node_competition
node_opportunity -->|"reads and saves scores"| node_repositories
node_confidence -->|"reads evidence and saves scores"| node_repositories
node_economics -->|"saves economics"| node_repositories
node_missing -->|"detects data gaps"| node_repositories
node_decision_engine -->|"reads signals and saves decision"| node_repositories
node_research -->|"reads gaps and creates tasks"| node_repositories
node_cli -->|"calculates scores"| node_opportunity
node_cli -->|"calculates scores"| node_confidence
node_cli -->|"calculates economics"| node_economics
node_cli -->|"checks gaps"| node_missing
node_cli -->|"generates tasks"| node_research
node_cli -->|"makes decisions"| node_decision_engine
node_cli -->|"matches products"| node_matcher
node_web -->|"reads dashboard data"| node_repositories
node_web -->|"requests trend analysis"| node_trend
node_web -->|"requests competition analysis"| node_competition
node_web -->|"requests product matching"| node_matcher
node_web -->|"requests scores"| node_opportunity
node_web -->|"requests scores"| node_confidence
node_web -->|"requests economics"| node_economics
node_web -->|"requests gap checks"| node_missing
node_web -->|"requests research tasks"| node_research
node_web -->|"requests decisions"| node_decision_engine
node_ai -.->|"optional provider calls"| node_ai_service

click node_cli "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/cli/main.py"
click node_web "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/ui/app.py"
click node_usecases "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/application/use_cases.py"
click node_csv "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/connectors/csv_connector.py"
click node_manual "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/connectors/manual_connector.py"
click node_raw "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/connectors/raw_storage.py"
click node_trend "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/analytics/trend_engine.py"
click node_competition "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/analytics/competition_engine.py"
click node_matcher "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/analytics/product_matcher.py"
click node_opportunity "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/scoring/opportunity_scorer.py"
click node_confidence "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/scoring/confidence_scorer.py"
click node_economics "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/scoring/economic_engine.py"
click node_missing "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/scoring/missing_data_engine.py"
click node_decision_engine "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/scoring/decision_engine.py"
click node_research "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/scoring/research_engine.py"
click node_ai "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/ai/provider.py"
click node_domain "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/domain/market.py"
click node_repositories "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/data/repositories.py"
click node_database "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/data/database.py"
click node_migrations "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/data/migrations.py"
click node_config "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/data/config.py"
click node_evidence_models "https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/domain/evidence.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_cli,node_web toneBlue
class node_usecases,node_csv,node_manual,node_raw toneAmber
class node_trend,node_competition,node_matcher,node_ai toneMint
class node_opportunity,node_confidence,node_economics,node_missing,node_decision_engine,node_research toneRose
class node_domain,node_repositories,node_database,node_migrations,node_config,node_evidence_models,node_user,node_ai_service toneIndigo
```

## Components

### User interfaces

- [Command line](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/cli/main.py): `app/cli/main.py`
- [Web UI](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/ui/app.py): `app/ui/app.py`

### Data capture

- [Application use cases](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/application/use_cases.py): `app/application/use_cases.py`
- [CSV connector](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/connectors/csv_connector.py): `app/connectors/csv_connector.py`
- [Manual connector](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/connectors/manual_connector.py): `app/connectors/manual_connector.py`
- [Raw payload archive](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/connectors/raw_storage.py): `app/connectors/raw_storage.py`

### Market analysis

- [Trend analysis](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/analytics/trend_engine.py): `app/analytics/trend_engine.py`
- [Competition analysis](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/analytics/competition_engine.py): `app/analytics/competition_engine.py`
- [Product matching](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/analytics/product_matcher.py): `app/analytics/product_matcher.py`
- [AI provider abstraction](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/ai/provider.py): `app/ai/provider.py`

### Scoring and decisions

- [Opportunity scoring](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/scoring/opportunity_scorer.py): `app/scoring/opportunity_scorer.py`
- [Confidence scoring](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/scoring/confidence_scorer.py): `app/scoring/confidence_scorer.py`
- [Economic analysis](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/scoring/economic_engine.py): `app/scoring/economic_engine.py`
- [Missing-data detection](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/scoring/missing_data_engine.py): `app/scoring/missing_data_engine.py`
- [Decision engine](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/scoring/decision_engine.py): `app/scoring/decision_engine.py`
- [Research tasks](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/scoring/research_engine.py): `app/scoring/research_engine.py`

### Domain and storage

- [Market domain models](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/domain/market.py): `app/domain/market.py`
- [Entity repositories](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/data/repositories.py): `app/data/repositories.py`
- [DuckDB](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/data/database.py): `app/data/database.py`
- [Schema migrations](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/data/migrations.py): `app/data/migrations.py`
- [Application configuration](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/data/config.py): `app/data/config.py`
- [Evidence and product models](https://github.com/palsuandoid-hub/analisa_pasar/blob/main/app/domain/evidence.py): `app/domain/evidence.py`

### Other components

- **Market analyst**
- **AI service**

## Connections

- Market analyst → Command line: enters data
- Market analyst → Web UI: uses
- Command line → Application use cases: invokes (evidence: `app/cli/main.py`)
- Web UI → Application use cases: invokes (evidence: `app/ui/app.py`)
- Command line → CSV connector: imports CSV (evidence: `app/cli/main.py`)
- Application use cases → CSV connector: normalizes imports (evidence: `app/application/use_cases.py`)
- Application use cases → Manual connector: accepts manual records (evidence: `app/application/use_cases.py`)
- Application use cases → Raw payload archive: stores raw payloads (evidence: `app/application/use_cases.py`)
- Raw payload archive → DuckDB: records payload metadata (evidence: `app/connectors/raw_storage.py`)
- Application use cases → Entity repositories: persists entities (evidence: `app/application/use_cases.py`)
- Application use cases → Market domain models: creates market records (evidence: `app/application/use_cases.py`)
- Application use cases → Evidence and product models: creates evidence (evidence: `app/application/use_cases.py`)
- Entity repositories → DuckDB: executes queries (evidence: `app/data/repositories.py`)
- Entity repositories → Market domain models: maps records (evidence: `app/data/repositories.py`)
- Schema migrations → DuckDB: initializes schema (evidence: `app/data/migrations.py`)
- DuckDB → Application configuration: uses settings (evidence: `app/data/database.py`)
- Trend analysis → Entity repositories: reads trend history (evidence: `app/analytics/trend_engine.py`)
- Competition analysis → Entity repositories: reads competitors (evidence: `app/analytics/competition_engine.py`)
- Product matching → Entity repositories: reads products (evidence: `app/analytics/product_matcher.py`)
- Opportunity scoring → Trend analysis: uses trend signals (evidence: `app/scoring/opportunity_scorer.py`)
- Opportunity scoring → Competition analysis: uses competition signals (evidence: `app/scoring/opportunity_scorer.py`)
- Opportunity scoring → Entity repositories: reads and saves scores (evidence: `app/scoring/opportunity_scorer.py`)
- Confidence scoring → Entity repositories: reads evidence and saves scores (evidence: `app/scoring/confidence_scorer.py`)
- Economic analysis → Entity repositories: saves economics (evidence: `app/scoring/economic_engine.py`)
- Missing-data detection → Entity repositories: detects data gaps (evidence: `app/scoring/missing_data_engine.py`)
- Decision engine → Entity repositories: reads signals and saves decision (evidence: `app/scoring/decision_engine.py`)
- Research tasks → Entity repositories: reads gaps and creates tasks (evidence: `app/scoring/research_engine.py`)
- Command line → Opportunity scoring: calculates scores (evidence: `app/cli/main.py`)
- Command line → Confidence scoring: calculates scores (evidence: `app/cli/main.py`)
- Command line → Economic analysis: calculates economics (evidence: `app/cli/main.py`)
- Command line → Missing-data detection: checks gaps (evidence: `app/cli/main.py`)
- Command line → Research tasks: generates tasks (evidence: `app/cli/main.py`)
- Command line → Decision engine: makes decisions (evidence: `app/cli/main.py`)
- Command line → Product matching: matches products (evidence: `app/cli/main.py`)
- Web UI → Entity repositories: reads dashboard data (evidence: `app/ui/app.py`)
- Web UI → Trend analysis: requests trend analysis (evidence: `app/ui/app.py`)
- Web UI → Competition analysis: requests competition analysis (evidence: `app/ui/app.py`)
- Web UI → Product matching: requests product matching (evidence: `app/ui/app.py`)
- Web UI → Opportunity scoring: requests scores (evidence: `app/ui/app.py`)
- Web UI → Confidence scoring: requests scores (evidence: `app/ui/app.py`)
- Web UI → Economic analysis: requests economics (evidence: `app/ui/app.py`)
- Web UI → Missing-data detection: requests gap checks (evidence: `app/ui/app.py`)
- Web UI → Research tasks: requests research tasks (evidence: `app/ui/app.py`)
- Web UI → Decision engine: requests decisions (evidence: `app/ui/app.py`)
- AI provider abstraction → AI service: optional provider calls
