Skip to main content

Crate legalis_sg

Crate legalis_sg 

Source
Expand description

Singapore Jurisdiction Support for Legalis-RS

This crate provides comprehensive modeling of Singapore law across seven major domains:

  1. Companies Act (Cap. 50) - Company formation, ACRA registration, directors, shareholders
  2. Employment Act (Cap. 91) - Working hours, leave entitlements, dismissal protection, salary
  3. PDPA (Personal Data Protection Act 2012) - Data protection, consent, DNC Registry
  4. Consumer Protection - Sale of Goods Act, Consumer Protection (Fair Trading) Act
  5. Intellectual Property - Patents, Trademarks, Copyright, Registered Designs
  6. Banking Act (Cap. 19) - Basel III capital adequacy, AML/CFT, banking licenses
  7. Payment Services Act 2019 - Payment services, e-wallets, digital payment tokens (DPT)

Singapore follows a common law system based on English law, with statutory modifications:

Constitution of Singapore (1965)
    ├── Fundamental Liberties (Part IV)
    └── Government Structure
         ↓
Statutes (Acts of Parliament)
    ├── Companies Act (Cap. 50)
    ├── Employment Act (Cap. 91)
    ├── Personal Data Protection Act 2012
    └── Sale of Goods Act (Cap. 393)
         ↓
Subsidiary Legislation
    ├── Regulations
    ├── Rules
    └── Orders
         ↓
Case Law (Judicial Precedents)
    ├── Court of Appeal (final authority)
    └── High Court

§Key Regulatory Bodies

  • ACRA: Accounting and Corporate Regulatory Authority (company registration, BizFile+)
  • MOM: Ministry of Manpower (employment, work passes, CPF)
  • PDPC: Personal Data Protection Commission (data protection enforcement)
  • CASE: Consumers Association of Singapore (consumer protection advocacy)

§Citation Format

Singapore statutes use chapter numbers for older statutes, none for newer:

  • Older Acts: “Companies Act (Cap. 50), s. 145(1)” or “CA s. 145”
  • Modern Acts: “PDPA s. 13” (no Cap. for post-2000 acts)
  • Subsidiary Legislation: “Companies Regulations (Cap. 50, Rg 1)”
  • Case Law: “[2024] SGCA 15” (Court of Appeal), “[2023] SGHC 150” (High Court)

§Domain 1: Companies Act (Cap. 50)

The Companies Act governs company formation and governance in Singapore.

§Key Requirements

  • UEN (Unique Entity Number): 9-10 digit identifier for all business entities
  • Resident Director: At least 1 director ordinarily resident in Singapore (s. 145)
  • Company Secretary: Mandatory within 6 months of incorporation (s. 171)
  • AGM: Within 18 months of incorporation, then annually within 6 months of FYE (s. 175)
  • Annual Return: Must be filed within 7 months of FYE (s. 197)

§Example: Company Formation

use legalis_sg::companies::*;

// Create a Singapore Pte Ltd company
let company = Company::builder()
    .name("Tech Innovations Pte Ltd")
    .company_type(CompanyType::PrivateLimited)
    .share_capital(ShareCapital::new(100_000_00)) // SGD 100,000 in cents
    .add_director(Director::new("John Tan", "S1234567A", true)) // Resident director
    .registered_address(Address::singapore("1 Raffles Place", "048616"))
    .build()?;

// Validate company formation
match validate_company_formation(&company) {
    Ok(report) => println!("✅ Company formation valid"),
    Err(e) => eprintln!("❌ Validation failed: {}", e),
}

§Domain 2: Employment Act (Cap. 91)

The Employment Act provides minimum employment standards for workers in Singapore.

§Coverage

  • Workmen: Earning ≤ SGD 4,500/month
  • Non-workmen: Earning ≤ SGD 2,600/month

§Key Provisions

  • Working Hours (s. 38): Max 44 hours/week (non-shift), 48 hours/week (shift)
  • Overtime: 1.5x regular rate (s. 38(4))
  • Annual Leave (s. 43): 7 days (year 1) → 14 days (year 8+)
  • Sick Leave (s. 89): 14 days outpatient + 60 days hospitalization (after 3 months)
  • Maternity Leave: 16 weeks for citizens (CDCA)
  • CPF: Employer 17%, Employee 20% (age ≤55), wage ceiling SGD 6,000/month

§Example: CPF Contribution

use legalis_sg::employment::*;

// Calculate CPF contribution for a 30-year-old earning SGD 5,000/month
let cpf = CpfContribution::new(30, 5_000_00); // Age 30, SGD 5,000 in cents
let breakdown = cpf.calculate()?;

println!("Employer contribution: SGD {:.2}", breakdown.employer_amount_sgd());
println!("Employee contribution: SGD {:.2}", breakdown.employee_amount_sgd());
// Output: Employer: SGD 850.00 (17%), Employee: SGD 1,000.00 (20%)

§Domain 3: PDPA (Personal Data Protection Act 2012)

Singapore’s data protection framework, distinct from GDPR.

§PDPA vs GDPR Key Differences

FeatureGDPRPDPA (Singapore)
ScopeEU/EEA + extraterritorialSingapore organizations
Legal Basis6 lawful basesConsent-centric (with exceptions)
DPOMandatory for certain processingRecommended (not mandatory)
Breach Notification72 hours to authority3 calendar days to PDPC (if notifiable)
FinesUp to €20M or 4% revenueUp to SGD 1M
Right to be ForgottenExplicit (Art. 17)Limited (correction/access only)
DNC RegistryNo equivalentPart IX - opt-out for marketing

§Key Obligations

  • Consent (s. 13): Obtain valid consent for collection, use, disclosure
  • Purpose Limitation (s. 18): Collect only for reasonable purposes
  • Data Breach Notification (s. 26B/26C): Notify PDPC within 3 calendar days
  • DNC Compliance (Part IX): Check Do Not Call Registry before marketing
  • Access Requests (s. 21): Respond within 30 days
use legalis_sg::pdpa::*;

// Record consent for marketing emails
let consent = ConsentRecord::builder()
    .data_subject_id("customer@example.com")
    .purpose(PurposeOfCollection::Marketing)
    .consent_method(ConsentMethod::Electronic)
    .add_data_category(PersonalDataCategory::Email)
    .timestamp_now()
    .build()?;

// Validate consent
match validate_consent(&consent) {
    Ok(()) => println!("✅ Consent valid"),
    Err(PdpaError::MissingConsent { .. }) => eprintln!("❌ Consent not obtained"),
}

§Domain 4: Consumer Protection

§Sale of Goods Act (Cap. 393)

Implied terms in contracts for sale of goods:

  • s. 13: Goods must correspond to description
  • s. 14(2): Goods must be of merchantable quality
  • s. 14(3): Goods must be fit for stated purpose

§Consumer Protection (Fair Trading) Act (Cap. 52A)

Prohibits unfair practices:

  • s. 4: False or misleading representation
  • s. 5: Unconscionable conduct
  • s. 6: Bait advertising
  • s. 7: Harassment or coercion

§Example: Unfair Practice Detection

use legalis_sg::consumer::*;

// Analyze contract for unfair practices
let contract = ConsumerContract::new()
    .business_name("Electronics Store")
    .consumer_name("Jane Lim")
    .add_term("No refunds under any circumstances")
    .add_term("Company not liable for defects");

let practices = detect_unfair_practices(&contract);
for practice in practices {
    println!("⚠️  Unfair practice: {:?}", practice.practice_type);
}

§Unique Singapore Features

§1. UEN (Unique Entity Number)

All business entities in Singapore are assigned a 9-10 digit UEN by ACRA for identification.

§2. CPF (Central Provident Fund)

Mandatory retirement savings scheme for Singapore citizens and PRs:

  • Employer contribution: 17% (age ≤55)
  • Employee contribution: 20% (age ≤55)
  • Wage ceiling: SGD 6,000/month (Ordinary Wage)

§3. DNC Registry

Singapore’s Do Not Call Registry allows individuals to opt out of marketing calls/texts/faxes.

§4. BizFile+

ACRA’s electronic filing system for company registration and annual returns.

§Module Structure

  • banking: Banking Act (Cap. 19) - Basel III, AML/CFT, banking licenses
  • payment: Payment Services Act 2019 - Payment services, e-wallets, DPT (crypto)
  • companies: Companies Act (Cap. 50) - Formation, directors, governance
  • employment: Employment Act (Cap. 91) - Contracts, CPF, leave, termination
  • pdpa: Personal Data Protection Act 2012 - Consent, breach, DNC
  • consumer: Consumer Protection - Sale of Goods, unfair practices
  • ip: Intellectual Property - Patents, Trademarks, Copyright, Designs
  • citation: Singapore legal citation system

§Examples

This crate includes 16 comprehensive examples demonstrating real-world usage:

§Companies Act Examples

  • acra_company_registration - Pte Ltd formation with ACRA
  • director_compliance_check - Resident director validation (s. 145)
  • annual_compliance_checklist - AGM and annual return deadlines
  • share_issuance - Share allotment and dilution

§Employment Act Examples

  • employment_contract_validation - Full contract validation
  • cpf_contribution_calculator - CPF calculation by age groups
  • leave_entitlement_calculator - Leave progression by service years
  • termination_notice_checker - Notice period calculation

§PDPA Examples

  • consent_management - Recording and withdrawing consent
  • data_breach_notification - 3-day notification workflow
  • dnc_registry_check - Checking DNC before marketing
  • dpo_requirement_assessment - When to appoint DPO

§Consumer Protection Examples

  • consumer_contract_analysis - Contract risk scoring
  • sale_of_goods_validation - Implied terms checking
  • unfair_practice_detector - Automated detection
  • online_transaction_compliance - E-commerce rules

§Testing

Run the comprehensive test suite:

# All tests
cargo nextest run --package legalis-sg

# Specific domain
cargo test --package legalis-sg --test companies_validation_tests
cargo test --package legalis-sg --test employment_contract_tests
cargo test --package legalis-sg --test pdpa_consent_tests
cargo test --package legalis-sg --test consumer_protection_tests

§License

Licensed under either of:

  • MIT License
  • Apache License, Version 2.0

at your option.

Re-exports§

pub use companies::error::CompaniesError;
pub use companies::error::Result as CompaniesResult;
pub use companies::types::Address;
pub use companies::types::Company;
pub use companies::types::CompanySecretary;
pub use companies::types::CompanyType;
pub use companies::types::Director;
pub use companies::types::DirectorQualification;
pub use companies::types::DisqualificationStatus;
pub use companies::types::DividendRights;
pub use companies::types::MonthDay;
pub use companies::types::ShareAllocation;
pub use companies::types::ShareCapital;
pub use companies::types::ShareClass;
pub use companies::types::Shareholder;
pub use companies::validator::ValidationReport;
pub use companies::validator::validate_agm_requirement;
pub use companies::validator::validate_annual_return_deadline;
pub use companies::validator::validate_company_formation;
pub use companies::validator::validate_director_eligibility;
pub use companies::validator::validate_resident_director_requirement;
pub use employment::error::EmploymentError;
pub use employment::error::Result as EmploymentResult;
pub use employment::types::Allowance;
pub use employment::types::ContractType;
pub use employment::types::CpfContribution;
pub use employment::types::EmploymentContract;
pub use employment::types::LeaveEntitlement;
pub use employment::types::LeaveType;
pub use employment::types::TerminationNotice;
pub use employment::types::WorkingHours;
pub use employment::validator::validate_employment_contract;
pub use employment::validator::validate_leave_entitlement;
pub use employment::validator::validate_overtime_payment;
pub use employment::validator::validate_termination_notice;
pub use employment::validator::validate_working_hours;
pub use pdpa::error::PdpaError;
pub use pdpa::error::Result as PdpaResult;
pub use pdpa::types::BreachType;
pub use pdpa::types::ConsentMethod;
pub use pdpa::types::ConsentRecord;
pub use pdpa::types::DataBreachNotification;
pub use pdpa::types::DataTransfer;
pub use pdpa::types::DncRegistry;
pub use pdpa::types::DncType;
pub use pdpa::types::DpoContact;
pub use pdpa::types::OrganisationType;
pub use pdpa::types::PdpaOrganisation;
pub use pdpa::types::PersonalDataCategory;
pub use pdpa::types::PurposeOfCollection;
pub use pdpa::validator::validate_breach_notification;
pub use pdpa::validator::validate_cross_border_transfer;
pub use pdpa::validator::validate_dnc_compliance;
pub use pdpa::validator::validate_dpo_requirement;
pub use pdpa::validator::validate_purpose_limitation;
pub use consumer::error::ConsumerError;
pub use consumer::error::Result as ConsumerResult;
pub use consumer::types::ConsumerContract;
pub use consumer::types::ContractTerm;
pub use consumer::types::ImpliedTerm;
pub use consumer::types::SaleOfGoods;
pub use consumer::types::TransactionType;
pub use consumer::types::UnfairPractice;
pub use consumer::types::UnfairPracticeType;
pub use consumer::types::WarrantyTerms;
pub use consumer::types::WarrantyType;
pub use consumer::validator::detect_unfair_practices;
pub use consumer::validator::validate_consumer_contract;
pub use consumer::validator::validate_implied_terms;
pub use consumer::validator::validate_sale_of_goods;
pub use ip::error::IpError;
pub use ip::error::IpType;
pub use ip::error::Result as IpResult;
pub use ip::types::Author;
pub use ip::types::ClaimType;
pub use ip::types::Copyright;
pub use ip::types::DesignStatus;
pub use ip::types::FairDealingPurpose;
pub use ip::types::Patent;
pub use ip::types::PatentClaim;
pub use ip::types::PatentStatus;
pub use ip::types::PriorArt;
pub use ip::types::PriorArtRelevance;
pub use ip::types::RegisteredDesign;
pub use ip::types::Trademark;
pub use ip::types::TrademarkSpecification;
pub use ip::types::TrademarkStatus;
pub use ip::types::TrademarkType;
pub use ip::types::WorkType;
pub use ip::validator::CopyrightValidationReport;
pub use ip::validator::DesignValidationReport;
pub use ip::validator::PatentValidationReport;
pub use ip::validator::TrademarkConflict;
pub use ip::validator::TrademarkValidationReport;
pub use ip::validator::assess_distinctiveness;
pub use ip::validator::assess_fair_dealing;
pub use ip::validator::assess_patentability;
pub use ip::validator::validate_design;
pub use ip::validator::validate_patent;
pub use ip::validator::validate_trademark;
pub use banking::error::BankingError;
pub use banking::error::ErrorSeverity as BankingErrorSeverity;
pub use banking::error::Result as BankingResult;
pub use banking::types::Bank;
pub use banking::types::BankBuilder;
pub use banking::types::BankLicenseType;
pub use banking::types::CapitalAdequacy;
pub use banking::types::CapitalType;
pub use banking::types::CashTransactionReport;
pub use banking::types::CashTransactionType;
pub use banking::types::ComplianceOfficer;
pub use banking::types::CustomerAccount as BankCustomerAccount;
pub use banking::types::CustomerRiskCategory;
pub use banking::types::LicenseStatus as BankLicenseStatus;
pub use banking::types::SuspiciousTransactionReport;
pub use banking::validator::AmlComplianceStatus;
pub use banking::validator::BankValidationReport;
pub use banking::validator::CapitalAdequacyStatus;
pub use banking::validator::assess_aml_compliance;
pub use banking::validator::calculate_capital_shortfall;
pub use banking::validator::calculate_required_capital;
pub use banking::validator::validate_bank;
pub use banking::validator::validate_cash_transaction;
pub use banking::validator::validate_customer_account as validate_bank_customer_account;
pub use banking::validator::validate_merchant_bank_activities;
pub use banking::validator::validate_str_filing;
pub use banking::validator::validate_wholesale_deposit;
pub use payment::error::ErrorSeverity as PaymentErrorSeverity;
pub use payment::error::PaymentError;
pub use payment::error::Result as PaymentResult;
pub use payment::types::CustomerPaymentAccount;
pub use payment::types::DigitalPaymentToken;
pub use payment::types::DptServiceType;
pub use payment::types::LicenseStatus as PaymentLicenseStatus;
pub use payment::types::PaymentAccountType;
pub use payment::types::PaymentLicenseType;
pub use payment::types::PaymentServiceProvider;
pub use payment::types::PaymentServiceProviderBuilder;
pub use payment::types::PaymentServiceType;
pub use payment::types::PaymentTransaction;
pub use payment::types::RiskCategory;
pub use payment::types::SafeguardingArrangement;
pub use payment::types::SafeguardingType;
pub use payment::validator::AmlStatus;
pub use payment::validator::LicenseStatusReport;
pub use payment::validator::PaymentProviderValidationReport;
pub use payment::validator::SafeguardingStatus;
pub use payment::validator::assess_safeguarding_status;
pub use payment::validator::calculate_required_safeguarding;
pub use payment::validator::validate_customer_account;
pub use payment::validator::validate_dpt_service;
pub use payment::validator::validate_payment_provider;
pub use payment::validator::validate_safeguarding;
pub use payment::validator::validate_transaction;
pub use citation::SingaporeCitation;
pub use citation::Statute;
pub use citation::StatuteSection;
pub use reasoning::ComplianceStatus;
pub use reasoning::LegalAnalysis;
pub use reasoning::LegalReasoningEngine;
pub use reasoning::ReasoningError;
pub use reasoning::ReasoningResult;
pub use reasoning::RiskLevel;
pub use reasoning::Violation;
pub use reasoning::ViolationSeverity;
pub use common::EthnicGroup;
pub use common::SingaporeCurrency;
pub use common::SingaporeLegalCalendar;
pub use common::SingaporeNameFormatter;
pub use common::SingaporePersonName;
pub use common::format_sgd;
pub use common::format_sgd_cents;
pub use common::is_singapore_holiday;
pub use common::is_working_day;

Modules§

banking
Banking Act (Cap. 19) - Singapore Banking Regulation
citation
Singapore Legal Citation System
common
Common utilities for Singapore legal system.
companies
Companies Act (Cap. 50) Module
consumer
Consumer Protection (Sale of Goods Act + Consumer Protection Fair Trading Act)
employment
Employment Act (Cap. 91) - Employment Standards
ip
Intellectual Property Laws Module
payment
Payment Services Act 2019 - Singapore Payment Regulation
pdpa
Personal Data Protection Act 2012 (PDPA)
reasoning
Legal reasoning engine for Singapore law.