164 lines
3.2 KiB
PHP
164 lines
3.2 KiB
PHP
|
<?php
|
|||
|
/**
|
|||
|
* Extracteur de données des relevés de compte Paypal
|
|||
|
* à destination de Garradin (ou autre logiciel de compta)
|
|||
|
*
|
|||
|
* https://garradin.eu/
|
|||
|
*
|
|||
|
* Ce script prend en argument un fichier CSV exporté de Paypal
|
|||
|
* https://business.paypal.com/merchantdata/reportHome?reportType=DLOG
|
|||
|
* et produit un import exploitable dans Garradin
|
|||
|
*
|
|||
|
* Copyright (C) 2020 BohwaZ - licence AGPLv3
|
|||
|
*/
|
|||
|
|
|||
|
if (empty($argv[1]) || empty($argv[2])) {
|
|||
|
printf("Usage: %s FICHIER_PAYPAL_CSV FICHIER_SORTIE_CSV\n", $argv[0]);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
$path = $argv[1];
|
|||
|
$dest = $argv[2];
|
|||
|
|
|||
|
if (!is_readable($path)) {
|
|||
|
die("Ne peut lire le répertoire\n");
|
|||
|
}
|
|||
|
|
|||
|
$path = rtrim($path, '/');
|
|||
|
|
|||
|
$header = null;
|
|||
|
$sum_header = null;
|
|||
|
$out = [];
|
|||
|
$i = 0;
|
|||
|
|
|||
|
if (!is_file($path)) {
|
|||
|
die("Le fichier Paypal est invalide\n");
|
|||
|
}
|
|||
|
|
|||
|
// Lecture du CSV
|
|||
|
printf("Lecture de %s…" . PHP_EOL, $path);
|
|||
|
|
|||
|
/*
|
|||
|
Date
|
|||
|
Heure
|
|||
|
Fuseau horaire
|
|||
|
Nom
|
|||
|
Type
|
|||
|
État
|
|||
|
Devise
|
|||
|
Avant commission
|
|||
|
Commission
|
|||
|
Net
|
|||
|
De l'adresse email
|
|||
|
À l'adresse email
|
|||
|
Numéro de transaction
|
|||
|
Adresse de livraison
|
|||
|
État de l'adresse
|
|||
|
Titre de l'objet
|
|||
|
Numéro de l'objet
|
|||
|
Montant des frais d'expédition et de traitement
|
|||
|
Montant de l'assurance
|
|||
|
TVA
|
|||
|
Nom de l'option 1
|
|||
|
Valeur de l'option 1
|
|||
|
Nom de l'option 2
|
|||
|
Valeur de l'option 2
|
|||
|
Numéro de la transaction de référence
|
|||
|
Numéro de facture
|
|||
|
Numéro de client
|
|||
|
Quantité
|
|||
|
Numéro de reçu
|
|||
|
Solde
|
|||
|
Adresse
|
|||
|
Adresse (suite)/District/Quartier
|
|||
|
Ville
|
|||
|
État/Province/Région/Comté/Territoire/Préfecture/République
|
|||
|
Code postal
|
|||
|
Pays
|
|||
|
Numéro de téléphone du contact
|
|||
|
Objet
|
|||
|
Remarque
|
|||
|
Indicatif pays
|
|||
|
Impact sur le solde
|
|||
|
*/
|
|||
|
|
|||
|
$header = null;
|
|||
|
|
|||
|
$bom = "\xef\xbb\xbf";
|
|||
|
|
|||
|
// Read file from beginning.
|
|||
|
$fp = fopen($path, 'r');
|
|||
|
|
|||
|
// Progress file pointer and get first 3 characters to compare to the BOM string.
|
|||
|
if (fgets($fp, 4) !== $bom) {
|
|||
|
// BOM not found - rewind pointer to start of file.
|
|||
|
rewind($fp);
|
|||
|
}
|
|||
|
|
|||
|
$l = 0;
|
|||
|
|
|||
|
static $required = ['Date', 'Nom', 'Type', 'Commission', 'Net', 'Objet', 'Remarque', 'Numéro de transaction'];
|
|||
|
|
|||
|
while (!feof($fp)) {
|
|||
|
$l++;
|
|||
|
$row = fgetcsv($fp);
|
|||
|
|
|||
|
if (!$row) {
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
if (null === $header) {
|
|||
|
$header = $row;
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
$c = (object) array_combine($header, $row);
|
|||
|
|
|||
|
foreach ($required as $key) {
|
|||
|
if (!isset($c->$key)) {
|
|||
|
printf('Colonne "%s" manquante sur ligne %d' . PHP_EOL, $key, $l);
|
|||
|
continue(2);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
$out[] = $c;
|
|||
|
}
|
|||
|
|
|||
|
fclose($fp);
|
|||
|
|
|||
|
// Création du CSV de sortie
|
|||
|
$fp = fopen($dest, 'w');
|
|||
|
|
|||
|
fputcsv($fp, ['Numéro d\'écriture', 'Date', 'Libellé', 'Compte de débit', 'Compte de crédit', 'Montant', 'Numéro pièce comptable', 'Référence paiement', 'Notes']);
|
|||
|
|
|||
|
static $notes_keys = ['Nom', 'Objet', 'Remarque'];
|
|||
|
|
|||
|
foreach ($out as $c) {
|
|||
|
$label = $c->Type;
|
|||
|
|
|||
|
if ($c->Nom) {
|
|||
|
$label = $c->Nom . ' - ' . $label;
|
|||
|
}
|
|||
|
|
|||
|
$notes = '';
|
|||
|
$ref = $c->{'Numéro de transaction'};
|
|||
|
|
|||
|
foreach ($notes_keys as $k) {
|
|||
|
if ($c->{$k}) {
|
|||
|
$notes .= $c->{$k} . "\n";
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
$notes = trim($notes);
|
|||
|
|
|||
|
if ($c->Commission != '0,00') {
|
|||
|
$amount = preg_replace('/\s+/U', '', $c->Commission);
|
|||
|
fputcsv($fp, ['', $c->Date, 'Commission PayPal sur transaction', '', '', $amount, '', $ref, $notes]);
|
|||
|
}
|
|||
|
|
|||
|
$amount = preg_replace('/[\s ]+/U', '', $c->{'Avant commission'});
|
|||
|
fputcsv($fp, ['', $c->Date, $label, '', '', $amount, '', $ref, $notes]);
|
|||
|
}
|
|||
|
|
|||
|
fclose($fp);
|