2014-11-18 22:04:16 -02:00

481 lines
18 KiB
PHP

<?php
// Big Payment Mess #4055
class Controller_Api_Script_CheckPaidOrdersNShifts extends Crunchbutton_Controller_RestAccount {
const DATE_START = '20141105';
const DATE_END = '20141107';
const NOTES = 'Order payment fix';
public function init() {
// $this->markOrdersAsPaid();
$this->markShiftsAsPaid();
// $this->orders();
// $this->shifts();
}
public function markShiftsAsPaid(){
$out = [ 'ok' => [], 'nope' => [] ];
$settlement = new Crunchbutton_Settlement;
$query = 'SELECT DISTINCT( asa.id_admin ) AS id_admin, a.name, apt.using_pex FROM admin_shift_assign asa
INNER JOIN community_shift cs ON cs.id_community_shift = asa.id_community_shift
INNER JOIN admin a ON a.id_admin = asa.id_admin
INNER JOIN admin_payment_type apt ON apt.id_admin = asa.id_admin
WHERE
DATE_FORMAT( cs.date_start, "%Y%m%d" ) >= "' . Controller_Api_Script_CheckPaidOrdersNShifts::DATE_START . '"
AND
DATE_FORMAT( cs.date_end, "%Y%m%d" ) <= "' . Controller_Api_Script_CheckPaidOrdersNShifts::DATE_END . '"
AND
asa.id_admin_shift_assign NOT IN ( SELECT id_admin_shift_assign FROM payment_schedule_shift pss )
AND
apt.payment_type = "hours"';
$assigned_shifts = Crunchbutton_Admin_Shift_Assign::q( $query );
$pay = [];
foreach( $assigned_shifts as $shift ){
$pay[ $shift->id_admin ] = [ 'subtotal' => 0, 'tax' => 0, 'delivery_fee' => 0, 'tip' => 0, 'customer_fee' => 0, 'markup' => 0, 'credit_charge' => 0, 'restaurant_fee' => 0, 'gift_card' => 0, 'total_spent' => 0, 'orders' => [] ];
$pay[ $shift->id_admin ][ 'id_admin' ] = $shift->id_admin;
$pay[ $shift->id_admin ][ 'name' ] = $shift->name;
$pay[ $shift->id_admin ][ 'using_pex' ] = $shift->using_pex;
$pay[ $shift->id_admin ][ 'pay_type' ][ 'payment_type' ] = Crunchbutton_Admin_Payment_Type::PAYMENT_TYPE_HOURS;
}
foreach( $pay as $id_driver => $driver ){
$pay_type = Admin::o( $id_driver )->payment_type();
if( $pay_type->payment_type == Crunchbutton_Admin_Payment_Type::PAYMENT_TYPE_HOURS ){
$shifts = $settlement->workedShiftsByPeriod( $id_driver, [ 'start' => Controller_Api_Script_CheckPaidOrdersNShifts::DATE_START, 'end' => Controller_Api_Script_CheckPaidOrdersNShifts::DATE_END ] );
$worked_shifts = [];
$_hours = 0;
$pay[ $id_driver ][ 'salary_type' ] = Crunchbutton_Admin_Payment_Type::PAYMENT_TYPE_HOURS;
$pay[ $id_driver ][ 'shifts' ] = [ 'worked_total' => 0, 'amount' => 0, 'hour_rate' => $pay_type->hour_rate ];
foreach( $shifts as $shift ){
if( !Cockpit_Payment_Schedule_Shift::checkShiftWasPaidDriver( $shift->id_admin_shift_assign ) || $recalculatePaidOrders ){
$_shift = [];
$_shift[ 'id_community_shift' ] = $shift->id_community_shift;
$_shift[ 'id_admin_shift_assign' ] = $shift->id_admin_shift_assign;
$_shift[ 'period' ] = $shift->startEndToStringCommunityTz();
$_shift[ 'hours' ] = $shift->duration();
$_shift[ 'amount' ] = round( $shift->duration() * $pay_type->hour_rate, 2 );
$pay[ $id_driver ][ 'shifts' ][ 'worked_total' ]++;
$pay[ $id_driver ][ 'shifts' ][ 'amount' ] += round( $_shift[ 'amount' ], 2 );
$worked_shifts[] = $_shift;
$_hours += $_shift[ 'hours' ];
$schedule_shift = new Cockpit_Payment_Schedule_Shift;
$schedule_shift->id_payment_schedule = null;
$schedule_shift->id_admin_shift_assign = $_shift[ 'id_admin_shift_assign' ];
$schedule_shift->hours = $_shift[ 'hours' ];
$schedule_shift->amount = $_shift[ 'amount' ];
$schedule_shift->save();
// echo '<pre>';var_dump( $schedule_shift );exit();
}
}
$tip = 0;
foreach( $pay[ $id_driver ][ 'orders' ] as $id_order => $order ){
if( !$order[ 'driver_paid' ] || $recalculatePaidOrders ){
$tip += $order[ 'pay_info' ][ 'tip' ];
}
}
$pay[ $id_driver ][ 'hours' ] = $_hours;
$pay[ $id_driver ][ 'worked_hours' ] = $pay[ $id_driver ][ 'shifts' ][ 'amount' ];
$pay[ $id_driver ][ 'total_payment' ] = ( $pay[ $id_driver ][ 'shifts' ][ 'amount' ] + $tip + $pay[ $id_driver ][ 'markup' ] );
$pay[ $id_driver ][ 'shifts' ][ 'worked' ] = $worked_shifts;
} else {
$pay[ $id_driver ][ 'salary_type' ] = Crunchbutton_Admin_Payment_Type::PAYMENT_TYPE_ORDERS;
}
}
echo json_encode( $pay );exit();
}
public function markOrdersAsPaid(){
$out = [ 'ok' => [], 'nope' => [] ];
$settlement = new Crunchbutton_Settlement;
$query = 'SELECT * FROM `order` AS o WHERE DATE_FORMAT( o.date, "%Y%m%d" ) >= "' . Controller_Api_Script_CheckPaidOrdersNShifts::DATE_START . '" AND DATE_FORMAT( o.date, "%Y%m%d" ) <= "' . Controller_Api_Script_CheckPaidOrdersNShifts::DATE_END . '" AND o.delivery_service = 1 AND o.id_order NOT IN ( SELECT id_order FROM order_transaction WHERE type = "' . Crunchbutton_Order_Transaction::TYPE_PAID_TO_DRIVER . '" )';
$orders = Crunchbutton_Order::q( $query );
$payments = [];
foreach( $orders as $order ){
$driver = $order->getDeliveryDriver();
$schedule_order = Cockpit_Payment_Schedule_Order::q( 'SELECT * FROM payment_schedule_order WHERE id_order = ' . $order->id_order );
if( $schedule_order->id_payment_schedule ){
$payment_schedule = Cockpit_Payment_Schedule::o( $schedule_order->id_payment_schedule );
if( $payment_schedule->id_payment ){
$payments[ $driver->id_admin ] = $payment_schedule->id_payment;
}
}
}
foreach( $orders as $order ){
$driver = $order->getDeliveryDriver();
if( $driver->id_admin ){
if( !$out[ 'ok' ][ $driver->id_admin ] ){
$out[ 'ok' ][ $driver->id_admin ] = [ 'ok' => [], 'nope' => [] ];
}
$id_payment = false;
$schedule_order = Cockpit_Payment_Schedule_Order::q( 'SELECT * FROM payment_schedule_order WHERE id_order = ' . $order->id_order );
if( $schedule_order->id_payment_schedule ){
$payment_schedule = Cockpit_Payment_Schedule::o( $schedule_order->id_payment_schedule );
$total_payment = $schedule_order->amount;
if( $payment_schedule->id_payment ){
$id_payment = $payment_schedule->id_payment;
}
$out[ 'ok' ][ $driver->id_admin ][ 'ok' ][] = $order->id_order;
} else {
$variables = $settlement->orderExtractVariables( $order );
$pay_info = $settlement->driversProcess( [ $variables ], true, false, false );
$total_payment = $pay_info[0][ 'total_payment' ];
$out[ 'ok' ][ $driver->id_admin ][ 'nope' ][] = $order->id_order;
}
if( !$id_payment ){
$id_payment = $payments[ $driver->id_admin ];
}
$order_transaction = new Crunchbutton_Order_Transaction;
$order_transaction->id_order = $order->id_order;
$order_transaction->amt = $total_payment;
$order_transaction->date = date( 'Y-m-d H:i:s' );
$order_transaction->type = Crunchbutton_Order_Transaction::TYPE_PAID_TO_DRIVER;
$order_transaction->source = Crunchbutton_Order_Transaction::SOURCE_CRUNCHBUTTON;
$order_transaction->id_admin = 3;
$order_transaction->save();
if( $id_payment ){
$payment_order_transaction = new Cockpit_Payment_Order_Transaction;
$payment_order_transaction->id_payment = $id_payment;
$payment_order_transaction->id_order_transaction = $order_transaction->id_order_transaction;
$payment_order_transaction->save();
}
} else {
$out[ 'nope' ][] = $order->id_order;
}
}
echo json_encode( $out );exit();
}
public function shifts(){
$settlement = new Crunchbutton_Settlement;
$query = 'SELECT DISTINCT( asa.id_admin ) AS id_admin, a.name, apt.using_pex FROM admin_shift_assign asa
INNER JOIN community_shift cs ON cs.id_community_shift = asa.id_community_shift
INNER JOIN admin a ON a.id_admin = asa.id_admin
INNER JOIN admin_payment_type apt ON apt.id_admin = asa.id_admin
WHERE
DATE_FORMAT( cs.date_start, "%Y%m%d" ) >= "' . Controller_Api_Script_CheckPaidOrdersNShifts::DATE_START . '"
AND
DATE_FORMAT( cs.date_end, "%Y%m%d" ) <= "' . Controller_Api_Script_CheckPaidOrdersNShifts::DATE_END . '"
AND
asa.id_admin_shift_assign NOT IN ( SELECT id_admin_shift_assign FROM payment_schedule_shift pss )
AND
apt.payment_type = "hours"';
$assigned_shifts = Crunchbutton_Admin_Shift_Assign::q( $query );
$pay = [];
foreach( $assigned_shifts as $shift ){
$pay[ $shift->id_admin ] = [ 'subtotal' => 0, 'tax' => 0, 'delivery_fee' => 0, 'tip' => 0, 'customer_fee' => 0, 'markup' => 0, 'credit_charge' => 0, 'restaurant_fee' => 0, 'gift_card' => 0, 'total_spent' => 0, 'orders' => [] ];
$pay[ $shift->id_admin ][ 'id_admin' ] = $shift->id_admin;
$pay[ $shift->id_admin ][ 'name' ] = $shift->name;
$pay[ $shift->id_admin ][ 'using_pex' ] = $shift->using_pex;
$pay[ $shift->id_admin ][ 'pay_type' ][ 'payment_type' ] = Crunchbutton_Admin_Payment_Type::PAYMENT_TYPE_HOURS;
}
foreach( $pay as $id_driver => $driver ){
$pay_type = Admin::o( $id_driver )->payment_type();
if( $pay_type->payment_type == Crunchbutton_Admin_Payment_Type::PAYMENT_TYPE_HOURS ){
$shifts = $settlement->workedShiftsByPeriod( $id_driver, [ 'start' => Controller_Api_Script_CheckPaidOrdersNShifts::DATE_START, 'end' => Controller_Api_Script_CheckPaidOrdersNShifts::DATE_END ] );
$worked_shifts = [];
$_hours = 0;
$pay[ $id_driver ][ 'salary_type' ] = Crunchbutton_Admin_Payment_Type::PAYMENT_TYPE_HOURS;
$pay[ $id_driver ][ 'shifts' ] = [ 'worked_total' => 0, 'amount' => 0, 'hour_rate' => $pay_type->hour_rate ];
foreach( $shifts as $shift ){
if( !Cockpit_Payment_Schedule_Shift::checkShiftWasPaidDriver( $shift->id_admin_shift_assign ) || $recalculatePaidOrders ){
$_shift = [];
$_shift[ 'id_community_shift' ] = $shift->id_community_shift;
$_shift[ 'id_admin_shift_assign' ] = $shift->id_admin_shift_assign;
$_shift[ 'period' ] = $shift->startEndToStringCommunityTz();
$_shift[ 'hours' ] = $shift->duration();
$_shift[ 'amount' ] = round( $shift->duration() * $pay_type->hour_rate, 2 );
$pay[ $id_driver ][ 'shifts' ][ 'worked_total' ]++;
$pay[ $id_driver ][ 'shifts' ][ 'amount' ] += round( $_shift[ 'amount' ], 2 );
$worked_shifts[] = $_shift;
$_hours += $_shift[ 'hours' ];
}
}
$tip = 0;
foreach( $pay[ $id_driver ][ 'orders' ] as $id_order => $order ){
if( !$order[ 'driver_paid' ] || $recalculatePaidOrders ){
$tip += $order[ 'pay_info' ][ 'tip' ];
}
}
$pay[ $id_driver ][ 'hours' ] = $_hours;
$pay[ $id_driver ][ 'worked_hours' ] = $pay[ $id_driver ][ 'shifts' ][ 'amount' ];
$pay[ $id_driver ][ 'total_payment' ] = ( $pay[ $id_driver ][ 'shifts' ][ 'amount' ] + $tip + $pay[ $id_driver ][ 'markup' ] );
$pay[ $id_driver ][ 'shifts' ][ 'worked' ] = $worked_shifts;
} else {
$pay[ $id_driver ][ 'salary_type' ] = Crunchbutton_Admin_Payment_Type::PAYMENT_TYPE_ORDERS;
}
}
// echo json_encode( $pay );exit();
$separator = ';';
$new_line = "\n";
// if( false )
foreach( $pay as $driver ){
echo $driver[ 'id_admin' ];
echo $separator;
echo $driver[ 'name' ];
echo $separator;
echo max( $driver[ 'shifts' ][ 'worked_total' ], 0 );
echo $separator;
echo max( $driver[ 'hours' ], 0 );
echo $separator;
echo max( $driver[ 'shifts' ][ 'hour_rate' ], 0 );
echo $separator;
echo max( $driver[ 'shifts' ][ 'amount' ], 0 );
echo $new_line;
}
// if( false )
foreach( $pay as $driver ){
foreach( $driver[ 'shifts' ][ 'worked' ] as $shift ){
echo $driver[ 'id_admin' ];
echo $separator;
echo $driver[ 'name' ];
echo $separator;
echo $shift[ 'period' ][ 'start' ];
echo $separator;
echo $shift[ 'period' ][ 'end' ];
echo $separator;
echo $shift[ 'hours' ];
echo $separator;
echo $shift[ 'amount' ];
echo $new_line;
}
}
foreach( $pay as $driver ){
// $settlement->scheduleDriverPaymentTimeout( $driver, Controller_Api_Script_CheckPaidOrdersNShifts::NOTES, 0, 0, $driver[ 'id_admin' ], Cockpit_Payment_Schedule::PAY_TYPE_PAYMENT );
}
}
public function orders() {
$pay_type = Cockpit_Payment_Schedule::PAY_TYPE_REIMBURSEMENT; // Cockpit_Payment_Schedule::PAY_TYPE_PAYMENT
$query = 'SELECT * FROM `order` o
WHERE
DATE_FORMAT( o.date, "%Y%m%d" ) >= "' . Controller_Api_Script_CheckPaidOrdersNShifts::DATE_START . '"
AND
DATE_FORMAT( o.date, "%Y%m%d" ) <= "' . Controller_Api_Script_CheckPaidOrdersNShifts::DATE_END . '"
AND
o.delivery_service = 1
AND o.id_order NOT IN ( SELECT pso.id_order FROM payment_schedule_order pso
INNER JOIN payment_schedule ps
ON
ps.id_payment_schedule = pso.id_payment_schedule
AND
ps.pay_type = "' . $pay_type . '" )';
$_orders = Crunchbutton_Order::q( $query );
$settlement = new Crunchbutton_Settlement;
$orders = [];
foreach ( $_orders as $order ) {
$orders[] = $settlement->orderExtractVariables( $order );
}
$result = $settlement->driversProcess( $orders );
$out = [ 'drivers' => [] ];
$_total_payments = 0;
$_total_drivers = 0;
$_total_orders = 0;
foreach ( $result as $key => $val ) {
if( !$result[ $key ][ 'name' ] ){
continue;
}
$driver = $result[ $key ];
$driver[ 'orders' ] = [];
if( $pay_type == Cockpit_Payment_Schedule::PAY_TYPE_PAYMENT && $driver[ 'pay_type' ][ 'payment_type' ] != 'orders' ){
continue;
}
if( $result[ $key ][ 'orders' ] ){
foreach( $result[ $key ][ 'orders' ] as $order ){
if( $pay_type == Cockpit_Payment_Schedule::PAY_TYPE_REIMBURSEMENT ){
if( $order[ 'pay_info' ][ 'total_reimburse' ] <= 0 ){
continue;
}
} else {
if( $order[ 'pay_info' ][ 'total_payment' ] <= 0 ){
continue;
}
}
$_order = [];
$_order[ 'id_order' ] = $order[ 'id_order' ];
$_order[ 'name' ] = $order[ 'name' ];
$_order[ 'restaurant' ] = $order[ 'restaurant' ];
$_order[ 'pay_type' ] = ucfirst( $order[ 'pay_type' ] );
$_order[ 'total' ] = $order[ 'final_price_plus_delivery_markup' ];
$_order[ 'tip' ] = $order[ 'pay_info' ][ 'tip' ] ;
$_order[ 'delivery_fee' ] = $order[ 'pay_info' ][ 'delivery_fee' ] ;
$_order[ 'standard_reimburse' ] = $order[ 'pay_info' ][ 'standard_reimburse' ] ;
$_order[ 'total_reimburse' ] = $order[ 'pay_info' ][ 'total_reimburse' ] ;
$_order[ 'total_payment' ] = $order[ 'pay_info' ][ 'total_payment' ];
$_order[ 'date' ] = $order[ 'date' ];
$_order[ 'refunded' ] = $order[ 'refunded' ];
$_order[ 'included' ] = !$order[ 'do_not_pay_driver' ];
if( !$_order[ 'included' ] ){
$driver[ 'not_included' ]++;
}
$driver[ 'orders' ][] = $_order;
$_total_orders++;
}
}
if( $pay_type == Cockpit_Payment_Schedule::PAY_TYPE_REIMBURSEMENT ){
if( $driver[ 'total_reimburse' ] <= 0 ){
continue;
}
} else {
if( $driver[ 'total_payment' ] <= 0 ){
continue;
}
}
$_total_drivers++;
$driver[ 'total_payment_without_adjustment' ] = $driver[ 'total_payment' ];
$driver[ 'adjustment' ] = 0;
$driver[ 'adjustment_notes' ] = '';
$driver[ 'standard_reimburse' ] = ( $driver[ 'standard_reimburse' ] ? $driver[ 'standard_reimburse' ] : 0 );
$driver[ 'total_reimburse' ] = ( $driver[ 'total_reimburse' ] ? $driver[ 'total_reimburse' ] : 0 );
$driver[ 'total_payment' ] = ( $driver[ 'total_payment' ] ? $driver[ 'total_payment' ] : 0 );
$_total_payments += $driver[ 'total_payment' ];
$driver[ 'orders_count' ] = count( $driver[ 'orders' ] );
$out[ 'drivers' ][] = $driver;
// $settlement->scheduleDriverPaymentTimeout( $driver, Controller_Api_Script_CheckPaidOrdersNShifts::NOTES, 0, 0, $driver[ 'id_admin' ], $pay_type );
}
$separator = ';';
$new_line = "\n";
if( $pay_type == Cockpit_Payment_Schedule::PAY_TYPE_REIMBURSEMENT ){
if( false )
foreach( $out[ 'drivers' ] as $driver ){
echo $driver[ 'id_admin' ];
echo $separator;
echo $driver[ 'name' ];
echo $separator;
echo max( $driver[ 'orders_count' ], 0 );
echo $separator;
echo max( $driver[ 'total_reimburse' ], 0 );
echo $new_line;
}
if( false )
foreach( $out[ 'drivers' ] as $driver ){
foreach( $driver[ 'orders' ] as $order ){
echo $order[ 'id_order' ];
echo $separator;
echo $driver[ 'name' ];
echo $separator;
echo $order[ 'name' ];
echo $separator;
echo $order[ 'restaurant' ];
echo $separator;
echo $order[ 'pay_type' ];
echo $separator;
echo $order[ 'total_reimburse' ];
echo $separator;
echo ( $order[ 'refunded' ] ? 'Yes' : 'No' );
echo $new_line;
}
}
} else {
if( false )
foreach( $out[ 'drivers' ] as $driver ){
echo $driver[ 'id_admin' ];
echo $separator;
echo $driver[ 'name' ];
echo $separator;
echo max( $driver[ 'invites_total' ], 0 );
echo $separator;
echo min( $driver[ 'markup' ], 0 );
echo $separator;
echo max( $driver[ 'orders_count' ], 0 );
echo $separator;
echo max( $driver[ 'total_payment' ], 0 );
echo $new_line;
}
if( false )
foreach( $out[ 'drivers' ] as $driver ){
foreach( $driver[ 'orders' ] as $order ){
// echo json_encode( $order );exit();
echo $order[ 'id_order' ];
echo $separator;
echo $driver[ 'name' ];
echo $separator;
echo $order[ 'name' ];
echo $separator;
echo $order[ 'restaurant' ];
echo $separator;
echo $order[ 'pay_type' ];
echo $separator;
echo $order[ 'tip' ];
echo $separator;
echo $order[ 'delivery_fee' ];
echo $separator;
echo $order[ 'total_payment' ];
echo $separator;
echo ( $order[ 'refunded' ] ? 'Yes' : 'No' );
echo $new_line;
}
}
}
// echo '<pre>';var_dump( $_total_payments, $_total_drivers, $_total_orders );exit();
// echo json_encode( $out );exit();
}
}