2021-12-09 16:41:13 +00:00
< ? php
use CRM_Bij1migratie_ExtensionUtil as E ;
/**
* Verwerking van migratie
*/
class CRM_Bij1migratie_Migratie {
2022-02-07 10:07:30 +00:00
2021-12-09 16:41:13 +00:00
/**
* Method om data te migreren
*
* @ param string $migratieType
* @ param string $tableName
2022-02-07 10:07:30 +00:00
* @ throws
2021-12-09 16:41:13 +00:00
*/
public static function migreer ( string $migratieType , string $tableName ) {
set_time_limit ( 0 );
$table = new CRM_Bij1migratie_ImportTable ();
$data = $table -> getAllRows ( $migratieType , $tableName );
$migratieDatum = new DateTime ( 'now' );
if ( $data ) {
foreach ( $data as $rij ) {
if ( ! empty ( $rij )) {
2021-12-23 16:08:33 +00:00
switch ( $migratieType ) {
case " A " :
self :: migreerAirtable ( $migratieType , $migratieDatum , $rij );
break ;
case " B " :
self :: migreerBetaling ( $migratieType , $migratieDatum , $rij );
break ;
2022-02-07 10:07:30 +00:00
case " C " :
self :: migreerChargebacks ( $migratieType , $migratieDatum , $rij );
break ;
2021-12-23 16:08:33 +00:00
case " P " :
self :: migreerContact ( $migratieType , $migratieDatum , $rij );
break ;
}
}
}
}
}
2022-02-07 10:07:30 +00:00
/**
* Migreer chargebacks
*
* @ param string $migratieType
* @ param DateTime $migratieDatum
* @ param array $rij
* @ return void
* @ throws API_Exception
* @ throws \Civi\API\Exception\UnauthorizedException
*/
private static function migreerChargebacks ( string $migratieType , DateTime $migratieDatum , array $rij ) {
// eerst checken of volledige betaling teruggevorderd is, anders fout
$restant = $rij [ 'bedrag' ] - $rij [ 'chargeback_bedrag' ];
if ( $restant == 0 ) {
$chargeBack = new CRM_Bij1migratie_ChargeBack ();
// bijdrage vinden met transactie ID
$contributionId = $chargeBack -> haalContributionId ( $rij [ 'transactie_id' ]);
if ( $contributionId ) {
$chargeBack -> verwerk ( $contributionId , $rij );
}
else {
\Civi\Api4\MigratieLog :: create ()
-> addValue ( 'mollie_customer_id' , $rij [ 'mollie_customer_id' ])
-> addValue ( 'migratiedatum' , $migratieDatum -> format ( " y-m-d " ))
-> addValue ( 'type_migratie' , $migratieType )
-> addValue ( 'type_melding' , 'fout' )
-> addValue ( 'melding' , 'FOUT, geen bijdrage gevonden met transaction ID, verwerk handmatig: ' . json_encode ( $rij ))
-> execute ();
}
}
else {
\Civi\Api4\MigratieLog :: create ()
-> addValue ( 'mollie_customer_id' , $rij [ 'mollie_customer_id' ])
-> addValue ( 'migratiedatum' , $migratieDatum -> format ( " y-m-d " ))
-> addValue ( 'type_migratie' , $migratieType )
-> addValue ( 'type_melding' , 'fout' )
-> addValue ( 'melding' , 'FOUT, chargeback is niet het volledige bedrag van de oorspronkelijke betaling, verwerk handmatig: ' . json_encode ( $rij ))
-> execute ();
}
}
2021-12-23 16:08:33 +00:00
/**
* Method om betalingen te migreren
*
* @ param string $migratieType
* @ param DateTime $migratieDatum
* @ param array $rij
* @ throws API_Exception
* @ throws \Civi\API\Exception\UnauthorizedException
*/
private static function migreerBetaling ( string $migratieType , DateTime $migratieDatum , array $rij ) {
$mollieCustomerId = NULL ;
$email = NULL ;
2022-02-07 10:07:30 +00:00
$geldig = [ " expired " , " failed " , " paid " , " pending " ];
// alleen als status geldig
if ( in_array ( $rij [ 'status' ], $geldig )) {
2021-12-23 16:08:33 +00:00
if ( isset ( $rij [ 'mollie_customer_id' ]) && ! empty ( $rij [ 'mollie_customer_id' ])) {
$mollieCustomerId = trim ( $rij [ 'mollie_customer_id' ]);
}
if ( isset ( $rij [ 'email' ]) && ! empty ( $rij [ 'email' ])) {
$email = $rij [ 'email' ];
}
if ( $mollieCustomerId || $email ) {
$contact = new CRM_Bij1migratie_Contact ();
$contactId = $contact -> haalContactIdMetMollieCustomerId ( $rij [ 'mollie_customer_id' ]);
if ( ! $contactId && isset ( $rij [ 'email' ]) && ! empty ( $rij [ 'email' ])) {
$contactId = $contact -> haalContactIdMetEmail ( $rij [ 'email' ]);
}
if ( $contactId ) {
2022-02-07 10:07:30 +00:00
$rij [ 'status' ] = Civi :: service ( 'bij1Migratie' ) -> haalBijdrageStatusId ( $rij [ 'status' ]);
2022-01-24 07:56:10 +00:00
$rij [ 'financial_type_id' ] = Civi :: service ( 'bij1Migratie' ) -> haalFinancieelType ( $rij );
2021-12-23 16:08:33 +00:00
if ( ! self :: bestaatBetaling ( $contactId , $rij )) {
try {
$bijdrage = \Civi\Api4\Contribution :: create ()
-> addValue ( 'contact_id' , $contactId )
2022-01-24 07:56:10 +00:00
-> addValue ( 'financial_type_id' , $rij [ 'financial_type_id' ])
2021-12-27 13:18:40 +00:00
-> addValue ( 'payment_instrument_id' , $rij [ 'betalingsinstrument' ])
2021-12-23 16:08:33 +00:00
-> addValue ( 'receive_date' , $rij [ 'aanmaakdatum' ])
-> addValue ( 'total_amount' , $rij [ 'bedrag' ])
-> addValue ( 'contribution_status_id' , $rij [ 'status' ])
-> addValue ( 'trxn_id' , $rij [ 'transactie_id' ])
-> addValue ( 'mollie_betaling_data.mandaat_id' , $rij [ 'mandaat' ])
-> addValue ( 'mollie_betaling_data.klantnaam' , $rij [ 'klant' ])
-> addValue ( 'mollie_betaling_data.klantemail' , $rij [ 'email' ]);
2021-12-27 13:18:40 +00:00
if ( isset ( $rij [ 'omschrijving' ]) && ! empty ( $rij [ 'omschrijving' ])) {
$bijdrage -> addValue ( 'source' , $rij [ 'omschrijving' ]);
}
2021-12-23 16:08:33 +00:00
if ( isset ( $rij [ 'betalingsdatum' ])) {
$bijdrage -> addValue ( 'receipt_date' , $rij [ 'betalingsdatum' ]);
}
$bijdrage -> execute ();
} catch ( API_Exception $ex ) {
\Civi\Api4\MigratieLog :: create ()
-> addValue ( 'mollie_customer_id' , $rij [ 'mollie_customer_id' ])
-> addValue ( 'migratiedatum' , $migratieDatum -> format ( " y-m-d " ))
-> addValue ( 'type_migratie' , $migratieType )
-> addValue ( 'type_melding' , 'fout' )
-> addValue ( 'melding' , 'FOUT, melding van API4 Contribution Create: ' . $ex -> getMessage ())
-> execute ();
2021-12-09 16:41:13 +00:00
}
}
2021-12-23 16:08:33 +00:00
else {
2022-02-07 11:14:11 +00:00
// als het om mislukte gaat, bijwerken
self :: bijwerkenBetaling ( $contactId , $rij , $migratieDatum , $migratieType );
2021-12-09 16:41:13 +00:00
}
}
2021-12-23 16:08:33 +00:00
else {
\Civi\Api4\MigratieLog :: create ()
-> addValue ( 'mollie_customer_id' , $rij [ 'mollie_customer_id' ])
-> addValue ( 'migratiedatum' , $migratieDatum -> format ( " y-m-d " ))
-> addValue ( 'type_migratie' , $migratieType )
-> addValue ( 'type_melding' , 'fout' )
-> addValue ( 'melding' , 'FOUT, geen contact gevonden met mollie customer id: ' . $rij [ 'mollie_customer_id' ] . ' of met email: ' . $rij [ 'email' ])
-> execute ();
}
}
else {
\Civi\Api4\MigratieLog :: create ()
-> addValue ( 'mollie_customer_id' , $rij [ 'mollie_customer_id' ])
-> addValue ( 'migratiedatum' , $migratieDatum -> format ( " y-m-d " ))
-> addValue ( 'type_migratie' , $migratieType )
-> addValue ( 'type_melding' , 'fout' )
-> addValue ( 'melding' , 'FOUT, geen mollie customer id of email gevonden in data: ' . json_encode ( $rij ))
-> execute ();
2021-12-09 16:41:13 +00:00
}
}
}
2022-02-07 11:14:11 +00:00
public static function bijwerkenBetaling ( int $contactId , array $rij , DateTime $migratieDatum , string $migratieType ) {
$receiveDate = new DateTime ( $rij [ 'aanmaakdatum' ]);
if ( $rij [ 'status' ] == Civi :: service ( 'bij1Migratie' ) -> getOverdueContributionStatusId () || $rij [ 'status' ] == Civi :: service ( 'bij1Migratie' ) -> getFailedContributionStatusId ()) {
try {
\Civi\Api4\Contribution :: update ()
-> addValue ( 'contribution_status' , $rij [ 'status' ])
-> addWhere ( 'contact_id' , '=' , $contactId )
-> addWhere ( 'receive_date' , '=' , $receiveDate -> format ( " Y-md-d " ))
-> addWhere ( 'total_amount' , '=' , $rij [ 'bedrag' ])
-> addWhere ( 'contribution_status_id' , '=' , Civi :: service ( 'bij1Migratie' ) -> getCompletedContributionStatusId (),)
-> execute ();
}
catch ( API_Exception $ex ) {
}
$update = " UPDATE civicrm_contribution SET contribution_status_id = %1 WHERE contact_id = %2 AND receive_date = %3 AND total_amount = %4 AND contribution_status_id = %5 " ;
$updateParams = [
1 => [ $rij [ 'status' ], " Integer " ],
2 => [ $contactId , " Integer " ],
3 => [ $receiveDate -> format ( " Y-m-d " ), " String " ],
4 => [ $rij [ 'bedrag' ], " String " ],
5 => [ Civi :: service ( 'bij1Migratie' ) -> getCompletedContributionStatusId (), " Integer " ],
];
CRM_Core_DAO :: executeQuery ( $update , $updateParams );
}
else {
\Civi\Api4\MigratieLog :: create ()
-> addValue ( 'mollie_customer_id' , $rij [ 'mollie_customer_id' ])
-> addValue ( 'migratiedatum' , $migratieDatum -> format ( " y-m-d " ))
-> addValue ( 'type_migratie' , $migratieType )
-> addValue ( 'type_melding' , 'waarschuwing' )
-> addValue ( 'melding' , 'Waarschuwing, betaling bestaat al dus niet gemigreerd, data: ' . json_encode ( $rij ))
-> execute ();
}
}
2021-12-09 16:41:13 +00:00
2021-12-22 15:53:48 +00:00
/**
2021-12-23 16:08:33 +00:00
* Method om contact te migreren
2021-12-22 15:53:48 +00:00
*
2021-12-23 16:08:33 +00:00
* @ param string $migratieType
* @ param DateTime $migratieDatum
* @ param $rij
* @ throws API_Exception
2021-12-22 15:53:48 +00:00
*/
2021-12-23 16:08:33 +00:00
private static function migreerContact ( string $migratieType , DateTime $migratieDatum , $rij ) {
$rij [ 'locatietype' ] = Civi :: service ( 'bij1Algemeen' ) -> getDefaultLocationTypeId ();
try {
civicrm_api3 ( 'FormProcessor' , 'bij1_contacten_migratie' , $rij );
\Civi\Api4\MigratieLog :: create ()
-> addValue ( 'mollie_customer_id' , $rij [ 'mollie_customer_id' ])
-> addValue ( 'migratiedatum' , $migratieDatum -> format ( " y-m-d " ))
-> addValue ( 'type_migratie' , $migratieType )
-> addValue ( 'type_melding' , 'succes' )
-> addValue ( 'melding' , 'Gemigreerd' )
-> execute ();
}
catch ( CiviCRM_API3_Exception $ex ) {
\Civi\Api4\MigratieLog :: create ()
-> addValue ( 'mollie_customer_id' , $rij [ 'mollie_customer_id' ])
-> addValue ( 'migratiedatum' , $migratieDatum -> format ( " y-m-d " ))
-> addValue ( 'type_migratie' , $migratieType )
-> addValue ( 'type_melding' , 'fout' )
-> addValue ( 'melding' , 'FOUT, melding van FormProcessor bij1_contacten_migratie API call: ' . $ex -> getMessage ())
-> execute ();
}
}
/**
* Method voor migratie airtable
*
* @ param string $migratieType
* @ param DateTime $migratieDatum
* @ param array $rij
* @ throws API_Exception
*/
private static function migreerAirtable ( string $migratieType , DateTime $migratieDatum , array $rij ) {
$contact = new CRM_Bij1migratie_Contact ();
$rij [ 'locatietype' ] = Civi :: service ( 'bij1Algemeen' ) -> getDefaultLocationTypeId ();
// eerst beoordelen of het contact gevonden kan worden met Mollie Customer Id
$contactId = $contact -> haalContactIdMetMollieCustomerId ( $rij [ 'mollie_customer_id' ]);
// als niks gevonden gebruik Form Processor om contact te vinden of te maken
if ( ! $contactId ) {
$contactId = $contact -> haalOfMaak ( $rij , $migratieDatum );
}
if ( $contactId ) {
$rij [ 'contact_id' ] = $contactId ;
// verwerk de rest (email, adres, telefoon, notities, groepen, lidnummer, inschrijfdatum via Form Processor
try {
civicrm_api3 ( 'FormProcessor' , 'bij1_airtable_migratie' , $rij );
// voeg bankrekening toe indien van toepassing
if ( isset ( $rij [ 'iban' ]) && ! empty ( $rij [ 'iban' ])) {
self :: maakBankrekening ( $migratieDatum , $contactId , $rij [ 'iban' ]);
}
2021-12-22 15:53:48 +00:00
}
2021-12-23 16:08:33 +00:00
catch ( CiviCRM_API3_Exception $ex ) {
\Civi\Api4\MigratieLog :: create ()
-> addValue ( 'mollie_customer_id' , $rij [ 'mollie_customer_id' ])
-> addValue ( 'migratiedatum' , $migratieDatum -> format ( " y-m-d " ))
-> addValue ( 'type_migratie' , $migratieType )
-> addValue ( 'type_melding' , 'fout' )
-> addValue ( 'melding' , 'FOUT, melding van FormProcessor bij1_airtable_migratie API call: ' . $ex -> getMessage ())
-> execute ();
}
2021-12-22 15:53:48 +00:00
}
}
2021-12-09 16:41:13 +00:00
/**
* Method om te beoordelen of gift al bestaat voor contact
*
2021-12-23 16:08:33 +00:00
* @ param int $contactId
* @ param array $betaling
2021-12-09 16:41:13 +00:00
* @ return bool
* @ throws Exception
*/
2021-12-23 16:08:33 +00:00
public static function bestaatBetaling ( int $contactId , array $betaling ) {
$verplichten = [ " bedrag " , " aanmaakdatum " ];
2021-12-09 16:41:13 +00:00
foreach ( $verplichten as $verplicht ) {
2021-12-23 16:08:33 +00:00
if ( ! isset ( $betaling [ $verplicht ]) || empty ( $betaling [ $verplicht ])) {
2021-12-09 16:41:13 +00:00
return FALSE ;
}
2021-12-23 16:08:33 +00:00
$receiveDate = new DateTime ( $betaling [ 'aanmaakdatum' ]);
2021-12-09 16:41:13 +00:00
$query = " SELECT COUNT(*) FROM civicrm_contribution WHERE contact_id = %1 AND receive_date = %2 AND total_amount = %3 " ;
$count = CRM_Core_DAO :: singleValueQuery ( $query , [
2021-12-23 16:08:33 +00:00
1 => [ $contactId , " Integer " ],
2021-12-09 16:41:13 +00:00
2 => [ $receiveDate -> format ( " Y-m-d " ), " String " ],
2021-12-23 16:08:33 +00:00
3 => [ $betaling [ 'bedrag' ], " String " ],
2021-12-09 16:41:13 +00:00
]);
if ( $count > 0 ) {
return TRUE ;
}
}
return FALSE ;
}
/**
* Method om te bepalen of de persoon al bestaat
*
* @ param int $ssaskiaNummer
* @ return bool
*/
public static function bestaatPersoon ( int $ssaskiaNummer ) {
$query = " SELECT COUNT(*) FROM civicrm_value_pax_contact_data WHERE ssaskia_nummer = %1 " ;
$count = CRM_Core_DAO :: singleValueQuery ( $query , [ 1 => [ $ssaskiaNummer , " Integer " ]]);
if ( $count > 0 ) {
return TRUE ;
}
return FALSE ;
}
/**
* Method om migratie groep aan te maken
*/
public function maakMigratieGroepen () {
$query = " SELECT COUNT(*) FROM civicrm_group WHERE name = %1 " ;
$count = CRM_Core_DAO :: singleValueQuery ( $query , [ 1 => [ " pax_migratie_groep " , " String " ]]);
if ( $count == 0 ) {
try {
\Civi\Api4\Group :: create ()
-> addValue ( 'name' , 'pax_migratie_groep' )
-> addValue ( 'title' , 'CiviCRM Migratie' )
-> addValue ( 'description' , 'Groep met personen en organisaties die tijdens de migratie aangemaakt werden' )
-> addValue ( 'is_active' , TRUE )
-> addValue ( 'is_reserved' , TRUE )
-> execute ();
}
catch ( API_Exception $ex ) {
Civi :: log () -> error ( E :: ts ( " Kon geen groep voor migratie aanmaken, fout van API4 Group create: " ) . $ex -> getMessage ());
}
}
$count = CRM_Core_DAO :: singleValueQuery ( $query , [ 1 => [ " pax_dm_mag " , " String " ]]);
if ( $count == 0 ) {
try {
\Civi\Api4\Group :: create ()
-> addValue ( 'name' , 'pax_dm_mag' )
-> addValue ( 'title' , 'DM Mag' )
-> addValue ( 'description' , 'Groep van personen die in sSaskia de vlag DM mag aan hadden staan' )
-> addValue ( 'is_active' , TRUE )
-> addValue ( 'is_reserved' , TRUE )
-> execute ();
}
catch ( API_Exception $ex ) {
Civi :: log () -> error ( E :: ts ( " Kon geen groep voor dm mag aanmaken, fout van API4 Group create: " ) . $ex -> getMessage ());
}
}
$count = CRM_Core_DAO :: singleValueQuery ( $query , [ 1 => [ " pax_post_mag " , " String " ]]);
if ( $count == 0 ) {
try {
\Civi\Api4\Group :: create ()
-> addValue ( 'name' , 'pax_post_mag' )
-> addValue ( 'title' , 'Post Mag' )
-> addValue ( 'description' , 'Groep van personen die in sSaskia de vlag post mag aan hadden staan' )
-> addValue ( 'is_active' , TRUE )
-> addValue ( 'is_reserved' , TRUE )
-> execute ();
}
catch ( API_Exception $ex ) {
Civi :: log () -> error ( E :: ts ( " Kon geen groep voor post mag aanmaken, fout van API4 Group create: " ) . $ex -> getMessage ());
}
}
}
/**
* Method om bankrekening toe te voegen
*
* @ param DateTime $migratieDatum
2021-12-22 15:53:48 +00:00
* @ param int $contactId
* @ param string $iban
2021-12-09 16:41:13 +00:00
* @ throws API_Exception
*/
2021-12-22 15:53:48 +00:00
public static function maakBankrekening ( DateTime $migratieDatum , int $contactId , string $iban ) {
if ( ! empty ( $iban ) && ! empty ( $contactId )) {
$iban = trim ( $iban );
2021-12-09 16:41:13 +00:00
// alleen als rekeningnummer nog niet bestaat voor de donor
if ( ! self :: bestaatBankrekening ( $contactId , $iban )) {
try {
$rekening = civicrm_api3 ( 'BankingAccount' , 'create' , [
'contact_id' => $contactId ,
2021-12-22 15:53:48 +00:00
'description' => 'rekening vanuit migratie airtable' ,
2021-12-09 16:41:13 +00:00
'created_date' => date ( 'YmdHis' ),
'data_raw' => '{}' ,
]);
// add a reference
civicrm_api3 ( 'BankingAccountReference' , 'create' , [
2021-12-22 15:53:48 +00:00
'reference' => $iban ,
'reference_type_id' => Civi :: service ( 'bij1Algemeen' ) -> getIbanAccountReference (),
2021-12-09 16:41:13 +00:00
'ba_id' => $rekening [ 'id' ],
]);
} catch ( CiviCRM_API3_Exception $ex ) {
\Civi\Api4\MigratieLog :: create ()
2021-12-22 15:53:48 +00:00
-> addValue ( 'mollie_customer_id' , $contactId )
2021-12-09 16:41:13 +00:00
-> addValue ( 'migratiedatum' , $migratieDatum -> format ( " y-m-d " ))
2021-12-22 15:53:48 +00:00
-> addValue ( 'type_migratie' , 'A' )
-> addValue ( 'type_melding' , 'fout' )
-> addValue ( 'melding' , 'FOUT, geen bankrekening aan kunnen maken voor contact ID ' . $contactId . ' met IBAN ' . $iban )
2021-12-09 16:41:13 +00:00
-> execute ();
}
}
}
}
/**
* Method om te bekijken of het rekening nummer al bestaat voor het contact
*
* @ param int $contactId
* @ param string $rekening
* @ return bool
*/
public static function bestaatBankrekening ( int $contactId , string $rekening ) {
$query = " SELECT COUNT(*)
FROM civicrm_bank_account cba
JOIN civicrm_bank_account_reference cbar ON cba . id = cbar . ba_id
WHERE cba . contact_id = % 1 AND cbar . reference = % 2 " ;
$count = CRM_Core_DAO :: singleValueQuery ( $query , [
1 => [ $contactId , " Integer " ],
2 => [ $rekening , " String " ],
]);
if ( $count > 0 ) {
return TRUE ;
}
return FALSE ;
}
}