# readme.md for @fin.cx/csvparser

```markdown
# @fin.cx/csvparser
a csvparser for fin2021

## Install

To install the `@fin.cx/csvparser` module, you can use npm. Simply run the following command:

```bash
npm install @fin.cx/csvparser
```

## Usage

The `@fin.cx/csvparser` module provides tools to parse CSV files from various financial institutions such as Commerzbank, Fidor Bank, PayPal, and Spendesk. This helps in extracting and managing financial transaction data efficiently.

Here's a guide to showcase various functionalities along with comprehensive TypeScript code examples.

### Getting Started

First, make sure to import the necessary components from the `@fin.cx/csvparser` module.

```typescript
import { CsvSpendesk, CsvPayPal, CsvFidor, CsvCommerzbank } from '@fin.cx/csvparser';
```

### Spendesk CSV Parsing

#### Parsing Spendesk CSV from File

The `CsvSpendesk` class provides methods to parse Spendesk CSV files.

```typescript
import { CsvSpendesk } from '@fin.cx/csvparser';

async function parseSpendeskFile(filePath: string) {
  try {
    const spendeskData = await CsvSpendesk.fromFile(filePath);
    const transactions = await spendeskData.getTransactions();
    console.log(transactions);
  } catch (error) {
    console.error('Error parsing Spendesk file:', error);
  }
}

// Usage example
parseSpendeskFile('./path/to/spendesk.csv');
```

#### Parsing Spendesk CSV from Directory

You might have multiple Spendesk CSV files in a directory. The `fromDir` method helps in parsing all of them.

```typescript
import { CsvSpendesk } from '@fin.cx/csvparser';

async function parseSpendeskDirectory(dirPath: string) {
  try {
    const spendeskData = await CsvSpendesk.fromDir(dirPath);
    const transactions = await spendeskData.getTransactions();
    console.log(transactions);
  } catch (error) {
    console.error('Error parsing Spendesk directory:', error);
  }
}

// Usage example
parseSpendeskDirectory('./path/to/spendesk_dir');
```

### PayPal CSV Parsing

The `CsvPayPal` class is used to parse PayPal CSV files.

```typescript
import { CsvPayPal } from '@fin.cx/csvparser';

async function parsePayPalFile(filePath: string) {
  try {
    const payPalData = new CsvPayPal();
    const csvDescriptor = {
      filename: 'paypal.csv',
      contentString: await fs.promises.readFile(filePath, 'utf8')
    }
    payPalData.addCsvDecriptor(csvDescriptor);
    const transactions = await payPalData.getTransactions();
    console.log(transactions);
  } catch (error) {
    console.error('Error parsing PayPal file:', error);
  }
}

// Usage example
parsePayPalFile('./path/to/paypal.csv');
```

### Fidor Bank CSV Parsing

The `CsvFidor` class is used to parse Fidor Bank CSV files.

```typescript
import { CsvFidor } from '@fin.cx/csvparser';

async function parseFidorFile(filePath: string) {
  try {
    const fidorData = new CsvFidor();
    const csvDescriptor = {
      filename: 'fidor.csv',
      contentString: await fs.promises.readFile(filePath, 'utf8')
    }
    fidorData.addCsvDecriptor(csvDescriptor);
    const transactions = await fidorData.getTransactions();
    console.log(transactions);
  } catch (error) {
    console.error('Error parsing Fidor file:', error);
  }
}

// Usage example
parseFidorFile('./path/to/fidor.csv');
```

### Commerzbank CSV Parsing

The `CsvCommerzbank` class is used to parse Commerzbank CSV files.

```typescript
import { CsvCommerzbank } from '@fin.cx/csvparser';

async function parseCommerzbankFile(filePath: string) {
  try {
    const commerzbankData = new CsvCommerzbank();
    const csvDescriptor = {
      filename: 'commerzbank.csv',
      contentString: await fs.promises.readFile(filePath, 'utf8')
    }
    commerzbankData.addCsvDecriptor(csvDescriptor);
    const transactions = await commerzbankData.getTransactions();
    console.log(transactions);
  } catch (error) {
    console.error('Error parsing Commerzbank file:', error);
  }
}

// Usage example
parseCommerzbankFile('./path/to/commerzbank.csv');
```

### Advanced Usage

#### Merging Spendesk Data

You may need to merge multiple Spendesk CSV data instances.

```typescript
import { CsvSpendesk } from '@fin.cx/csvparser';

async function mergeSpendeskData(filePaths: string[]) {
  try {
    const spendeskInstances = await Promise.all(filePaths.map(CsvSpendesk.fromFile));
    const mergedInstance = spendeskInstances.reduce(
      (merged, currentInstance) => merged.concat(currentInstance),
      spendeskInstances[0]
    );
    console.log(await mergedInstance.getTransactions());
  } catch (error) {
    console.error('Error merging Spendesk data:', error);
  }
}

// Usage example
mergeSpendeskData([
  './path/to/spendesk1.csv',
  './path/to/spendesk2.csv'
]);
```

#### Working with PayPal Linked Transactions

PayPal CSV data contains linked transactions, which you may need to handle specifically.

```typescript
import { CsvPayPal } from '@fin.cx/csvparser';

async function handlePayPalLinkedTransactions(filePath: string) {
  try {
    const payPalData = new CsvPayPal();
    const csvDescriptor = {
      filename: 'paypal.csv',
      contentString: await fs.promises.readFile(filePath, 'utf8')
    }
    payPalData.addCsvDecriptor(csvDescriptor);
    const transactions = await payPalData.getTransactions();

    const linkedTransactions = transactions.filter(tx => tx.linkedTransactionCode);
    console.log(linkedTransactions);
  } catch (error) {
    console.error('Error handling linked transactions:', error);
  }
}

// Usage example
handlePayPalLinkedTransactions('./path/to/paypal.csv');
```

#### Parsing Multiple File Types

You may need to parse CSV files from different financial service providers.

```typescript
import { CsvSpendesk, CsvPayPal, CsvFidor, CsvCommerzbank } from '@fin.cx/csvparser';

async function parseMultipleFiles(filePaths: {spendesk: string, paypal: string, fidor: string, commerzbank: string}) {
  try {
    const spendeskData = await CsvSpendesk.fromFile(filePaths.spendesk);
    const payPalData = new CsvPayPal();
    const csvDescriptorPayPal = {
      filename: 'paypal.csv',
      contentString: await fs.promises.readFile(filePaths.paypal, 'utf8')
    }
    payPalData.addCsvDecriptor(csvDescriptorPayPal);
    
    const fidorData = new CsvFidor();
    const csvDescriptorFidor = {
      filename: 'fidor.csv',
      contentString: await fs.promises.readFile(filePaths.fidor, 'utf8')
    }
    fidorData.addCsvDecriptor(csvDescriptorFidor);
    
    const commerzbankData = new CsvCommerzbank();
    const csvDescriptorCommerzbank = {
      filename: 'commerzbank.csv',
      contentString: await fs.promises.readFile(filePaths.commerzbank, 'utf8')
    }
    commerzbankData.addCsvDecriptor(csvDescriptorCommerzbank);
    
    console.log(await spendeskData.getTransactions());
    console.log(await payPalData.getTransactions());
    console.log(await fidorData.getTransactions());
    console.log(await commerzbankData.getTransactions());

  } catch (error) {
    console.error('Error parsing multiple files:', error);
  }
}

// Usage example
parseMultipleFiles({
  spendesk: './path/to/spendesk.csv',
  paypal: './path/to/paypal.csv',
  fidor: './path/to/fidor.csv',
  commerzbank: './path/to/commerzbank.csv'
});
```

By covering multiple use cases and providing comprehensive documentation and code samples, this readme should help developers integrate and utilize the `@fin.cx/csvparser` module effectively.
```
undefined