Initial commit — Performance West telecom compliance platform
Includes: API (Express/TypeScript), Astro site, Python workers, document generators, FCC compliance tools, Canada CRTC formation, Ansible infrastructure, and deployment scripts. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
commit
f8cd37ac8c
1823 changed files with 145167 additions and 0 deletions
2
scripts/formation/states/ga/__init__.py
Normal file
2
scripts/formation/states/ga/__init__.py
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
from .adapter import adapter
|
||||
from .config import CONFIG
|
||||
118
scripts/formation/states/ga/adapter.py
Normal file
118
scripts/formation/states/ga/adapter.py
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
"""Georgia — SOS portal automation."""
|
||||
|
||||
from __future__ import annotations
|
||||
from scripts.formation.base import StatePortal, NameSearchResult, FormationOrder, FilingResult, FilingStatus
|
||||
from .config import CONFIG
|
||||
|
||||
|
||||
class GAPortal(StatePortal):
|
||||
STATE_CODE = "GA"
|
||||
STATE_NAME = "Georgia"
|
||||
PORTAL_NAME = CONFIG["portal_name"]
|
||||
PORTAL_URL = CONFIG["portal_url"]
|
||||
NWRA_ADDRESS = CONFIG["nwra_address"]
|
||||
NWRA_CITY = CONFIG["nwra_city"]
|
||||
NWRA_STATE = CONFIG["nwra_state"]
|
||||
NWRA_ZIP = CONFIG["nwra_zip"]
|
||||
|
||||
async def search_name(self, name: str) -> NameSearchResult:
|
||||
"""Search Georgia business name availability."""
|
||||
try:
|
||||
page = await self.start_browser()
|
||||
await page.goto(CONFIG["name_search_url"])
|
||||
await self.human_delay()
|
||||
|
||||
# Type name into search field
|
||||
sel = CONFIG["selectors"]
|
||||
if sel["name_search_input"]:
|
||||
await self.type_slowly(sel["name_search_input"], name)
|
||||
await self.safe_click(sel["name_search_submit"])
|
||||
await page.wait_for_load_state("networkidle")
|
||||
|
||||
content = await page.content()
|
||||
available = CONFIG["selectors"]["name_unavailable_indicator"] not in content
|
||||
|
||||
return NameSearchResult(
|
||||
available=available,
|
||||
state_code=self.STATE_CODE,
|
||||
searched_name=name,
|
||||
raw_response=content[:2000],
|
||||
)
|
||||
|
||||
return NameSearchResult(
|
||||
available=False,
|
||||
state_code=self.STATE_CODE,
|
||||
searched_name=name,
|
||||
raw_response="Selectors not yet configured for this state",
|
||||
)
|
||||
except Exception as e:
|
||||
self.log.error("Name search failed: %s", e)
|
||||
return NameSearchResult(
|
||||
available=False,
|
||||
state_code=self.STATE_CODE,
|
||||
searched_name=name,
|
||||
raw_response=str(e),
|
||||
)
|
||||
finally:
|
||||
await self.close_browser()
|
||||
|
||||
async def file_llc(self, order: FormationOrder) -> FilingResult:
|
||||
"""File LLC in Georgia."""
|
||||
try:
|
||||
page = await self.start_browser()
|
||||
await page.goto(CONFIG["filing_url"])
|
||||
await self.human_delay()
|
||||
await self.screenshot("llc_start")
|
||||
|
||||
# TODO: Implement Georgia-specific LLC filing flow
|
||||
# Each state's portal has different form fields, steps, and workflows.
|
||||
# The selectors in config.py need to be populated by inspecting the portal.
|
||||
|
||||
return FilingResult(
|
||||
success=False,
|
||||
status=FilingStatus.ERROR,
|
||||
state_code=self.STATE_CODE,
|
||||
entity_name=order.entity_name,
|
||||
error_message="LLC filing automation not yet implemented for Georgia",
|
||||
screenshot_path=await self.screenshot("llc_not_implemented"),
|
||||
)
|
||||
except Exception as e:
|
||||
self.log.error("LLC filing failed: %s", e)
|
||||
return FilingResult(
|
||||
success=False,
|
||||
status=FilingStatus.ERROR,
|
||||
state_code=self.STATE_CODE,
|
||||
entity_name=order.entity_name,
|
||||
error_message=str(e),
|
||||
)
|
||||
finally:
|
||||
await self.close_browser()
|
||||
|
||||
async def file_corporation(self, order: FormationOrder) -> FilingResult:
|
||||
"""File Corporation in Georgia."""
|
||||
try:
|
||||
page = await self.start_browser()
|
||||
await page.goto(CONFIG["filing_url"])
|
||||
await self.human_delay()
|
||||
|
||||
return FilingResult(
|
||||
success=False,
|
||||
status=FilingStatus.ERROR,
|
||||
state_code=self.STATE_CODE,
|
||||
entity_name=order.entity_name,
|
||||
error_message="Corporation filing automation not yet implemented for Georgia",
|
||||
)
|
||||
except Exception as e:
|
||||
return FilingResult(
|
||||
success=False,
|
||||
status=FilingStatus.ERROR,
|
||||
state_code=self.STATE_CODE,
|
||||
entity_name=order.entity_name,
|
||||
error_message=str(e),
|
||||
)
|
||||
finally:
|
||||
await self.close_browser()
|
||||
|
||||
|
||||
def adapter() -> GAPortal:
|
||||
return GAPortal()
|
||||
49
scripts/formation/states/ga/config.py
Normal file
49
scripts/formation/states/ga/config.py
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
"""Georgia — Secretary of State portal configuration."""
|
||||
|
||||
CONFIG = {
|
||||
"state_code": "GA",
|
||||
"state_name": "Georgia",
|
||||
"sos_name": "Georgia Secretary of State",
|
||||
"portal_name": "Georgia eCorp Business Search",
|
||||
"portal_url": "https://sos.ga.gov",
|
||||
"name_search_url": "https://ecorp.sos.ga.gov/BusinessSearch",
|
||||
"filing_url": "https://ecorp.sos.ga.gov/BusinessSearch",
|
||||
"search_method": "playwright",
|
||||
# Socrata API (not applicable)
|
||||
"socrata_domain": "",
|
||||
"socrata_dataset_id": "",
|
||||
# NW Registered Agent address in this state
|
||||
"nwra_name": "Northwest Registered Agent LLC",
|
||||
"nwra_address": "2985 Gordy Pkwy Ste 100",
|
||||
"nwra_city": "Marietta",
|
||||
"nwra_state": "GA",
|
||||
"nwra_zip": "30066",
|
||||
# State fees (cents)
|
||||
"llc_formation_fee": 11000,
|
||||
"corp_formation_fee": 11000,
|
||||
"expedited_fee": None,
|
||||
"expedited_label": "",
|
||||
# Selectors (Playwright CSS selectors for portal automation)
|
||||
"selectors": {
|
||||
"name_search_input": "",
|
||||
"name_search_submit": "",
|
||||
"name_results_table": "",
|
||||
"name_available_indicator": "",
|
||||
"name_unavailable_indicator": "",
|
||||
# LLC filing form selectors
|
||||
"llc_name_field": "",
|
||||
"llc_agent_name_field": "",
|
||||
"llc_agent_address_field": "",
|
||||
"llc_principal_address_field": "",
|
||||
"llc_organizer_name_field": "",
|
||||
"llc_management_type_select": "",
|
||||
"llc_purpose_field": "",
|
||||
"llc_submit_button": "",
|
||||
# Corp filing form selectors
|
||||
"corp_name_field": "",
|
||||
"corp_agent_name_field": "",
|
||||
"corp_shares_field": "",
|
||||
"corp_submit_button": "",
|
||||
},
|
||||
"notes": "",
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue