PHPackages                             krasselt/afs-order-format - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Mail &amp; Notifications](/categories/mail)
4. /
5. krasselt/afs-order-format

ActiveLibrary[Mail &amp; Notifications](/categories/mail)

krasselt/afs-order-format
=========================

Generates AFS Vorgangimport email bodies from order data

05PHPCI passing

Since Apr 27Pushed 2mo agoCompare

[ Source](https://github.com/mkrasselt1/afs-order-format)[ Packagist](https://packagist.org/packages/krasselt/afs-order-format)[ RSS](/packages/krasselt-afs-order-format/feed)WikiDiscussions master Synced 3w ago

READMEChangelogDependenciesVersions (1)Used By (0)

AFS Order Format
================

[](#afs-order-format)

PHP library that generates email bodies in the AFS Vorgangimport format (`###AFS_VORGANGIMPORT#`). Designed to bridge online shop orders into AFS billing software via email.

The output contains both a human-readable order summary and the machine-readable `###FIELD:VALUE#` import block that AFS parses automatically.

Requirements
------------

[](#requirements)

- PHP 8.2+
- `ext-bcmath`

Installation
------------

[](#installation)

```
composer require krasselt/afs-order-format
```

Usage
-----

[](#usage)

```
use Krasselt\AfsOrderFormat\AfsOrderGenerator;
use Krasselt\AfsOrderFormat\OrderData;
use Krasselt\AfsOrderFormat\CustomerData;
use Krasselt\AfsOrderFormat\ShippingData;
use Krasselt\AfsOrderFormat\PaymentData;
use Krasselt\AfsOrderFormat\CartItem;

$generator = new AfsOrderGenerator(shopName: 'My Shop');

$order = new OrderData(
    customer: new CustomerData(
        customerNumber: 'KU-1937',
        company: 'Example GmbH',
        lastName: 'Mustermann',
        firstName: 'Max',
        street: 'Musterstraße 1',
        zip: '01234',
        city: 'Musterstadt',
        state: 'Sachsen',
        phone: '0123-456789',
        email: 'max@example.de',
    ),
    shipping: new ShippingData(
        method: 'Vorkasse DHL-Paketversand',
        cost: '5.50',
        deliveryType: 'per DHL Paketdienst',
    ),
    payment: new PaymentData(
        method: 'Vorkasse DHL-Paketversand',
    ),
    items: [
        new CartItem(
            position: 1,
            quantity: 2,
            articleNumber: '031',
            description: 'Terminal Servicegebühr',
            unitPrice: '10.00',
            totalPrice: '20.00',
        ),
        new CartItem(
            position: 2,
            quantity: 1,
            articleNumber: '109',
            description: 'Mobile-Daten SIM Karte n. Verb.',
            unitPrice: '4.35',
            totalPrice: '4.35',
        ),
    ],
    orderDate: new \DateTimeImmutable(),
    orderId: 'ORD-001',
    vatAmount: '3.89',
);

// Full email body (human-readable + AFS import block)
$emailBody = $generator->generate($order);

// Or generate sections individually
$humanReadable = $generator->generateHumanReadable($order);
$afsImport = $generator->generateAfsImport($order);
```

Data classes
------------

[](#data-classes)

ClassPurpose`CustomerData`Customer number, company, name, address, contact, EU tax ID`ShippingData`Shipping method, cost, delivery type, surcharge, delivery address`PaymentData`Payment method, bank details, credit card, voucher`CartItem`Position number, quantity, article number, description, unit/total price`OrderData`Composes all of the above + order date, ID, remarks, VATAll fields default to empty strings, so you only need to pass what you have. `OrderData` provides `getSubtotal()` and `getGrandTotal()` computed from the cart items and shipping.

Output format
-------------

[](#output-format)

The generated text contains two sections:

**1. Human-readable summary** — formatted order confirmation with customer data, articles, and totals.

**2. AFS import block** — starts with `AUTOVORGANGIMPORT: ###AFS_VORGANGIMPORT#` followed by tagged fields:

```
###KNUMMER:KU-1937#
###FIRMA:Example GmbH#
###NAME:Mustermann#
...
###POSTEN#
###POS_NR:1#
###POS_ANZAHL:2#
###POS_ARTIKELNR:031#
###POS_ARTIKELBE:Terminal Servicegebühr#
###POS_EPREIS:10.00#
###POS_GPREIS:20.00#

```

License
-------

[](#license)

Proprietary

###  Health Score

19

—

LowBetter than 9% of packages

Maintenance56

Moderate activity, may be stable

Popularity4

Limited adoption so far

Community2

Small or concentrated contributor base

Maturity12

Early-stage or recently created project

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/674a36546d07d81b1147026441fce959b38e07b3befedea9a404fff25881dbee?d=identicon)[mkrasselt1](/maintainers/mkrasselt1)

### Embed Badge

![Health badge](/badges/krasselt-afs-order-format/health.svg)

```
[![Health](https://phpackages.com/badges/krasselt-afs-order-format/health.svg)](https://phpackages.com/packages/krasselt-afs-order-format)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
