Je travaille sur un point de vente pour une quincaillerie développée avec le framework codeigniter.

Je veux créer un relevé de compte détaillé comme dans l'image ci-dessous

enter image description here

J'ai deux tableaux qui sont les ventes et le paiement, je veux obtenir des données de ces deux tableaux afin de pouvoir générer un relevé de compte d'un client spécifique.

Cela aidera puisque le client peut être en mesure de voir tous les articles qu'il / elle a achetés au comptant ou à crédit et également montrer combien il a payé groupé par date.

Il sera également possible de calculer le montant dû.

Je peux être en mesure de lister séparément (ventes et paiement) en utilisant le code ci-dessous et ainsi calculer le montant dû.

Ventes

<?php
$salestotal = 0;
if (is_array($sales) || is_object($sales))
{
foreach ($sales as $key=>$sale): {?>
  <tr>
    <td>
      <?php echo $sale->date; ?>
    </td>
    <td>
      <?php echo $sale->id; ?>
    </td>
    <td>
      <?php echo $sale->grand_total; ?>
    </td>
    <td>
      <?php echo $sale->paid; ?>
    </td>
    <td></td>
  </tr>
<?php
if(isset($sale->grand_total))
$salestotal += $sale->grand_total;
} endforeach ; }?>

Paiements

<?php
$paymentstotal = 0;
if (is_array($payments) || is_object($payments))
{
foreach ($payments as $key=>$payment): {?>
  <tr>
    <td>
      <?php echo $payment->date; ?>
    </td>
    <td class="text-center">
      <?php echo $payment->sale_id; ?>
    </td>
    <td class="text-center">
      <?php echo $payment->paid_by; ?>
    </td>
    <td class="text-center">
      <?php echo $payment->cheque_no; ?>
    </td>
    <td class="text-center">
      <?php echo $payment->amount; ?>
    </td>
    <td class="text-center">
      <?php echo $this->customers_model->getUserna($payment->created_by); ?>
    </td>
    <td class="text-center">
      <?php echo $payment->pos_paid; ?>
    </td>
    <td class="text-center">
      <?php echo $payment->pos_balance; ?>
    </td>
    <td class="text-right">
      <?php echo $this->customers_model->getStorename($payment->store_id); ?>
    </td>
  </tr>
  <?php
  if(isset($payment->amount))
     $paymentstotal += $payment->amount;
 } endforeach ;}?>

Mon contrôleur

function statement($id = NULL)
    {
        if (!$this->Admin) {
            $this->session->set_flashdata('error', $this->lang->line('access_denied'));
            redirect('pos');
        }
        if($this->input->get('id')) { $id = $this->input->get('id', TRUE); }
        $this->data['sales'] = $this->customers_model->getSales($id);
        $this->data['payments'] = $this->customers_model->getPayments($id);
        $this->data['customer'] = $this->customers_model->getCustomername($id);
        $this->data['customer_id'] = $id;
        $this->page_cons('customers/statement', $this->data);         
    }

Mon modele

public function getSales($id)
    {
        $q = $this->db->get_where('sales', array('customer_id' => $id));

        if( $q->num_rows() > 0 ) {
            return $q->result();
        } 
        return FALSE;
    }

    public function getPayments($id)
    {
        $q = $this->db->get_where('payments', array('customer_id' => $id));

        if( $q->num_rows() > 0 ) {
            return $q->result();
        } 
        return FALSE;
    }

Comment combiner ces deux tableaux?

J'espère être assez clair sur cette question, j'ai essayé de Google mais je n'ai pas de chance.

J'apprécierai toute aide. Merci

Éditer

Tables MYSQL

Ventes entrez la description de l'image ici

Paiements

enter image description here

5
kikuyu1 26 avril 2017 à 04:59

3 réponses

Meilleure réponse

Vous pouvez réutiliser les méthodes données getSales() et getPayments() dans une nouvelle méthode getSalesWithPayments() pour combiner les deux résultats:

public function getSalesWithPayments($customerId) {
    $sales = [];
    foreach ($this->getSales($customerId) as $sale) {
        $sale->payment = null;
        $sales[$sale->id] = $sale;
    }
    foreach ($this->getPayments($customerId) as $payment) {
        $sales[$payment->sale_id]->payment = $payment;
    }
    return $sales;
}

Dans la première boucle, vous initialisez $sale->payment (pour le cas où une vente n'a pas encore de paiement) et remplissez le tableau $sales, qui est indexé par la colonne id. De cette façon, vous pouvez facilement accéder à n'importe quelle vente par son identifiant sans une recherche coûteuse.

Dans la deuxième boucle, vous affectez les paiements aux ventes correspondantes.

Notez que vous devrez peut-être ajouter une logique pour gérer les résultats vides (ce qui ne serait pas nécessaire si vous renvoyiez simplement un tableau vide au lieu de FALSE).

Vous pouvez maintenant l'utiliser comme ..

Manette:

$this->data['sales'] = $this->customers_model->getSalesWithPayments($id);

Vue:

<?php foreach ($sales as $sale): ?>
  <tr>
    <td><?php echo $sale->date; ?></td>
    <td><?php echo $sale->id; ?></td>
    ...
    <?php if($sale->payment !== null): ?>
        <td><?php echo $sale->payment->date; ?></td>
        <td><?php echo $sale->payment->amount; ?></td>
        ...
    <?php else: // empty cells if no payment ?>
        <td></td>
        <td></td>
        ...
    <?php endif; ?>
  </tr>
<?php endforeach; ?>
1
Paul Spiegel 1 mai 2017 à 14:14

Essaye ça:

$this->db->select('*')
            ->from('sales')
            ->join('payments', 'payments.sales_id = sales.id', 'right')
            ->where(array('sales.customer_id' => $id));
$results = $this->db->get();
0
Bhaskar Jain 29 avril 2017 à 06:03

Si vous publiez les tableaux sales et payments, la réponse sera meilleure et exacte. Vous pouvez utiliser MySQL Join pour obtenir des données combinées à partir de 2 tables.

0
Bikram Pahi 27 avril 2017 à 19:19