Overview
SHA1:b65094375d3dd926179bffd22d5e5c1f2b9d3324
Date: 2013-06-08 07:54:56
User: bohwaz
Comment:Progression sur le report à nouveau, et suppression du doublon de la méthode doReports
Timelines: family | ancestors | descendants | both | trunk
Downloads: Tarball | ZIP archive
Other Links: files | file ages | folders | manifest
Tags And Properties
Context
2013-06-08
08:03
[b8157e5819] Correction bug [edda38ee74] (user: bohwaz, tags: trunk)
07:54
[b65094375d] Progression sur le report à nouveau, et suppression du doublon de la méthode doReports (user: bohwaz, tags: trunk)
2013-05-24
10:02
[ff7d019472] Merge corrections branche stable (user: bohwaz, tags: trunk)
Changes

Modified include/class.compta_exercices.php from [33ec667eb6] to [c15898ea4d].

87
88
89
90
91
92
93

94







95
96
97

98
99
100
101
102
103
104
105
106

107
108
109
110
111
112
113
114
115
116
...
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145

146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
...
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292

        // Clôture de l'exercice
        $db->simpleUpdate('compta_exercices', array(
            'cloture'   =>  1,
            'fin'       =>  $end,
        ), 'id = \''.(int)$id.'\'');


        $new_begin = utils::modifyDate($end, '+1 day');







        $last = $db->simpleQuerySingle('SELECT date FROM compta_journal WHERE id_exercice = ? AND date >= ? ORDER BY date DESC LIMIT 1;', false, $id, $new_begin);        
        $new_end = $last ?: utils::modifyDate($new_begin, '+1 year');


        $new_id = $this->add(array(
            'debut'     =>  $new_begin,
            'fin'       =>  $new_end,
            'libelle'   =>  'Nouvel exercice'
            )
        );

        if ($last)
        {

            $db->simpleExec('UPDATE compta_journal SET id_exercice = ? WHERE id_exercice = ? AND date >= ?;',
                $new_id, $id, $new_begin);
        }

        $db->exec('END;');

        return $new_id;
    }

    /**
................................................................................
        $statement = $db->simpleStatement('SELECT id, 
            COALESCE((SELECT SUM(montant) FROM compta_journal WHERE compte_debit = compte AND id_exercice = :id), 0) AS debit,
            COALESCE((SELECT SUM(montant) FROM compta_journal WHERE compte_credit = compte AND id_exercice = :id), 0) AS credit,
            CASE WHEN position & ' . Compta_Comptes::ACTIF . ' THEN debit - credit ELSE credit - debit END AS solde
            FROM compta_comptes 
            LEFT JOIN compta_journal ON compta_comptes.id = compta_journal.compte_debit 
                OR compta_comptes.id = compta_journal.compte_credit
            WHERE solde != 0 AND id NOT LIKE \'6%\' AND id NOT LIKE \'7%\';', array('id' => $old_id));

        while ($row = $statement->fetchArray(SQLITE3_ASSOC))
        {
            // Chaque solde de compte est reporté dans le nouvel exercice
            $journal->add(array(
                'libelle'       =>  'Report à nouveau',
                'date'          =>  $date,
                'montant'       =>  abs($solde),

                'compte_debit'  =>  ($solde < 0 ? $report_crediteur : $row['compte']), // FIXME
                'compte_credit' =>  ($solde > 0 ? $report_debiteur : $row['compte']), // FIXME
                'remarques'     =>  'Report à nouveau créé automatiquement à la clôture de l\'exercice précédent',
            ));
        }

        // Date de début du nouvel exercice : lendemain de la clôture du précédent exercice
        $new_begin = utils::modifyDate($end, '+1 day');

        // Date de fin du nouvel exercice : un an après l'ouverture
        $new_end = utils::modifyDate($new_begin, '+1 year');

        // Enfin sauf s'il existe déjà des opérations après cette date, auquel cas la date de fin
        // est fixée à la date de la dernière opération, ceci pour ne pas avoir d'opération
        // orpheline d'exercice
        $last = $db->simpleQuerySingle('SELECT date FROM compta_journal WHERE id_exercice = ? AND date >= ? ORDER BY date DESC LIMIT 1;', false, $id, $new_end);
        $new_end = $last ?: $new_end;

        // Création du nouvel exercice
        $new_id = $this->add(array(
            'debut'     =>  $new_begin,
            'fin'       =>  $new_end,
            'libelle'   =>  'Nouvel exercice'
            )
        );

        // Ré-attribution des opérations de l'exercice à clôturer qui ne sont pas dans son
        // intervale au nouvel exercice
        $db->simpleExec('UPDATE compta_journal SET id_exercice = ? WHERE id_exercice = ? AND date >= ?;',
            $new_id, $id, $new_begin);

        // Solder tous les comptes de charges et de produits (production du résultat)
        $this->solderResultat($id);

        $db->exec('END;');

        return $new_id;
    }

    /**
     * Solder les comptes de charge et de produits et les transférer au compte de résultat
     * @param  integer  $exercice   ID de l'exercice à solder
     * @return boolean              true en cas de succès
     */
    public function solderResultat($exercice)
    {
        $db = DB::getInstance();

................................................................................
            {
                continue;
            }

            // Enregistrement du résultat
            $journal = new Compta_Journal;
            $journal->add(array(
                'libelle'   =>  'Soldage de compte',
                'date'      =>  $end,
                'montant'   =>  abs($solde),
                'compte_debit'  =>  $debit,
                'compte_credit' =>  $credit,
            ));
        }

        $res->finalize();


    }

    /**
     * Créer les reports à nouveau issus de l'exercice $old_id dans le nouvel exercice courant
     * @param  integer $old_id  ID de l'ancien exercice
     * @param  string  $date    Date Y-m-d donnée aux opérations créées
     * @return boolean          true si succès
     */
    public function doReports($old_id, $date)
    {
        $db = DB::getInstance();

        $report_crediteur = 110;
        $report_debiteur  = 119;

        // Récupérer chacun des comptes de bilan et leurs soldes
        $statement = $db->simpleStatement('SELECT id, 
            COALESCE((SELECT SUM(montant) FROM compta_journal WHERE compte_debit = compte AND id_exercice = :id), 0) AS debit,
            COALESCE((SELECT SUM(montant) FROM compta_journal WHERE compte_credit = compte AND id_exercice = :id), 0) AS credit,
            CASE WHEN position & ' . Compta_Comptes::ACTIF . ' THEN debit - credit ELSE credit - debit END AS solde
            FROM compta_comptes 
            LEFT JOIN compta_journal ON compta_comptes.id = compta_journal.compte_debit 
                OR compta_comptes.id = compta_journal.compte_credit
            WHERE solde != 0 AND id NOT LIKE \'6%\' AND id NOT LIKE \'7%\';', array('id' => $old_id));

        while ($row = $statement->fetchArray(SQLITE3_ASSOC))
        {
            // Chaque solde de compte est reporté dans le nouvel exercice
            $journal->add(array(
                'libelle'       =>  'Report à nouveau',
                'date'          =>  $date,
                'montant'       =>  abs($solde),
                'compte_debit'  =>  ($solde < 0 ? $report_crediteur : $row['compte']), // FIXME
                'compte_credit' =>  ($solde > 0 ? $report_debiteur : $row['compte']), // FIXME
                'remarques'     =>  'Report à nouveau créé automatiquement à la clôture de l\'exercice précédent',
            ));
        }

        return true;
    }

    public function delete($id)
    {
        $db = DB::getInstance();

        // Ne pas supprimer un compte qui est utilisé !
        if ($db->simpleQuerySingle('SELECT 1 FROM compta_journal WHERE id_exercice = ? LIMIT 1;', false, $id))
        {







>

>
>
>
>
>
>
>
|
|

>







|
<
>
|
|
<







 







|








>
|
|




<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<









|







 







|








|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114

115
116
117

118
119
120
121
122
123
124
...
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160

























161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
...
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228









































229
230
231
232
233
234
235

        // Clôture de l'exercice
        $db->simpleUpdate('compta_exercices', array(
            'cloture'   =>  1,
            'fin'       =>  $end,
        ), 'id = \''.(int)$id.'\'');

        // Date de début du nouvel exercice : lendemain de la clôture du précédent exercice
        $new_begin = utils::modifyDate($end, '+1 day');

        // Date de fin du nouvel exercice : un an après l'ouverture
        $new_end = utils::modifyDate($new_begin, '+1 year');

        // Enfin sauf s'il existe déjà des opérations après cette date, auquel cas la date de fin
        // est fixée à la date de la dernière opération, ceci pour ne pas avoir d'opération
        // orpheline d'exercice
        $last = $db->simpleQuerySingle('SELECT date FROM compta_journal WHERE id_exercice = ? AND date >= ? ORDER BY date DESC LIMIT 1;', false, $id, $new_end);
        $new_end = $last ?: $new_end;

        // Création du nouvel exercice
        $new_id = $this->add(array(
            'debut'     =>  $new_begin,
            'fin'       =>  $new_end,
            'libelle'   =>  'Nouvel exercice'
            )
        );

        // Ré-attribution des opérations de l'exercice à clôturer qui ne sont pas dans son

        // intervale au nouvel exercice
        $db->simpleExec('UPDATE compta_journal SET id_exercice = ? WHERE id_exercice = ? AND date >= ?;',
            $new_id, $id, $new_begin);


        $db->exec('END;');

        return $new_id;
    }

    /**
................................................................................
        $statement = $db->simpleStatement('SELECT id, 
            COALESCE((SELECT SUM(montant) FROM compta_journal WHERE compte_debit = compte AND id_exercice = :id), 0) AS debit,
            COALESCE((SELECT SUM(montant) FROM compta_journal WHERE compte_credit = compte AND id_exercice = :id), 0) AS credit,
            CASE WHEN position & ' . Compta_Comptes::ACTIF . ' THEN debit - credit ELSE credit - debit END AS solde
            FROM compta_comptes 
            LEFT JOIN compta_journal ON compta_comptes.id = compta_journal.compte_debit 
                OR compta_comptes.id = compta_journal.compte_credit
            WHERE id_exercice = :id AND solde != 0 AND substr(id, 0, 1) <= 5;', array('id' => $old_id));

        while ($row = $statement->fetchArray(SQLITE3_ASSOC))
        {
            // Chaque solde de compte est reporté dans le nouvel exercice
            $journal->add(array(
                'libelle'       =>  'Report à nouveau',
                'date'          =>  $date,
                'montant'       =>  abs($solde),
                // FIXME : de quel compte viens l'argent?!
                'compte_debit'  =>  ($solde < 0 ? $report_crediteur : $row['compte']),
                'compte_credit' =>  ($solde > 0 ? $report_debiteur : $row['compte']),
                'remarques'     =>  'Report à nouveau créé automatiquement à la clôture de l\'exercice précédent',
            ));
        }


























        // Solder tous les comptes de charges et de produits (production du résultat)
        $this->solderResultat($id);

        $db->exec('END;');

        return $new_id;
    }

    /**
     * Solder les comptes de charge et de produits puis les inscrire au résultat du n
     * @param  integer  $exercice   ID de l'exercice à solder
     * @return boolean              true en cas de succès
     */
    public function solderResultat($exercice)
    {
        $db = DB::getInstance();

................................................................................
            {
                continue;
            }

            // Enregistrement du résultat
            $journal = new Compta_Journal;
            $journal->add(array(
                'libelle'   =>  'Résultat de l\'exercice',
                'date'      =>  $end,
                'montant'   =>  abs($solde),
                'compte_debit'  =>  $debit,
                'compte_credit' =>  $credit,
            ));
        }

        $res->finalize();
    }
    









































    public function delete($id)
    {
        $db = DB::getInstance();

        // Ne pas supprimer un compte qui est utilisé !
        if ($db->simpleQuerySingle('SELECT 1 FROM compta_journal WHERE id_exercice = ? LIMIT 1;', false, $id))
        {